diff --git a/frontend-sjgl/.editorconfig b/frontend-sjgl/.editorconfig new file mode 100644 index 00000000..3c3960b2 --- /dev/null +++ b/frontend-sjgl/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org + +root = true + +[*] # 表示所有文件适用 +charset = utf-8 # 设置文件字符集为 utf-8 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +trim_trailing_whitespace = true # 去除行首的任意空白字符 +insert_final_newline = true # 始终在文件末尾插入一个新行 + +[*.md] # 表示仅 md 文件适用以下规则 +max_line_length = off +trim_trailing_whitespace = false \ No newline at end of file diff --git a/frontend-sjgl/.env.development b/frontend-sjgl/.env.development new file mode 100644 index 00000000..baea33a7 --- /dev/null +++ b/frontend-sjgl/.env.development @@ -0,0 +1,22 @@ +## 开发环境 + +# 变量必须以 VITE_ 为前缀才能暴露给外部读取 +NODE_ENV='development' + +VITE_APP_TITLE = '全过程数据管理子系统' +VITE_APP_PORT = 5000 +VITE_APP_BASE_API = '/dev-api' +# 本地环境 +VITE_APP_BASE_URL = 'http://localhost:8093' +# 测试环境 +# VITE_APP_BASE_URL = 'http://172.16.21.142:8093' +# 汤伟 +VITE_APP_BASE_URL = 'http://10.84.111.235:8093' +# 李林 +# VITE_APP_BASE_URL = 'http://10.84.111.25:8093' + +## 开发环境 附件服务地址 +VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125' +# 地图服务地址 +VITE_APP_MAP_URL = 'https://211.99.26.225:18085' +# ?menu=systemManageMenu&page=disposeManage \ No newline at end of file diff --git a/frontend-sjgl/.env.production b/frontend-sjgl/.env.production new file mode 100644 index 00000000..7fefa529 --- /dev/null +++ b/frontend-sjgl/.env.production @@ -0,0 +1,14 @@ +## 生产环境 +NODE_ENV='production' + +VITE_APP_TITLE = 'qgc-buji-web' +VITE_APP_PORT = 5000 +VITE_APP_BASE_API = '/prod-api' +## 生产环境API地址 +VITE_APP_BASE_URL = 'http://localhost:8093' +## 生产环境导入预览地址 +VITE_APP_BASE_API_URL = 'https://211.99.26.225:12130/prod-api' +## 生产环境 附件服务地址 +VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125' +# 地图服务地址 +VITE_APP_MAP_URL = 'https://211.99.26.225:18085' \ No newline at end of file diff --git a/frontend-sjgl/.env.staging b/frontend-sjgl/.env.staging new file mode 100644 index 00000000..fb2c2786 --- /dev/null +++ b/frontend-sjgl/.env.staging @@ -0,0 +1,6 @@ +## 模拟环境 +NODE_ENV='staging' + +VITE_APP_TITLE = 'qgc-buji-web' +VITE_APP_PORT = 3000 +VITE_APP_BASE_API = '/prod--api' diff --git a/frontend-sjgl/.eslintignore b/frontend-sjgl/.eslintignore new file mode 100644 index 00000000..46d4b177 --- /dev/null +++ b/frontend-sjgl/.eslintignore @@ -0,0 +1,16 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +.eslintrc.js +prettier.config.js +src/assets \ No newline at end of file diff --git a/frontend-sjgl/.eslintrc.js b/frontend-sjgl/.eslintrc.js new file mode 100644 index 00000000..7819e1fc --- /dev/null +++ b/frontend-sjgl/.eslintrc.js @@ -0,0 +1,33 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true + }, + globals: { + defineProps: 'readonly', + defineEmits: 'readonly', + defineExpose: 'readonly', + withDefaults: 'readonly', + DialogType: "readonly", + OptionType: "readonly", + }, + parser: 'vue-eslint-parser', + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-essential', + 'plugin:@typescript-eslint/recommended' + ], + parserOptions: { + ecmaVersion: 'latest', + parser: '@typescript-eslint/parser', + sourceType: 'module' + }, + plugins: ['vue', '@typescript-eslint'], + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/no-empty-function': 'off', // 关闭空方法检查 + '@typescript-eslint/no-explicit-any': 'off', // 关闭any类型的警告 + 'vue/no-v-model-argument': 'off' + } +}; diff --git a/frontend-sjgl/.gitignore b/frontend-sjgl/.gitignore new file mode 100644 index 00000000..1da66c1e --- /dev/null +++ b/frontend-sjgl/.gitignore @@ -0,0 +1,17 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock \ No newline at end of file diff --git a/frontend-sjgl/.lingma/settings.local.json b/frontend-sjgl/.lingma/settings.local.json new file mode 100644 index 00000000..097b7bf4 --- /dev/null +++ b/frontend-sjgl/.lingma/settings.local.json @@ -0,0 +1,4 @@ +{ + "permissions": {}, + "outputStyle": "Vibe" +} \ No newline at end of file diff --git a/frontend-sjgl/.npmrc b/frontend-sjgl/.npmrc new file mode 100644 index 00000000..755f072c --- /dev/null +++ b/frontend-sjgl/.npmrc @@ -0,0 +1,5 @@ +registry=https://registry.npmmirror.com +fetch-retries=5 +strict-peer-dependencies=false +# 添加 Node.js 内存配置 +node-options=--max-old-space-size=4096 \ No newline at end of file diff --git a/frontend-sjgl/.prettierignore b/frontend-sjgl/.prettierignore new file mode 100644 index 00000000..d251d2eb --- /dev/null +++ b/frontend-sjgl/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* \ No newline at end of file diff --git a/frontend-sjgl/.prettierrc.js b/frontend-sjgl/.prettierrc.js new file mode 100644 index 00000000..0a62ee56 --- /dev/null +++ b/frontend-sjgl/.prettierrc.js @@ -0,0 +1,36 @@ +/** + * 代码格式化配置 + */ +module.exports = { + // 指定每个缩进级别的空格数 + tabWidth: 2, + // 使用制表符而不是空格缩进行 + useTabs: false, + // 在语句末尾打印分号 + semi: true, + // 使用单引号而不是双引号 + singleQuote: true, + // 更改引用对象属性的时间 可选值"" + quoteProps: 'as-needed', + // 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none + trailingComma: 'none', + // 在对象文字中的括号之间打印空格 + bracketSpacing: true, + // 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x + arrowParens: 'avoid', + // 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码 + rangeStart: 0, + rangeEnd: Infinity, + // 指定要使用的解析器,不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 换行设置 always\never\preserve + proseWrap: 'never', + // 指定HTML文件的全局空格敏感度 css\strict\ignore + htmlWhitespaceSensitivity: 'css', + // Vue文件脚本和样式标签缩进 + vueIndentScriptAndStyle: false, + // 换行符使用 lf 结尾是 可选值"" + endOfLine: 'lf', +}; diff --git a/frontend-sjgl/LICENSE b/frontend-sjgl/LICENSE new file mode 100644 index 00000000..26602549 --- /dev/null +++ b/frontend-sjgl/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 有来开源组织 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/frontend-sjgl/commitlint.config.js b/frontend-sjgl/commitlint.config.js new file mode 100644 index 00000000..efff0540 --- /dev/null +++ b/frontend-sjgl/commitlint.config.js @@ -0,0 +1,26 @@ +module.exports = { + // 继承的规则 + extends: ['@commitlint/config-conventional'], + // 定义规则类型 + rules: { + // type 类型定义,表示 git 提交的 type 必须在以下类型范围内 + 'type-enum': [ + 2, + 'always', + [ + 'feat', // 新功能 feature + 'fix', // 修复 bug + 'docs', // 文档注释 + 'style', // 代码格式(不影响代码运行的变动) + 'refactor', // 重构(既不增加新功能,也不是修复bug) + 'perf', // 性能优化 + 'test', // 增加测试 + 'chore', // 构建过程或辅助工具的变动 + 'revert', // 回退 + 'build' // 打包 + ] + ], + // subject 大小写不做校验 + 'subject-case': [0] + } +}; diff --git a/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md b/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md new file mode 100644 index 00000000..9b22b1b0 --- /dev/null +++ b/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md @@ -0,0 +1,479 @@ +# 地图模块 3D Cesium 实施计划 + +## 1. 目标 + +在现有地图体系下补齐 `3D(Cesium)` 视图能力,使其尽量复用 `2D(OpenLayers)` 的业务编排结果,满足以下要求: + +- 3D 默认进入中国视角,不再落到美国区域。 +- 3D 初始化时显示过渡动画,再定位到中国。 +- 3D 保留基础底图加载能力,但不提供底图切换面板。 +- 3D 支持锚点展示。 +- 3D 支持与 2D 一致的鼠标悬停 popup,样式复用现有 popup。 +- 3D 支持与 2D 一致的锚点点击行为,点击后打开同一套详情弹框逻辑。 +- 菜单切换、图层树勾选、图例勾选后,3D 锚点与 2D 一样联动变化。 +- 3D 必须复用 `eng_point` 的层级显示规则,中型水电站仅在 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上显示。 + +## 2. 2D 现状梳理 + +当前 `2D` 的能力并不是散落在页面里,而是已经形成了比较清晰的分层: + +### 2.1 页面入口 + +- `src/components/gis/GisView.vue` +- 负责挂载地图容器、popup 容器、地图控制器、图例、图层树。 +- 页面只调用 `mapOrchestrator.mountView()` 和 `handlePageChange()`,不直接拼地图业务。 + +### 2.2 地图编排层 + +- `src/modules/map/application/map-orchestrator.ts` +- 负责页面初始化、菜单切换、图层配置加载、图例配置加载、基地切换、缩放联动。 +- 2D/3D 都应尽量复用这一层,避免在 Cesium 侧另起一套业务流程。 + +### 2.3 地图统一门面 + +- `src/components/gis/map.class.ts` +- 对外暴露统一接口,如: + - `addBaseDataLayer` + - `addInitDataLayer` + - `mdLayerTreeShowOrHidden` + - `setLegendPointVisible` + - `controlBaseLayerTreeShowAndHidden` + - `initPopupOverlay` + - `flyTopanto` +- 业务层只认这套接口,不应感知底层是 `OpenLayers` 还是 `Cesium`。 + +### 2.4 2D 地图能力落点 + +- `src/components/gis/map.ol.ts` +- 已实现的关键能力: + - 默认中国视角初始化 + - 基础底图加载与切换 + - 点位图层注册和显隐 + - 图例控制单类锚点显隐 + - 鼠标 hover popup + - click 打开详情弹窗 + - 基地裁切与底图遮罩 + - 缩放/移动后的批量 popup 和标签刷新 + +### 2.5 2D 锚点与 popup 支撑 + +- `src/components/gis/ol/point-layer-manager.ts` + - 负责将点位数据转成地图要素、分层、索引、图例显隐。 +- `src/components/gis/ol/popup-manager.ts` + - 负责 hover 命中、popup DOM 内容复用、批量 popup。 + +### 2.6 图层树和图例交互 + +- `src/components/mapController/LayerController.vue` + - 图层树勾选后走 `mapOrchestrator.applyLayerSelection()` +- `src/components/mapLegend/index.vue` + - 图例点击后走 `mapOrchestrator.toggleLegend()` / `toggleLegendBatch()` +- `src/store/modules/map.ts` + - 真正把缓存数据、图层状态、图例状态应用到地图实例 + - 也就是说,`3D` 只要把统一接口补齐,就能直接接住现有业务流 + +### 2.7 2D 已有特殊业务规则 + +- 锚点点击逻辑已在 `src/components/gis/map.ol.ts` 实现: + - 命中锚点后,`ylfb` 走 `ylfbModalVisible` + - 其他锚点走 `modalVisible` + - 标题和参数都直接取当前锚点数据 +- `eng_point` 的中型水电站显示阈值已在现有链路中实现: + - 阈值常量位于 `src/modules/map/application/map-orchestrator.ts` + - 过滤逻辑位于 `src/store/modules/map.ts` 的 `filterPointLayerDataForDisplay()` + - `3D` 不应重新发明一套规则,而应复用这套现有过滤结果 +- 部分点位会随着缩放级别提升显示得更多,不是简单的“图层开/关”: + - `eng_point` 的中型电站要到 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上才显示 + - 水电开发页在缩放跨过 `12` 级时会自动补开一批动态图层 + - `2D` 内部还存在点位密度阈值、近邻点展开、批量 popup 阈值等缩放联动规则 +- `2D` 对锚点存在碰撞检测与密度控制,不是所有点始终全量显示: + - 图标和标签会分别经过碰撞计算 + - 低缩放下会因为密度、碰撞、区域裁切、图例状态而隐藏部分点 + - 高缩放下会逐步放开限制,显示更多锚点和标签 + +## 3. 3D 当前现状与缺口 + +### 3.1 已有内容 + +- `src/components/gis/map.cesium.ts` +- 当前只完成了最小化 `Cesium.Viewer` 初始化。 +- 已有基础缩放、截图、`flyTopanto()` 雏形。 + +### 3.2 当前主要缺口 + +- `init()` 里虽然定义了 `flyToChina()`,但没有真正执行,也没有 `resolve(viewer)`,初始化流程不完整。 +- 默认底图仍是 ArcGIS 全球影像,因此启动时容易落到美国默认视角。 +- `addBaseDataLayer()` 为空,无法接住当前 `GISMap/customBaseLayer` 逻辑。 +- `addInitDataLayer()` 为空,无法展示锚点。 +- `mdLayerTreeShowOrHidden()` 为空,菜单切换时 3D 锚点不会同步显隐。 +- `setLegendPointVisible()` 为空,图例勾选不会影响 3D 锚点。 +- `initPopupOverlay()` 为空,无法复用 2D popup 容器。 +- 缺少点击命中与详情弹框联动,3D 当前无法做到“点击锚点与 2D 同行为”。 +- `controlBaseLayerTreeShowAndHidden()` 为空,3D 基础底图和叠加层无法受现有图层树控制。 +- 尚未验证 `eng_point` 的缩放阈值规则在 3D 下是否能完全复用,存在实现时遗漏中型站点显隐的风险。 +- 目前没有承接 `2D` 中“放大到具体层级显示更多锚点”的缩放联动显示机制。 +- 目前没有承接 `2D` 中图标/标签的碰撞检测逻辑,后续若直接全量渲染,视觉效果会与 `2D` 明显不一致。 +- 当前没有建立 `Cesium entity / datasource / imageryLayer` 的注册表,后续联动无从下手。 + +## 4. 实施原则 + +- 不重做业务编排,优先复用 `map-orchestrator.ts` 和 `src/store/modules/map.ts`。 +- 不额外引入一套 3D 专用图例和图层状态,仍以现有 store 为唯一运行态来源。 +- 不单独复制 `eng_point` 的中型站显示规则,优先复用现有 `mapStore` 过滤结果。 +- 不单独新建一套点击弹框协议,优先保持与 `map.ol.ts` 相同的命中后行为。 +- 对“缩放越大显示越多锚点”这类规则,优先复用现有缩放阈值与显示门闩,不做拍脑袋的新规则。 +- 对碰撞检测,优先与 `2D` 保持同方向行为:低缩放控量,高缩放放开,而不是 3D 全量堆点。 +- 先做最小闭环,再逐步补能力: + - 第一步保证 3D 能正确初始化并定位中国。 + - 第二步保证基础底图能显示。 + - 第三步保证锚点能显示。 + - 第四步保证 popup、图层树、图例联动打通。 +- 3D 不做“基础地图切换 UI”,但底层仍要支持 `customBaseLayer + addBaseDataLayer(..., true)` 这一逻辑。 + +## 5. 分步骤实施计划 + +### Step 1:修正 3D 初始化并默认定位中国 ✅️ + +目标: + +- 切到 3D 后稳定初始化 viewer。 +- 首屏出现一个轻量加载动画。 +- 初始化完成后飞到中国默认视角。 + +计划: + +- 修复 `map.cesium.ts` 的 `init()`: + - 保证初始化后一定 `resolve(this.viewer)`。 + - 执行 `flyToChina()`。 + - 补一个可控的启动过渡动画。 +- 统一中国默认参数: + - 中心经纬度建议复用 `104.5, 36.5` + - 相机高度先按全国视角收口,后续再微调 +- 如果切回 2D 再切到 3D,仍然要能正确重建 viewer。 + +验收: + +- 点击 `3D` 按钮后,不再出现美国默认视角。 +- 首屏有加载过渡。 +- 进入后稳定落在中国。 + +### Step 2:展示 3D 基础底图 ✅️ + +目标: + +- 3D 不显示空球。 +- 保留“基础底图 + 3D 专用底图地址”能力。 +- 不提供底图切换面板,但底层能吃现有配置。 + +计划: + +- 在 `MapCesium` 内建立基础图层注册表。 +- 实现 `addBaseDataLayer(layer, isShow)`: + - 对 `customBaseLayer` 使用 `url_3d` + - 对 `BASEMAP-img`、`BASEMAP-white` 预留兼容能力 + - **必须处理 `wmts` 类型图层**:2D 通过 `WMTS` source 加载,3D 使用 `Cesium.WebMapTileServiceImageryProvider`,从 URL 参数中提取 LAYER/TILEMATRIXSET + - **必须提供 `tileMatrixLabels`**:Cesium 默认用纯数字作为 tileMatrix 参数值,但本系统 WMTS 服务器要求 `TileMatrixSet:zoom` 格式(如 `EPSG:3857_hbb_zrbhq_l13:4`)。需构建 `["TileMatrixSet:0", "TileMatrixSet:1", ...]` 传入 `tileMatrixLabels`。 + - 其他类型:`raster-dem`→XYZ、MapServer→ArcGIS、其余 →WMS +- **注意**:还存在一个 `key = "powerBaseStation"` 的基地底图图层,该图层**初始化时不加载**(已在 `IGNORED_BASE_LAYER_KEYS` 中忽略),但后续可通过图层树手动勾选显示。 +- 实现 `controlBaseLayerTreeShowAndHidden()`: + - 让图层树勾选能控制 3D 底图显隐 +- 根据你的要求,UI 层先不开放 `BaseLayerSwitcher` 的 3D 切换行为,只保留默认基础底图加载。 + +验收: + +- 切到 3D 后可稳定看到基础底图。 +- 图层初始化时 `addBaseDataLayer(this.baseLayerConfig, checked, true)` 的思路在 3D 可落地。 + +### Step 3:打通 3D 锚点展示 ✅️ + +目标: + +- 3D 能展示和 2D 同源的锚点数据。 +- 菜单切换后,3D 能跟随页面数据切换。 + +计划: + +- 在 `MapCesium` 内建立点位图层注册结构,按 `layerKey -> entity[]` 管理。 +- 实现 `addInitDataLayer(pointData, layerType)`: + - 复用当前点位数据结构 + - 解析 `lgtd/lttd/iconCode/titleName/stnm/anchoPointState/popupHtml` + - 复用现有图标资源路径 + - Entity ID 使用 `${layerKey}:${item._id || `${iconType || 'point'}_${stcd}`}`,与 2D 对齐,确保同 stcd 不同 sttpMap 的点不被覆盖 + - 确保 `eng_point` 仍按现有 `mapStore` 过滤后的数据展示,中型站点只在 `7.5` 以上层级出现 + - 为后续缩放驱动的增量显示预留运行态字段(`_legendVisible`、`_regionVisible`、`_densityVisible`),不把所有点简单一次性硬渲染 +- 实现 `mdLayerTreeShowOrHidden(layerType, checked)`: + - 图层树控制整个点图层显隐 +- 实现 `removePointLayer()` / `hasLayer()` + - 便于后续页面切换和重载 + +验收: + +- 切到 3D 后当前页默认勾选图层的锚点能显示。 +- 切换菜单后,3D 锚点跟随变化。 +- 取消勾选图层后,对应锚点消失。 +- `eng_point` 在低于 `7.5` 时不显示中型水电站,高于 `7.5` 时正常显示。 + +### Step 4:打通 3D 基地裁切(jdPanelControlShowAndHidden) ✅️ + +目标: + +- 3D 点击基地面板后,与 2D 行为一致。 +- 加载基地边界 GeoJSON,只显示区域内锚点,隐藏区域外锚点。 +- 取消基地时恢复显示所有锚点。 + +计划: + +- 在 `MapCesium` 中捕获 `hydropBase` 配置,与 2D 一样在 `addBaseDataLayer` 中记录。 +- 实现 `jdPanelControlShowAndHidden(baseid, isAll)`: + - `isAll=false`:清除 3D 球面遮罩实体、恢复所有锚点区域可见性、清除裁切状态。 + - `isAll=true`:先隐藏所有锚点,异步加载基地边界 GeoJSON,执行点在面判断后仅显示区域内锚点,同时在球面绘制裁切边界多边形(`applyRegionMask`),最后飞行到区域视野。 +- 在 `createEntityPropertiesBag` 中新增 `_regionVisible` 属性,初始为 `true`。 +- 在 `applyPointVisibilityRefresh` 中跳过 `_regionVisible !== false` 的实体,确保裁切后碰撞检测不会把区域外锚点重新显示出来。 +- 复用 `extractPolygonCoords` / `isPointInRing` 射线法判断逻辑(与 `region-mask-manager.ts` 一致)。 +- 支持 `AbortController` 取消前一次未完成的请求,避免响应顺序错乱。 +- `applyRegionMask` 将 GeoJSON 多边形转换为 Cesium `PolygonHierarchy`,在球面绘制半透明填充 + 可见边界的区域多边形,模拟 2D 底图 Canvas 裁切遮罩的视觉效果。 + +验收: + +- 点击基地后,3D 只显示该基地区域内的锚点,区域外锚点隐藏。 +- 取消基地后,所有锚点恢复正常显示。 +- 快速切换基地不会出现旧数据覆盖新数据的问题。 +- 多次切换 2D/3D 后基地裁切行为正常。 + +### Step 5:打通 3D popup 与 hover ✅️ + +目标: + +- 3D 鼠标悬停时显示与 2D 一样的 popup。 +- popup 样式复用现有 DOM 和样式,不再单独做一版。 + +计划: + +- 实现 `initPopupOverlay(popupContainer)` + - 继续复用 `GisView.vue` 中现有 popup 容器 +- 在 Cesium 中增加鼠标移动命中: + - 基于 `ScreenSpaceEventHandler` + - hover 到锚点时读取 entity 附带属性 +- popup 内容生成逻辑复用 2D 现有字段: + - 优先使用 `popupHtml` + - 否则走通用字段渲染 +- 处理离开锚点时隐藏 popup。 + +验收: + +- 鼠标移入锚点出现 popup。 +- 样式和 2D 保持一致。 +- 移出后 popup 正常消失。 + +### Step 6:补齐缩放驱动显示与碰撞检测 + +目标: + +- 3D 在低缩放下控制锚点数量,避免全量堆叠。 +- 3D 在放大到具体层级后,逐步显示更多锚点。 +- 3D 的图标/标签显示效果尽量接近 2D,不出现严重遮挡。 + +计划: + +- 先承接现有明确可复用的缩放规则: + - `eng_point` 的 `7.5` 阈值 + - 水电开发页的 `12` 级动态图层联动 +- 再补 3D 侧的显示门闩: + - 低缩放下根据缩放级别、图层状态、图例状态控制 entity 显隐 + - 高缩放下逐步放开限制,显示更多锚点 +- 为 3D 补一版轻量碰撞控制: + - 至少先控制标签碰撞,避免名称完全叠在一起 + - 如有必要,再补图标级碰撞或屏幕网格抽稀 +- 明确与 2D 对齐的目标不是“算法完全一样”,而是“视觉行为一致”: + - 低缩放控量 + - 高缩放增量显示 + - 关键锚点不被完全淹没 + +验收: + +- 3D 在全国视角下不会一次性挤满所有锚点。 +- 放大到具体层级后会看到更多锚点逐步出现。 +- 标签和锚点不会大面积重叠到不可读。 + +### Step 7:打通 3D 锚点点击详情 ✅️ + +目标: + +- 3D 点击锚点后,行为与 2D 一致。 +- 继续复用现有详情弹框状态和参数结构。 + +计划: + +- 在 Cesium 中增加点击命中: + - 基于 `ScreenSpaceEventHandler` + - 命中锚点后读取 entity 绑定的原始业务数据 +- 复用 `2D` 当前点击行为: + - `sttpMap === 'ylfb'` 时打开 `ylfbModalVisible` + - 其他锚点打开 `modalVisible` + - `params`、`title` 赋值逻辑与 `map.ol.ts` 保持一致 +- 避免 hover popup 与 click 弹框互相干扰。 + +验收: + +- 点击 3D 锚点后可打开与 2D 一致的详情弹框。 +- `ylfb` 和普通锚点分支行为一致。 +- 点击空白区域不会误触发弹框。 + +### Step 8:打通图例联动 ✅️ + +目标: + +- 图例勾选后,3D 只显示对应状态的锚点。 + +计划: + +- 实现 `setLegendPointVisible(layerKey, anchoPointState, checked)`: + - 复用 `anchoPointState` 作为图例匹配字段 + - entity 级别维护显示状态 +- 如果后续需要,也可补一个 3D 版本的图例索引表,避免每次全量遍历。 + +验收: + +- 图例单项勾选/取消时,3D 对应类别锚点同步显隐。 +- 图例分组勾选/取消时,3D 行为与 2D 保持一致。 + +### Step 9:补足收口与稳定性 ✅️ + +目标: + +- 让 3D 能稳定参与现有地图生命周期。 + +计划: + +- 清理 Cesium 事件监听、viewer、entity、datasource,避免重复切换内存泄漏。 +- 检查 `switchView('2D' | '3D')` 前后 popup、底图、图层注册是否被正确重置。 +- 检查 hover、click、图例、图层树、缩放阈值这几条联动链路在 3D 是否完全闭环。 +- 视情况补最小诊断日志,确认菜单切换与图层联动没有漏项。 + +验收: + +- 2D/3D 多次来回切换不报错。 +- 菜单切换、图层切换、图例切换行为稳定。 + +## 6. 推荐落地顺序 + +按你的要求,建议严格按下面顺序推进: + +1. 默认定位到中国 + 启动动画 +2. 展示基础底图 +3. 展示锚点 3.5. 补基地裁切(jdPanelControlShowAndHidden) +4. 补 hover popup +5. 补缩放驱动显示与碰撞检测 +6. 补锚点点击详情 +7. 补图层树联动 +8. 补图例联动 +9. 做切换稳定性收口 + +## 7. 预计修改文件 + +- `src/components/gis/map.cesium.ts` + - 3D 地图主体实现,主改动文件 +- `src/components/gis/map.class.ts` + - 视情况补齐 2D/3D 切换后 popup 初始化和服务切换细节 +- `src/components/gis/GisView.vue` + - 视情况控制 3D 下的底图切换器显示策略、加载态挂载位置 +- `src/components/mapController/index.vue` + - 若需要补 3D 初始化后的交互控制 + +## 8. 当前建议 + +建议先只做 `Step 1`,也就是: + +- 修正 Cesium 初始化完成逻辑 +- 增加 3D 启动加载动画 +- 默认飞到中国 + +这一步最小、最容易验证,也能先把“打开 3D 看起来不对”的核心问题解决掉。 + +## 9. 必须补齐的隐藏逻辑清单 + +下面这些逻辑不是表面接口能直接看出来的,但如果 `3D` 不补,最终效果就会和 `2D` 明显不一致。 + +### 9.1 图层与菜单切换 ✅️ + +- ✅ 菜单切换时,只隐藏旧页点图层,不隐藏底图。(编排器 `handlePageChange` 控制,Cesium 被动接收数据) +- ✅ 图层树勾选前要先经过互斥规则归一化:(store 层 `updateLayerData` 处理,Cesium 不感知) + - `rare_fish_point` 与 `fish_along_point` 互斥 + - `stinfo/stinfo_video_point` 与 `stinfo_ai_video_point` 互斥 + - `facilities` 与 `facilities_built` 两个分支互斥 +- ✅ 点图层取消勾选时只隐藏,不删除缓存;重新勾选时优先从缓存恢复。`mdLayerTreeShowOrHidden` 设置 `_layerVisible` 标志,不删除 `pointLayerRegistry` 条目。 +- ✅ **图层树勾选时按 `type` 字段走不同分支**(见 `updateLayerData`,store 层处理): + - `type === 'pointMap'` → 走 `handlePointMapLayer` → 调用 `mdLayerTreeShowOrHidden`(已实现,L1624) + - `type === 'GISMap'` → 走 `controlBaseLayerTreeShowAndHidden`(已实现,L1345) + - 3D Cesium 已同时实现这两个方法。 + +### 9.2 图例与点内显隐 ✅️ + +- ✅ 图例控制的是图层内部锚点是否可见,不是图层本身是否可见。`setLegendPointVisible` 使用 `_legendVisible` 标志,与 `_layerVisible` 独立。 +- ✅ 图层恢复显示时,图例要先整层全关,再按当前 checked 状态逐项恢复。支持 `anchoPointState=''` 全关 → 逐项 `(state, true)` 恢复两步模式(L1764-1787)。 +- ✅ 环保设施图例组当前是只展示不交互。(编排器层面控制,Cesium 不感知) + +### 9.3 缩放驱动显示 ✅️ + +- ✅ `eng_point` 的中型水电站只在 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上显示。(store `filterPointLayerDataForDisplay` 在数据进入 Cesium 前过滤) +- ✅ 水电开发页缩放跨过 `12` 级时,会自动补开一批动态图层;缩回去时再自动收口。(编排器层面处理) +- ✅ `2D` 存在"缩放越大显示越多"的行为。碰撞检测中密度门控逐级放开。 +- ✅ `2D` 还存在 hover、批量 popup、密度控制等缩放阈值: + - hover 低于 ~zoom 4.5 不触发(`HOVER_POPUP_MAX_HEIGHT = 9_000_000`) + - 高缩放进入批量 popup 模式(`BATCH_POPUP_MODE_ZOOM = 14.9`) + - 点位随着缩放提升逐步放开密度限制(密度门控 + `DENSITY_ISOLATION_THRESHOLD`) +- ✅ **图标动态缩放**:`CallbackProperty` 实现 `billboard.scale`,公式 `clamp(0.7 + (zoom - 4.5) * 0.035, 0.4, 1.2)`(L1522)。 +- ✅ **字体动态大小**:`CallbackProperty` 实现 `label.font`,钳位 `[10, 20]`(L1535)。 +- ✅ **文字在图标上方**:`CallbackProperty` 实现 `label.pixelOffset`,负 Y 偏移(L1549)。 +- ✅ **Cesium 中必须使用 `CallbackProperty` 实现动态缩放**:已使用 3 个 `CallbackProperty`(scale/font/offset),`isConstant=false` 每帧重算。 + +### 9.4 锚点碰撞与控量 ✅️ + +- ✅ `2D` 中锚点是否可见,不只受图层开关控制,还受以下门闩共同影响: + - 图例可见性 `_legendVisible` + - 区域裁切可见性 `_regionVisible` + - 密度阈值(碰撞循环中 inline 计算,逐级放开) + - 图标碰撞结果 `_iconCollisionVisible` + - 标签碰撞结果 `_labelCollisionVisible` +- ✅ 低缩放下,为避免堆叠,部分锚点或标签会被主动隐藏。(`refreshPointLabelVisibility` 碰撞检测,L2117-2455) +- ✅ 高缩放下,会逐步放开图标/标签限制,显示更多内容。(密度门控 + 碰撞容差随 zoom 调整) +- ✅ 因此 `3D` 不能简单把所有 entity 永久全开。所有 entity 初始 `_iconCollisionVisible = _labelCollisionVisible = true`,碰撞检测运行后动态调整。 + +### 9.5 Popup 与点击 ✅️ + +- ✅ hover popup 不是全时开启的,有缩放门槛。相机高度 > `HOVER_POPUP_MAX_HEIGHT` 时不触发 hover。 +- ✅ 点击和 hover 的命中对象是图标本体,不是任意文字区域。`ScreenSpaceEventHandler` 基于 `scene.pick` 命中 entity。 +- ✅ `ylfb` 与普通锚点的点击详情弹框走不同业务分支。`sttpMap === 'ylfb'` 打开 `ylfbModalVisible`,其他走 `modalVisible`(L366-375)。 + +### 9.6 基地与区域裁切 ✅️ + +- ✅ 基地切换不仅影响搜索候选,还会影响地图上的点位可见范围。`jdPanelControlShowAndHidden` 实现(L1684-1748)。 +- ✅ 区域裁切会直接把区域外点位隐藏,不是只改底图遮罩。`filterPointsByRegion` 设置 `_regionVisible = false`(L1824-1848),遮罩多边形 + 裁剪双重处理。 + +### 9.7 筛选器特殊逻辑 ✅️ + +- ✅ 装机容量筛选本质是批量切 `eng_point` 图例状态,不是简单切图层。(store 层处理,Cesium 通过 `setLegendPointVisible` 响应) +- ✅ 鱼类分布模式会接管 `ylfb_point` 的数据、缓存、图例与显隐。(store 层处理) +- ✅ 时间筛选当前只重载指定时间相关图层,不是全量重载。(store 层处理) + +### 9.8 数据进入 addInitDataLayer 前的预处理 ✅️ + +- ✅ 所有点位数据在进入 `addInitDataLayer` 前会经过 `normalizePointLayerItems()` 过滤:(store 层 `map.ts` 执行,Cesium 接收时已过滤) + - 没有 `iconCode` 且 `code !== 'colorLayer'` 的项会被抛弃 + - `baseId == 'all'` 且 `anchoPointState` 结尾为 `_nbuilt` 的项会被抛弃 +- ✅ `_id` 默认值生成规则:store 层生成 `${sttpMap || iconType || 'point'}_${stcd}`。 +- ✅ **stcd+经纬度重复锚点处理**:Cesium entity ID 使用 `${layerKey}:${item._id}`,与 2D 对齐,同 stcd 不同 sttpMap 的点不会互相覆盖。 + +### 9.9 图标渐进加载机制 + +- ❌ 2D 中图标不是一次性全加载完。有 `loading → loaded → error` 三种状态跟踪。 +- ❌ 只有 `loaded` 状态的图标才参与样式渲染,loader 失败的不渲染。 +- ❌ 如果在图标加载过程中就触发了样式刷新,需要通过 `requestAnimationFrame` 回刷。 +- ❌ 3D Cesium 中当前所有 entity 同步创建,billboard `image` URL 直接赋值,无渐进加载。Cesium 内部纹理加载无显式状态跟踪。 + +### 9.10 密度分档与近邻点元数据 ✅️ + +- ✅ 每个锚点的 `distance` 字段表示密度分档值(不是物理距离),值越大表示越稀疏。(已使用 `getEntityDensityValue` 从 `_rawData.distance` 读取,L2460) +- ✅ 不同 density 值对应不同的 `minZoom` 显示门槛。`getEntityDensityMinZoom` 映射 `nearby-point-rules.ts` 的 `densityDisplayRules`(L2491)。 +- ✅ 全量数据加载后,store 会调用 `attachNearbyPointRuntimeMeta()` 给所有点打上 `_nearbyRule`、`_nearbyGroupId`、`_nearbyPriority` 等元数据。(store 层处理,Cesium 碰撞检测中读取) +- ✅ **孤立点例外规则**:如果一个点在当前视口内 ~56px 范围内没有同 layerKey 的其他可见点,它可以绕过密度门槛直接显示。`DENSITY_ISOLATION_THRESHOLD = 56` + `shouldBypassDensityGateForIsolatedEntity`(L2506-2556)。 diff --git a/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md b/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md new file mode 100644 index 00000000..3c0e97d0 --- /dev/null +++ b/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md @@ -0,0 +1,343 @@ +# 地图模块-OpenLayers抽吸与碰撞分析 + +## 1. 背景 + +当前地图 2D 主引擎已经切换为 OpenLayers,项目依赖版本为 `ol@^10.8.0`。 +本次关注的问题有两个: + +- 点位“抽吸”逻辑不符合业务预期; +- 文字碰撞时把整个点位一起隐藏,而不是仅隐藏文字。 + +典型场景是两个相邻电站,例如“积石峡”和“公伯峡”: + +- 可用代号 `1`、`2` 表示两个相邻点; +- 默认缩放下只展示 `1`; +- 放大到某个层级后,`1` 隐藏,`2` 展示; +- 再继续放大后,`1` 和 `2` 都展示,但 `2` 需要“抽吸/拉开”显示,避免与 `1` 重叠; +- 如果只是文字发生碰撞,希望点图标保留,仅文字隐藏或延后显示。 + +本文件先整理当前代码现状和问题成因,不直接修改实现。 +如果需要查看**当前已经落地的抽吸规则、默认参数和调参入口**,请同时参考: + +- `docs/地图模块-抽吸规则与参数说明.md` + +## 2. 当前代码结构 + +当前前端 GIS 运行链路如下: + +1. `src/components/gis/GisView.vue` +2. `src/modules/map/application/map-orchestrator.ts` +3. `src/components/gis/map.class.ts` +4. `src/components/gis/map.ol.ts` +5. `src/components/gis/ol/point-layer-manager.ts` +6. `src/components/gis/ol/popup-manager.ts` + +各层职责简述: + +- `GisView.vue` + - 地图入口组件; + - 挂载地图容器、图例、筛选器、控制器; + - 通过 `mapOrchestrator.mountView()` 初始化地图; + - 菜单切换时通过 `handlePageChange()` 触发页面地图重载。 + +- `map.class.ts` + - 地图门面类; + - 当前 2D 实现实际绑定的是 `MapOl`; + - 3D 实现才会切到 `MapCesium`。 + +- `map.ol.ts` + - OpenLayers 主实现; + - 负责地图初始化、底图加载、点位样式、Popup、区域裁切、量算等; + - 当前“点位渲染规则”和“碰撞相关逻辑”主要集中在这个文件。 + +- `point-layer-manager.ts` + - 负责点图层创建、Feature 灌入、按图层控制显隐; + - 点位图层统一使用 `VectorLayer + VectorSource`。 + +- `popup-manager.ts` + - 管理 hover popup 和高缩放下的批量 popup; + - 内部额外做了一套基于边界框的碰撞判断。 + +## 3. 当前点位渲染链路 + +### 3.1 点图层创建 + +`point-layer-manager.ts` 中的 `ensureLayer()` 会统一创建点图层: + +- 图层类型为 `VectorLayer`; +- 图层上开启了 `declutter: true`; +- 样式函数统一走 `map.ol.ts` 中的 `createPointStyle()`。 + +也就是说,当前所有点位的“是否显示”和“图标/文字如何避让”,都收敛到 OpenLayers 的 declutter 机制和样式函数里。 + +### 3.2 点样式生成 + +`map.ol.ts` 的 `createPointStyle()` 当前做了这些事: + +- 读取 `_iconUrl` 和 `_labelText`; +- 如果图例不可见、区域不可见,则直接返回 `null`; +- 如果 `distance` 不满足当前缩放级别要求,也直接返回 `null`; +- 图标使用 `Icon`; +- 文字使用 `Text`; +- 图标和文字都设置了 `declutterMode: 'declutter'`; +- 最终把图标和文字一起放进同一个 `Style` 返回。 + +这意味着: + +- 点图标和文字不是两个独立的渲染对象; +- 它们在当前实现中属于同一个样式结果; +- 只要这组样式参与碰撞判定,图标和文字的命运就是绑定的。 + +### 3.3 当前已有的“抽稀”逻辑 + +当前项目中确实有一层“缩放越小,显示越少”的处理,但它不是精细的“抽吸”。 + +`map.ol.ts` 的 `shouldRenderFeatureByDistance()` 逻辑是: + +- 小缩放下要求 `distance` 更大才允许显示; +- 缩放越大,允许显示的点逐渐增多; +- 本质上是基于后端数据字段 `distance` 做全局抽稀。 + +这个逻辑的特点是: + +- 是全局阈值,不是成对点位或同组点位的专属规则; +- 只能决定“这个点显示还是不显示”; +- 不能表达“1 和 2 是近邻关系,并且在不同缩放阶段按业务优先级切换显示”。 + +### 3.4 当前批量 Popup 的碰撞检测 + +`popup-manager.ts` 在高缩放批量 popup 模式下,又额外做了一层碰撞判断: + +- 先估算图标和文字合并后的锚点边界框; +- 如果边界框碰撞,则当前要素直接不参与 popup 渲染; +- 随后再判断 popup 矩形之间是否碰撞。 + +这说明当前“图标 + 文字”被视为一个整体,不仅体现在 OpenLayers 的 declutter 里,也体现在 popup 的辅助判断里。 + +## 4. 当前仓库里“抽吸”相关代码现状 + +仓库中确实存在历史上的“抽吸”实现,但不在当前 OpenLayers 主链路里。 + +相关文件: + +- `src/utils/leaflet/leaflet.inflatable-markers-group.js` +- `src/components/gis/map.leaflet.ts` + +现状判断: + +- `leaflet.inflatable-markers-group.js` 是旧 Leaflet 时代的抽吸插件; +- 它内部有 `inflateAsManyAsPossible()`、`_zoomend()` 等典型抽吸逻辑; +- 但当前 `map.class.ts` 实际实例化的是 `new MapOl()`; +- `map.leaflet.ts` 已经不在主运行路径上。 + +结论是: + +- 当前页面上看到的点位行为,不是 Leaflet 抽吸插件在工作; +- 现在的显示结果主要来自 OpenLayers 的 `declutter`、当前样式函数和 `distance` 抽稀逻辑; +- 因此“已经有抽吸但是不太对”,更准确地说是“历史上有抽吸代码,但现在主链路没有真正使用那套机制”。 + +## 5. 问题分析 + +### 5.1 为什么当前实现做不到你要的分阶段抽吸 + +你描述的目标并不是简单“避让”,而是一个明确的分阶段显示策略: + +1. 默认只显示 `1`; +2. 缩放到阶段 A 时,隐藏 `1`,改为显示 `2`; +3. 缩放到阶段 B 时,`1` 和 `2` 都显示; +4. 阶段 B 下,`2` 还要相对 `1` 做抽吸/偏移,避免完全重叠。 + +而当前代码缺少以下能力: + +- 没有“近邻点关系”配置 + - 代码里没有看到类似 `groupId`、`neighborIds`、`priority`、`displayLevel` 这样的结构; + - 系统不知道“积石峡”和“公伯峡”是一组特殊近邻点。 + +- 没有“分阶段显示规则”配置 + - 当前只有全局的 `distance` 阈值判断; + - 没有按缩放阶段表达“谁替代谁显示、谁先隐藏、谁后展示”。 + +- 没有“抽吸偏移”计算 + - 当前点要素坐标就是原始经纬度转换结果; + - 没有根据缩放级别和邻近关系生成偏移坐标; + - 也没有“展开后沿圆周/沿固定方向偏移”的逻辑。 + +- 当前 declutter 是被动避让,不是主动编排 + - declutter 只会尽量避免重叠; + - 它不会理解业务上的“1 是主点、2 是附点”; + - 也不会自动实现“先 1,后 2,再两个都展示且 2 偏移”的规则。 + +所以当前看到的结果不稳定,本质原因不是某一个参数不对,而是“现有机制和目标能力不是一类问题”。 + +### 5.2 为什么文字碰撞会把整个点隐藏 + +这是当前实现里最关键的原因: + +- 点图标和文字是在同一个 `Style` 里返回的; +- 图层开启了 `declutter: true`; +- 图标和文字又都设置了 `declutterMode: 'declutter'`。 + +在这种组织方式下,当前要素的碰撞判定是按“一个整体渲染单元”处理的,而不是“图标一套规则,文字一套规则”。 + +因此会出现下面的现象: + +- 图标本身其实不冲突; +- 但文字边界框发生碰撞; +- 最终被隐藏的是整条样式结果; +- 用户视觉上就会觉得“明明只是字挤了,为什么点也没了”。 + +这和你现在观察到的问题是一致的。 + +### 5.3 为什么当前逻辑还会进一步放大这个问题 + +除了 OpenLayers 自身的 declutter 组织方式,代码里还有两层因素会继续放大问题: + +- `shouldRenderFeatureByDistance()` 会先根据 `distance` 直接过滤点位; +- `popup-manager.ts` 在批量 popup 模式下,也把“图标 + 文字”当作合并边界框做碰撞模拟。 + +也就是说,当前系统对近邻点位的处理是: + +- 先用全局 `distance` 规则筛掉一部分; +- 再用 OpenLayers declutter 继续过滤; +- 高缩放时 popup 层再做一轮碰撞跳过。 + +这三层叠加后,显示行为更偏向“谁先撞谁消失”,而不是“按业务规则分阶段展开”。 + +## 6. 结合你的案例做具体映射 + +如果以近邻点 `1`、`2` 为例,当前代码里实际上缺的是下面这些业务语义: + +- `1` 和 `2` 属于同一近邻组; +- 组内有主次优先级; +- 在不同 zoom 区间内有不同展示策略; +- 在最大放大阶段需要给 `2` 一个偏移位; +- 偏移后图标和文字还要分别控制碰撞策略。 + +当前实现只能表达: + +- 某个点在当前 zoom 下是否允许渲染; +- 某个点图例是否可见; +- 某个点是否被区域裁切隐藏; +- 某个点的图标和文字整体是否参与 declutter。 + +它并不能表达: + +- “1 替代 2 展示”; +- “2 替代 1 展示”; +- “1 和 2 一起展示,但 2 抽吸展开”; +- “只隐藏文字,不隐藏图标”。 + +所以你现在遇到的问题是结构性问题,不是简单调一个 `declutter` 参数就能彻底解决。 + +## 7. 后续修改时建议优先动的层 + +如果下一步要真正改这块,建议优先从下面几层入手: + +### 7.1 先补“近邻点显示规则” + +建议不要直接把业务规则写死在样式函数里,而是先增加一层近邻点编排规则,例如: + +- `groupId` +- `priority` +- `showZoomMin` +- `showZoomMax` +- `replaceAtZoom` +- `expandAtZoom` +- `expandOffset` + +这样才能表达: + +- 默认只显示主点; +- 中间层级切换成副点; +- 更大层级两个都显示; +- 副点在展示时做偏移。 + +### 7.2 抽吸不要依赖 declutter 自动完成 + +抽吸本质上是“主动布局”问题,不是“被动避让”问题。 + +建议后续把近邻点抽吸拆成单独逻辑: + +- 先根据原始点数据识别近邻组; +- 再根据当前 zoom 产出“本次真正参与渲染的点集合”; +- 对需要展开的点,生成偏移后的渲染坐标; +- 最后再交给图层渲染。 + +这样会比直接指望 OpenLayers 的 declutter 更可控。 + +### 7.3 图标层和文字层要分开控制 + +要实现“文字碰撞时只隐藏文字,不隐藏点图标”,后续最重要的一点是把图标和文字的渲染职责拆开。 + +至少要做到下面二选一: + +- 图标层和文字层拆成两个独立图层; +- 或者把图标与文字拆成可独立决策的渲染单元。 + +目标是: + +- 图标优先保留; +- 文字单独避让; +- 文本碰撞时只压文字,不压图标。 + +如果仍然维持“同一个样式对象里同时放 image 和 text”的组织方式,这个问题大概率还会持续存在。 + +### 7.4 Popup 碰撞策略也要和新规则同步 + +后续如果点位抽吸和文字单独避让改了,`popup-manager.ts` 里的边界框逻辑也要一起调整。 + +否则会出现: + +- 图标已经正常显示; +- 文字也按新规则显示了; +- 但 popup 层仍然沿用旧的合并边界框; +- 最终又在 popup 阶段把结果打回去。 + +## 8. 建议的改造顺序 + +为了降低风险,建议后续改造按以下顺序推进: + +1. 先梳理近邻点数据结构 + - 确定近邻点如何分组; + - 确定主次优先级和缩放阈值从哪里来。 + +2. 再实现“显示决策层” + - 在真正生成 Style 之前,先决定哪些点应该显示; + - 哪些点应该隐藏; + - 哪些点需要偏移展开。 + +3. 然后拆分图标和文字碰撞 + - 先保证点图标稳定显示; + - 再单独做文字避让。 + +4. 最后调整 popup 逻辑 + - 保证 popup 的碰撞判定和最终可见点保持一致。 + +## 9. 涉及文件清单 + +本次分析重点涉及以下文件: + +- `src/components/gis/GisView.vue` +- `src/components/gis/map.class.ts` +- `src/components/gis/map.ol.ts` +- `src/components/gis/ol/point-layer-manager.ts` +- `src/components/gis/ol/popup-manager.ts` +- `src/utils/leaflet/leaflet.inflatable-markers-group.js` +- `src/components/gis/map.leaflet.ts` +- `package.json` + +## 10. 当前结论 + +当前地图问题可以归纳为两点: + +1. 现在的 OpenLayers 主链路并没有真正使用旧 Leaflet 的抽吸机制; +2. 当前点图标和文字被作为一个整体参与 declutter,所以文字碰撞时会连点一起隐藏。 + +所以后续如果要改,方向不应该只是“调避让参数”,而应该是: + +- 增加近邻点分阶段显示规则; +- 增加主动抽吸/偏移布局; +- 把图标和文字拆成可独立控制的渲染单元; +- 同步修正 popup 的碰撞判断。 + +在这个基础上,再进入代码修改会更稳。 diff --git a/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md b/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md new file mode 100644 index 00000000..65c9e71e --- /dev/null +++ b/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md @@ -0,0 +1,316 @@ +# 地图模块-抽吸规则与参数说明 + +## 1. 文档目的 + +本文档用于记录当前地图点位“抽吸”功能的现行实现、默认参数、分层级显示规则和后续调参方式。 +本文件描述的是**当前已经落地并验证通过**的规则,适合作为后续维护和继续调参的依据。 + +相关文档: + +- `docs/地图模块-详细说明.md`:地图整体架构说明 +- `docs/地图模块-OpenLayers抽吸与碰撞分析.md`:问题成因与改造分析 + +## 2. 当前实现范围 + +当前抽吸逻辑运行在 OpenLayers 主链路中,核心文件如下: + +1. `src/modules/map/domain/nearby-point-rules.ts` +2. `src/store/modules/map.ts` +3. `src/components/gis/map.ol.ts` +4. `src/components/gis/ol/point-layer-manager.ts` + +各文件职责: + +- `nearby-point-rules.ts` + - 近邻点规则入口 + - 自动识别配置入口 + - 近邻点运行时元数据挂载 +- `map.ts` + - 点位数据加载完成后,统一触发近邻点分组和元数据写回 +- `map.ol.ts` + - 决定某个点在当前缩放级别是否显示 + - 决定文字是否允许显示 + - 承担图标与文字的手工碰撞控制 +- `point-layer-manager.ts` + - 负责展开阶段的几何偏移 + - 负责把同组点位按扇形/环形布局散开 + +## 3. 当前抽吸规则 + +### 3.1 近邻点自动识别 + +当前采用自动识别近邻点,不再靠固定站名手工枚举。 + +识别原则: + +- 只在同一 `layerKey` 内做近邻识别 +- 按点位空间距离自动聚组 +- 满足最小组大小后,才认为是近邻组 +- 组内自动生成显示优先级 `priority` + +这样做的目的: + +- 避免跨图层混组 +- 避免后续新增点位还要手工补名字 +- 让抽吸能力可以覆盖整批业务点 + +### 3.2 分层级显示规则 + +当前显示规则以 `replaceAtZoom` 和 `expandAtZoom` 为核心: + +1. `zoom < replaceAtZoom` + - 只显示组内主点 + - 即 `priority = 1` +2. `replaceAtZoom <= zoom < expandAtZoom` + - 显示组内前两个点 + - 即 `priority <= 2` + - 当前这样设计是为了避免主点在放大过程中突然消失 +3. `zoom >= expandAtZoom` + - 同组点全部显示 + - 同时进入展开布局阶段 + +补充规则: + +- 如果某个点配置了 `showZoomMin` 或 `showZoomMax`,则先受这两个值约束 +- 没有进入近邻组的点,不受抽吸规则影响 + +### 3.3 文字显示规则 + +当前文字显示必须依赖点位显示。 + +也就是说: + +- 点不显示,文字一定不显示 +- 点显示后,文字还要继续通过碰撞判断才会显示 + +当前文字碰撞规则: + +- 文字要避让已保留的图标占位盒 +- 文字要避让已保留的其他文字 +- 图标与文字不再分别交给 OpenLayers 的 `declutter` 自动处理 +- 当前走的是项目内的手工碰撞控制 + +## 4. 当前默认参数 + +当前默认参数集中维护在: + +- `src/modules/map/domain/nearby-point-rules.ts` + +当前采用统一配置对象: + +```ts +type NearbyPointConfig = { + autoRule: NearbyPointAutoRule; + layoutRule: NearbyPointLayoutRule; + densityDisplayRules: NearbyPointDensityDisplayRule[]; +}; +``` + +其中: + +- `autoRule`:控制近邻点自动识别、缩放切换和基础展开半径 +- `layoutRule`:控制展开阶段的单圈容量、扇形角度和外圈间距 +- `densityDisplayRules`:控制 `distance` 密度分档在不同缩放级别的基础显示资格 + +### 4.1 自动识别与缩放阶段参数 + +当前值如下: + +| 参数 | 当前值 | 作用 | +|---|---:|---| +| `distanceThresholdMeters` | `9000` | 近邻点自动识别距离阈值 | +| `replaceAtZoom` | `10.5` | 进入“主点 + 次点”阶段的缩放级别 | +| `expandAtZoom` | `12.2` | 进入“全部显示并展开”阶段的缩放级别 | +| `expandOffsetPx` | `48` | 第一圈展开的基础偏移半径 | +| `angleStepDeg` | `55` | 默认角度步长参考值 | +| `minGroupSize` | `2` | 最小成组数量 | + +### 4.2 展开布局参数 + +当前值如下: + +| 参数 | 当前值 | 作用 | +|---|---:|---| +| `ringSize` | `5` | 单圈最多容纳的次点数量 | +| `fanAngleForTwoDeg` | `110` | 单圈剩余 `2` 个点时的扇形总角度 | +| `fanAngleForFourDeg` | `150` | 单圈剩余 `3` 到 `4` 个点时的扇形总角度 | +| `fanAngleForManyDeg` | `180` | 单圈剩余 `5` 个及以上点时的扇形总角度 | +| `ringGapPx` | `22` | 外圈最小增量半径 | +| `ringGapFactor` | `0.85` | 外圈相对基础半径的增量系数 | + +### 4.3 密度分档显示参数 + +这里的 `distance` 不是物理距离,而是点位密度分档值。 +数值越大表示越稀疏,越早参与显示候选;数值越小表示越密集,需要更高缩放级别才参与显示。 + +当前值如下: + +| `minDensityValue` | `minZoom` | 作用 | +|---:|---:|---| +| `1500000` | `0` | 很稀疏的点,从小缩放级别就可参与显示 | +| `800000` | `6.1` | 稍密集的点,从中低缩放开始参与显示 | +| `400000` | `8.1` | 中密度点,需要进一步放大 | +| `50000` | `10.6` | 高密度点,需要较高缩放级别 | +| `0` | `12.2` | 极密集点,只有更高缩放才进入候选 | + +## 5. 当前展开布局 + +展开阶段由 `point-layer-manager.ts` 控制。 + +### 5.1 布局特点 + +当前布局不是简单把点随机散开,而是按以下方式处理: + +- 主点保留原位置 +- 同组其他点围绕主点展开 +- 展开方向优先偏下方 +- 单圈数量由 `ringSize` 控制 +- 点数较多时进入第二圈 +- 第二圈半径按 `ringGapPx` 和 `ringGapFactor` 继续增大,避免继续叠在一起 + +### 5.2 为什么优先向下展开 + +当前优先向下展开,主要是为了: + +- 尽量给上方文字留空间 +- 降低文字压住上方点的概率 +- 让地图上的抽吸形态更稳定 + +## 6. 当前实现的几个关键约束 + +### 6.1 不使用淡入淡出动画 + +目前已移除点和文字的淡入淡出动画。 + +原因: + +- 抽吸状态切换和动画叠加时,容易让点和文字出现闪烁 +- 会干扰对“当前到底该不该显示”的判断 + +当前阶段优先保证: + +- 显示规则稳定 +- 点和文字状态一致 +- 放大缩小时不出现明显错位 + +### 6.2 不再依赖 OL 的自动 declutter 决定图标命运 + +当前图标和文字都设置为 `declutterMode: 'none'`,由项目内逻辑统一控制。 + +这样做的原因: + +- 避免图标和文字落在两套碰撞体系里 +- 避免出现“文字先出来、点没出来” +- 避免文字压住其他点却仍然显示 + +## 7. 常见现象与调参建议 + +### 7.1 成组太少 + +表现: + +- 相近点仍然容易互相盖住 +- 进入展开前看起来还是压在一起 + +优先调整: + +- 增大 `distanceThresholdMeters` + +### 7.2 成组太多 + +表现: + +- 距离并不算近的点也被当成一组 +- 放大后过早进入抽吸关系 + +优先调整: + +- 减小 `distanceThresholdMeters` + +### 7.3 展开太晚 + +表现: + +- 放大到较深层级前仍然挤在一起 + +优先调整: + +- 减小 `expandAtZoom` + +### 7.4 展开太早 + +表现: + +- 中等缩放时地图上就出现较明显散开效果 + +优先调整: + +- 增大 `expandAtZoom` + +### 7.5 展开后间距不够 + +表现: + +- 虽然已经展开,但图标还是比较挤 + +优先调整: + +- 增大 `expandOffsetPx` +- 或增大 `ringGapPx` +- 或增大 `ringGapFactor` + +### 7.6 单圈散开角度不合适 + +表现: + +- 次点虽然已经展开,但仍然集中在一侧 +- 或者扇形过大,展开形态显得太散 + +优先调整: + +- 调整 `fanAngleForTwoDeg` +- 调整 `fanAngleForFourDeg` +- 调整 `fanAngleForManyDeg` + +### 7.7 主点在放大过程中突然消失 + +当前已经通过 `replaceAtZoom <= zoom < expandAtZoom` 阶段显示 `priority <= 2` 进行修正。 +如果后续又出现类似现象,优先检查: + +- `map.ol.ts` 中 `shouldRenderNearbyFeature()` 的阶段逻辑 +- 是否误改成只显示 `priority = 2` + +### 7.8 明明周围看起来空,文字还是不显示 + +优先检查: + +- 图标碰撞盒是否过大 +- 文字碰撞盒是否过于保守 +- 候选集是否发生重复统计 + +相关代码主要在: + +- `src/components/gis/map.ol.ts` + +## 8. 后续维护建议 + +建议后续继续保持以下约定: + +1. 抽吸参数继续统一放在 `nearby-point-rules.ts` +2. 显示决策继续集中在 `map.ol.ts` +3. 几何偏移继续集中在 `point-layer-manager.ts` +4. 后续调参优先改 `DEFAULT_NEARBY_POINT_CONFIG`,不要直接把数值散落回业务代码 +5. 如果继续加动画,必须放在抽吸状态机完全稳定之后 +6. 如果继续优化 popup,也要同步遵循“点先于文字”的显示原则 + +## 9. 当前结论 + +当前这版抽吸实现已经形成了比较稳定的主线: + +- 自动识别近邻点 +- 统一缩放阶段显示规则 +- 展开阶段几何偏移 +- 文字依赖点显示 +- 文字避让图标与文字 + +后续如果继续调优,建议先从参数层开始,不要先动主逻辑结构。 diff --git a/frontend-sjgl/docs/地图模块-详细说明.md b/frontend-sjgl/docs/地图模块-详细说明.md new file mode 100644 index 00000000..1dbede0c --- /dev/null +++ b/frontend-sjgl/docs/地图模块-详细说明.md @@ -0,0 +1,621 @@ +# 地图模块-详细说明 + +## 1. 文档目的 + +本文档用于说明当前地图模块的真实运行结构、初始化时序、图层与图例联动、点位渲染规则、筛选与缩放行为,以及近期已经落地的关键约束。 + +本文档描述的是“当前可运行版本”的现状,不展开抽吸参数细节与专项问题分析。相关补充文档如下: + +- `docs/地图模块-抽吸规则与参数说明.md` +- `docs/地图模块-OpenLayers抽吸与碰撞分析.md` + +## 2. 当前技术栈 + +- 前端框架:Vue 3 + TypeScript + Ant Design Vue +- 状态管理:Pinia +- 2D 地图引擎:OpenLayers 10.8.0 +- 3D 地图引擎:Cesium +- 地图服务:GeoServer / WMTS / XYZ +- 运行模式:后台配置驱动 + 前台运行时编排 + +说明: + +- 当前 2D 主链路已经完全围绕 OpenLayers 组织。 +- 项目中仍保留 Leaflet 相关依赖和旧代码,但不是当前主执行路径。 + +## 3. 模块分层 + +当前地图模块可以按 6 层理解: + +1. 页面入口层 +2. 应用编排层 +3. 地图能力门面层 +4. 地图引擎执行层 +5. Store 运行态层 +6. 前台交互组件层 + +对应核心文件如下: + +- 页面入口层 + - `src/components/gis/GisView.vue` +- 应用编排层 + - `src/modules/map/application/map-orchestrator.ts` +- 地图能力门面层 + - `src/components/gis/map.class.ts` +- 地图引擎执行层 + - `src/components/gis/map.ol.ts` + - `src/components/gis/map.cesium.ts` + - `src/components/gis/ol/point-layer-manager.ts` + - `src/components/gis/ol/popup-manager.ts` +- Store 运行态层 + - `src/store/modules/map.ts` + - `src/modules/map/stores/map-config.store.ts` + - `src/modules/map/stores/map-data.store.ts` + - `src/modules/map/stores/map-view.store.ts` +- 前台交互组件层 + - `src/components/mapLegend/index.vue` + - `src/components/mapFilter/index.vue` + - `src/components/mapController/index.vue` + - `src/components/mapController/LayerController.vue` + - `src/components/BaseLayerSwitcher/index.vue` + +## 4. 整体原则 + +当前地图模块遵循以下几个运行原则: + +### 4.1 地图容器全局常驻 + +地图由 `GisView.vue` 常驻挂载,不会随着菜单切换被销毁重建。页面切换本质上是: + +- 重新计算 `pageKey` +- 重新加载该页图层配置和图例配置 +- 用新的运行态覆盖旧页面显示内容 + +### 4.2 配置驱动 + +前端不把全部图层和图例硬编码死,而是依赖后端返回的: + +- 图层树配置 +- 图例配置 +- 页面级图例配置 +- 各业务点位接口数据 + +### 4.3 运行态绝对优先 + +初始化默认值只在第一次派生时生效;一旦进入运行态,后续图层勾选、图例勾选、筛选器切换,都必须以当前用户操作后的状态为准,不能在加载完成后回退到默认状态。 + +## 5. 页面入口层 + +### 5.1 `GisView.vue` + +`GisView.vue` 的职责主要是: + +- 提供地图容器 `#mapContainer` +- 提供 popup 挂载容器 +- 挂载图例、筛选器、控制器、底图切换器 +- 根据路由计算 `pageKey` +- 在挂载时调用 `mapOrchestrator.mountView()` +- 在页面切换时交给编排器重载页面 + +当前页面层已经不再直接承载复杂业务逻辑,复杂链路都收敛到了编排器和 Store。 + +## 6. 应用编排层 + +### 6.1 `map-orchestrator.ts` 的职责 + +`map-orchestrator.ts` 是当前地图业务的总调度中心,主要负责: + +- 初始化地图壳与 popup +- 加载页面图层配置和图例配置 +- 初始化 GIS 基础图层 +- 触发点位图层加载 +- 管理缩放监听和基地切换监听 +- 处理图层树勾选 +- 处理图例勾选 +- 处理时间筛选、容量筛选、搜索定位 +- 处理水电开发菜单下的缩放联动图层 + +### 6.2 页面初始化链路 + +当前初始化顺序如下: + +1. `GisView.vue` 调用 `mapOrchestrator.mountView()` +2. `MapClass.init()` 初始化地图实例 +3. 页面级 popup 容器挂到地图实例 +4. 绑定缩放监听和基地监听 +5. 并行请求图层树配置与图例配置 +6. 图例接口先返回时,立即生成图例运行态 +7. 图层树接口返回后,生成默认勾选图层并初始化 GIS 基础图层 +8. 再按图层配置批量加载点位数据 + +这里有两个当前已落地的关键时序调整: + +- 图例转圈只跟图例接口绑定,不再等待所有锚点接口完成。 +- 筛选器数据会随着已加载图层逐步出现,不再必须等全量点位接口结束。 + +### 6.3 页面切换 + +页面切换时地图不销毁,只重载当前页面的: + +- 图层树配置 +- 图例配置 +- 点位数据 +- 当前页面的默认运行态 + +如果仍处于同一个 `pageKey` 且用户之前修改过勾选态,会尽量复用当前运行态,而不是重新回放默认勾选。 + +### 6.4 缩放联动 + +当前编排层主要有两类缩放联动: + +- `eng_point` 缩放联动 + - 大型电站始终允许显示 + - 中型电站仅在 `zoom > 7.5` 时进入显示候选 +- 水电开发菜单动态图层联动 + - `HYDRO_DYNAMIC_LAYER_KEYS` 在缩放跨越阈值时参与加载与显隐编排 + +## 7. 地图能力门面层 + +### 7.1 `map.class.ts` + +`MapClass` 是地图能力统一门面,屏蔽 2D / 3D 引擎差异,对外暴露统一方法。 + +当前常用能力包括: + +- `init()` +- `initPopupOverlay()` +- `addBaseDataLayer()` +- `addInitDataLayer()` +- `mdLayerTreeShowOrHidden()` +- `controlBaseLayerTreeShowAndHidden()` +- `setLegendPointVisible()` +- `hasLayer()` +- `hasBaseLayer()` +- `removePointLayer()` +- `flyTopanto()` +- `switchView()` + +当前业务主执行层仍然是 `MapOl`。 + +## 8. 地图引擎执行层 + +### 8.1 OpenLayers 主执行层 + +`map.ol.ts` 负责 OpenLayers 地图的实际渲染与交互,是当前 2D 地图主执行文件。 + +当前承担的核心能力包括: + +- 地图实例初始化 +- 底图与 GIS 图层管理 +- 点位图层渲染 +- 图标与文字样式生成 +- hover popup 与批量 popup +- 基地范围裁切 +- 高缩放交互 +- 测量、截图、飞行定位等基础地图能力 + +### 8.2 Cesium 执行层 + +`map.cesium.ts` 目前更多是保留 3D 入口和部分基础能力,复杂业务点位与碰撞规则并未与 OpenLayers 完全对齐。 + +结论上,当前真实业务规则仍然以 OpenLayers 链路为准。 + +## 9. Store 分层 + +### 9.1 `map-config.store.ts` + +负责配置态数据: + +- 图层树配置 +- 图层配置索引 +- 全量原始图例配置 +- 图例索引 +- 页面级图例配置 +- 配置接口加载状态 + +当前这里拆分出了两个加载态: + +- `configLoading` +- `legendLoading` + +其中 `legendLoading` 单独控制图例转圈。 + +### 9.2 `map-data.store.ts` + +负责数据态: + +- `pointData` +- `pointDataCache` +- `layerLoadState` +- 地图整体 `loading` + +这里的关键设计是: + +- 每个点图层有独立缓存 +- `pointData` 是由缓存合并出来的运行态数据 +- 单个图层命中缓存或接口返回后,就会立即回填 `pointData` + +因此当前搜索筛选下拉已经支持“渐进可用”,不再只能等全部接口结束。 + +### 9.3 `map-view.store.ts` + +负责视图运行态: + +- 当前勾选图层 `checkedLayerKeys` +- 图例勾选状态 `legendCheckedState` +- 搜索时间范围 +- 当前基地 +- 当前缩放级别 + +### 9.4 `src/store/modules/map.ts` + +这是当前地图运行逻辑最重的 Store,负责串联配置、缓存和地图实例。 + +主要职责包括: + +- 生成图例运行态 +- 批量加载点位数据 +- 控制图层显隐 +- 控制图例显隐 +- 管理请求缓存与并发加载 +- 刷新点图层显示数据 +- 处理 `eng_point` 的显示过滤 +- 在全量点位准备完成后挂载近邻点元数据 + +## 10. 图层分类 + +当前地图里的图层大体可以分成三类: + +### 10.1 `GISMap` + +这类图层对应 GIS 基础图层或专题底图,由 `addBaseDataLayer()` 加载到 `layerRegistry`。 + +当前已补充的规则: + +- 勾选 `GISMap` 时,不能只做显示/隐藏。 +- 如果地图实例中不存在该图层,需要先重新加载,再显示。 + +### 10.2 点位图层 + +这类图层由接口返回锚点数据,最终进入 `PointLayerManager` 维护的 `VectorLayer`。 + +### 10.3 其他专题图层 + +例如梯级流域、区域裁切辅助层等,这些更多由 `map.ol.ts` 单独控制。 + +## 11. 图层数据加载机制 + +### 11.1 配置与数据分离 + +当前初始化时,配置加载与点位数据加载是两条链: + +- 图层树配置决定有哪些层、哪些默认勾选 +- 图例配置决定图例结构和图例项元数据 +- 点位数据接口决定地图上实际锚点内容 + +### 11.2 加载顺序 + +`loadAllLayerData()` 的主要逻辑是: + +1. 先收集所有带 URL 的图层 +2. 把默认勾选图层作为高优先级任务 +3. 收集完成后全量并发加载,不再按 4 个一组分批发起 +4. 每个图层完成后立即写入缓存 +5. 每个图层命中缓存或返回成功后,立即增量更新 `pointData` +6. 全部图层结束后,再统一: + - 回填每层原始数据 + - 挂载近邻点运行时元数据 + - 刷新各图层显示数据 + - 用最新运行态收尾 + +### 11.3 初始化阶段的图例绝对性 + +当前已修复一个关键问题: + +- 图例虽然可能在界面上还在 loading +- 但只要图例配置已经返回,默认隐藏的图例项在点位首批入图时就必须生效 + +也就是说,现在不会再出现: + +- loading 过程中先显示默认隐藏点 +- loading 结束后才消失 + +## 12. 图例机制 + +### 12.1 图例来源 + +图例运行态由以下数据共同决定: + +- 原始全量图例配置 +- 当前页面图例配置 +- 当前已勾选图层 +- 当前图例勾选状态 + +### 12.2 图例派生 + +图例最终显示的是 `legendDataSelected`,而不是全量图例。 + +派生逻辑核心原则如下: + +- 只有当前勾选图层对应的图例项才进入页面图例 +- 图例勾选状态是运行态绝对值 +- 环保设施分组有单独规则 + +### 12.3 图例加载时机 + +当前图例面板的 loading 只跟图例接口绑定: + +- 图例接口返回后立即停转 +- 图例内容在图层默认勾选同步后立即派生 +- 不再等待所有锚点接口完成 + +## 13. 筛选器机制 + +### 13.1 `MapFilter` 的职责 + +筛选器当前包含以下能力: + +- 时间范围筛选 +- 装机容量筛选 +- 搜索定位 +- 个别页面的专题筛选项 + +### 13.2 搜索下拉来源 + +搜索下拉使用 `mapDataStore.pointData` 作为数据源。 + +当前行为已经调整为: + +- 某个图层一旦命中缓存,筛选器即可出现该图层点位 +- 某个图层接口一旦返回成功,筛选器也会立即出现该图层点位 + +因此筛选器当前是“渐进展示”,而不是“全量完成后一次性展示”。 + +### 13.3 装机容量筛选 + +装机容量筛选针对 `eng_point` 图层,当前规则如下: + +- `all` + - 恢复大型与中型图例 +- `large_eng_built` + - 只保留 `large_eng_` 前缀相关图例 + - 地图上只显示大型电站点位 +- `mid_eng_built` + - 只保留 `mid_eng_` 前缀相关图例 + - 地图上只显示中型电站点位 + +当前容量切换不再只是影响筛选器本地下拉,而是会同步驱动: + +- 图例运行态 +- `eng_point` 点位显示 + +## 14. `eng_point` 专项规则 + +`eng_point` 是当前地图模块中的特殊图层,存在独立显示规则。 + +### 14.1 缩放规则 + +在数据入图阶段就生效: + +- 大型电站始终允许显示 +- 中型电站仅在 `zoom > 7.5` 时允许进入显示候选 + +这不是单纯的图例控制,而是点位入图时的过滤逻辑。 + +### 14.2 图例规则 + +点位入图之后,仍然必须再经过图例运行态控制: + +- 允许入图,不等于最终可见 +- 只要图例勾选为隐藏,该类点位就必须隐藏 + +### 14.3 容量筛选规则 + +装机容量下拉会进一步批量控制 `eng_point` 的图例项,使图例与点位同步切换。 + +## 15. 点位显示裁决链 + +当前点位最终是否显示,至少会经过以下几层判断: + +1. 图层是否勾选 +2. 图例是否勾选 +3. 基地范围是否允许 +4. `eng_point` 缩放过滤是否通过 +5. `distance` 密度分档是否通过 +6. 近邻点显示阶段是否通过 +7. 图标是否已加载完成 +8. 当前缩放下是否进入碰撞控制 + +这几层不是互斥关系,而是叠加裁决。 + +## 16. 点位渲染与样式 + +### 16.1 基础样式 + +当前点位渲染包括: + +- 图标 +- 文字标签 +- 标签换行与截断 +- 缩放相关的图标与文字样式变化 + +### 16.2 图标加载约束 + +当前已经补充图标加载状态缓存: + +- 图标未加载完成时,不显示该点 +- 图标未加载完成时,文字也不先显示 +- 图标未加载完成时,不参与碰撞候选 + +这样可以避免“文字先出来、图标还是空的”的问题。 + +## 17. 抽吸、密度与碰撞 + +### 17.1 专项文档 + +抽吸与密度分档的详细参数请查看: + +- `docs/地图模块-抽吸规则与参数说明.md` + +### 17.2 当前裁决顺序 + +当前点位显示顺序可以理解为: + +1. 密度分档 +2. 近邻抽吸 +3. 图标碰撞 +4. 文字碰撞 + +补充约束: + +- 只有满足可见性条件的点,才能进入碰撞候选集 +- 被图例或缩放过滤掉的点,不能再去占用碰撞资格 +- 视图内无近邻的孤立点允许局部放行 + +### 17.3 高缩放特例 + +当前在高缩放层级 `zoom >= 15` 时,行为与中低缩放不同: + +- 只处理视口内点位 +- 点与文字不再做碰撞淘汰 +- 视口内符合基础显示条件的点和文字全部显示 +- 同时进入批量 popup 模式 + +这条规则的目标是: + +- 保证深度放大后信息完整可见 +- 避免高缩放下还因为碰撞把点或文字压掉 + +## 18. Popup 机制 + +### 18.1 两类 popup + +当前 popup 分成两类: + +- hover popup +- batch popup + +### 18.2 hover popup + +鼠标悬停时由 `pointermove` 驱动,只在非 batch popup 模式下显示。 + +### 18.3 batch popup + +在 `zoom >= 15` 时进入批量 popup 模式: + +- 只基于当前视口内点位 +- 拖动地图时持续刷新 +- 但通过 `requestAnimationFrame` 做节流 +- `moveend` 后立即再做一次强制刷新 + +当前这样做是为了兼顾两件事: + +- 保留“拖动时 popup 跟着更新”的原交互 +- 避免拖动过程中每个事件都重建整批 DOM + +### 18.4 惯性平移已关闭 + +当前地图拖动已经关闭 OpenLayers 默认惯性平移: + +- 普通拖动仍然保留 +- 松手后不再继续滑动一小段 + +这样可以减少高缩放 popup 场景下“松手还轻微位移”的观感问题。 + +## 19. 基地与区域过滤 + +基地切换是当前地图模块的关键能力之一,主要影响: + +- 地图裁切范围 +- 当前基地相关点位的可见性 +- 部分专题图层显示 + +整体过程通常是: + +1. 外部基地选择源变化 +2. 编排器接收到基地 ID +3. 地图实例切换基地范围 +4. 点位更新 `_regionVisible` +5. 样式函数按区域可见性决定是否显示 + +## 20. 典型交互链路 + +### 20.1 图层树勾选 + +1. `LayerController` 触发勾选变化 +2. 编排器归一化图层 key +3. `map.ts` 更新运行态图层勾选 +4. 地图实例更新图层显隐 +5. 图例重新派生 + +补充: + +- `GISMap` 勾选时,如果地图里没有该图层,会先补载,再显示 + +### 20.2 图例勾选 + +1. 图例组件触发点击 +2. 编排器转发图例切换 +3. `map.ts` 更新图例运行态 +4. 对应点位立即更新显隐 +5. 图例树同步更新灰态 + +### 20.3 筛选器操作 + +1. 用户切换时间、容量、搜索等条件 +2. 编排器接收命令 +3. 视情况更新视图运行态或重载数据 +4. 地图实例与图例运行态同步刷新 + +### 20.4 缩放操作 + +1. OpenLayers 视图触发 `change:resolution` +2. 编排器更新当前缩放级别 +3. 处理 `eng_point` 阈值联动 +4. 水电开发菜单下处理动态图层联动 +5. `map.ol.ts` 处理高缩放 popup 与点位显示策略 + +## 21. 当前重点文件清单 + +- `src/components/gis/GisView.vue` +- `src/components/gis/map.class.ts` +- `src/components/gis/map.ol.ts` +- `src/components/gis/map.cesium.ts` +- `src/components/gis/gisUtils.ts` +- `src/components/gis/mapurlManage.ts` +- `src/components/gis/ol/point-layer-manager.ts` +- `src/components/gis/ol/popup-manager.ts` +- `src/modules/map/application/map-orchestrator.ts` +- `src/modules/map/stores/map-config.store.ts` +- `src/modules/map/stores/map-data.store.ts` +- `src/modules/map/stores/map-view.store.ts` +- `src/store/modules/map.ts` +- `src/components/mapLegend/index.vue` +- `src/components/mapFilter/index.vue` +- `src/components/mapController/index.vue` +- `src/components/mapController/LayerController.vue` +- `src/components/BaseLayerSwitcher/index.vue` + +## 22. 当前结论 + +当前地图模块已经形成比较清晰的主干结构: + +- `GisView` 负责挂载与页面入口 +- `map-orchestrator` 负责业务编排 +- `MapClass` 负责能力门面 +- `MapOl` 负责 2D 主执行 +- `map.ts + 三个拆分 store` 共同维护配置、数据与视图运行态 +- 图层树、图例、筛选器、popup、高缩放规则都已经围绕这条主干收口 + +相较旧版说明,当前最重要的现状变化有 8 点: + +1. 图例 loading 已与锚点全量加载解耦 +2. 筛选器数据已支持渐进展示 +3. 初始化阶段默认隐藏图例项会立即生效 +4. 运行态勾选不会在 loading 完成后被默认值覆盖 +5. `eng_point` 有独立的缩放与容量规则 +6. 高缩放下视口内点和文字全部显示,不再做碰撞淘汰 +7. batch popup 保留拖动跟随,但增加了节流 +8. 地图拖动惯性已关闭 + +后续如果继续扩展地图功能,建议仍然优先沿着“编排层 + Store 分层 + OpenLayers 执行层”这条主干扩展,不要再把复杂业务回填到页面组件里。 diff --git a/frontend-sjgl/docs/地图模块现状与改造方案.md b/frontend-sjgl/docs/地图模块现状与改造方案.md new file mode 100644 index 00000000..181bb0e0 --- /dev/null +++ b/frontend-sjgl/docs/地图模块现状与改造方案.md @@ -0,0 +1,1158 @@ +# 地图模块现状与改造方案 + +## 1. 文档目的 + +本文档用于完整梳理当前地图模块的技术实现、业务能力、数据流转、关键规则、已知问题与性能瓶颈,并给出可分阶段落地的重构方案。目标是: + +- 让地图模块职责边界清晰,便于后续新增功能; +- 降低组件、Store、地图引擎之间的耦合; +- 优化基础图层、锚点、图例、筛选、基地裁切等功能的响应速度; +- 为后续 2D/3D 扩展、复杂专题图层、更多筛选维度、更多交互能力预留稳定结构。 + +--- + +## 2. 当前模块范围 + +当前地图模块覆盖以下业务能力: + +- 地图初始化与 2D/3D 切换; +- GeoServer 基础底图、叠加图层、区域矢量图层加载; +- Java 后端锚点数据请求、缓存、渲染; +- 右侧图层树勾选控制图层显示与隐藏; +- 左侧图例基于图层选中结果动态生成; +- 图例项点击控制锚点显隐; +- 基地选择后底图裁切与区域外锚点隐藏; +- 地图悬停 Popup、点击详情弹窗; +- 搜索、时间筛选、容量筛选、基地筛选; +- 某些业务图层的互斥显示与特殊联动; +- 局部专题菜单下的缩放级别联动动态图层。 + +--- + +## 3. 当前技术实现概览 + +## 3.1 技术栈 + +- 地图引擎:OpenLayers 作为 2D 主引擎,Cesium 作为 3D 引擎入口; +- 状态管理:Pinia; +- UI 框架:Vue 3 + `script setup` + Ant Design Vue; +- 数据来源: + - GeoServer:基础底图、WMTS、XYZ、GeoJSON 边界; + - Java 后端接口:图层配置、图例配置、锚点数据; +- 业务配置: + - 图层配置与图例配置来自后端; + - 锚点接口映射规则由 `src/store/modules/GisUrlList.ts` 维护。 + +## 3.2 核心文件职责 + +- `src/components/gis/GisView.vue` + + - 地图容器入口; + - 地图初始化; + - 拉取图层配置与图例配置; + - 监听菜单切换、基地切换、缩放联动; + - 挂载 `MapLegend`、`MapFilter`、`MapController`、`BaseLayerSwitcher`。 + +- `src/components/gis/map.class.ts` + + - 地图能力门面类; + - 对外屏蔽 OpenLayers / Cesium 差异; + - 当前主要起到转发作用。 + +- `src/components/gis/map.ol.ts` + + - OpenLayers 主实现; + - 负责底图、锚点图层、Popup、图层显隐、区域裁切、量算、定位等; + - 当前承担了过多业务规则与渲染控制逻辑。 + +- `src/store/modules/map.ts` + + - 地图图层树、图例、锚点、缓存的核心 Store; + - 负责图层选中状态、图例选中状态、锚点请求、缓存、图例联动、图层联动; + - 当前是业务与渲染耦合最重的文件之一。 + +- `src/components/mapController/LayerController.vue` + + - 图层树 UI; + - 负责初始基础图层加载; + - 勾选事件直接调用 Store 更新图层与图例状态; + - 包含多个互斥业务规则。 + +- `src/components/mapLegend/index.vue` + + - 图例展示; + - 基于当前选中图层动态显示; + - 图例点击后直接驱动地图锚点显隐。 + +- `src/components/mapFilter/index.vue` + + - 搜索、基地筛选、容量筛选、时间筛选; + - 直接依赖 `mapStore` 和地图实例; + - 部分筛选逻辑通过直接修改图例和锚点实现。 + +- `src/components/BaseLayerSwitcher/index.vue` + + - 底图模式切换器; + - 切换矢量 / 地形 / 影像底图。 + +- `src/components/gis/gisUtils.ts` + + - 图层结构拍平; + - 基础图层 URL 处理; + - 图例数据转对象; + - 若干地图布局相关工具。 + +- `src/api/map.ts` + - 拉取地图配置和图例配置。 + +--- + +## 4. 当前业务能力与逻辑链路 + +## 4.1 初始化流程 + +当前初始化主要发生在 `GisView.vue`: + +1. 调用 `MapClass.init()` 初始化 OpenLayers; +2. 调用 `initPopupOverlay()` 挂载悬停 Popup; +3. 调用 `fetchMapConfigs()` 并行请求: + - 地图图层配置; + - 全量图例配置; + - 当前页面图例配置; +4. `mapStore.setLegendData()` 初始化图例原始数据与映射; +5. `mapStore.setLayerData()` 初始化图层树和选中图层 key; +6. `mapStore.loadAllLayerData()` 递归加载所有有 URL 的图层数据; +7. `loadLayerData()` 将锚点数据写入缓存并直接调用 `mapClass.addInitDataLayer()` 预创建锚点图层; +8. 全部锚点加载完成后,再调用 `updateLayerData()` 统一控制初始显示状态; +9. 图例根据当前选中的图层动态生成并展示。 + +### 现状特点 + +- 当前是“初始化阶段一次性预加载大多数锚点图层,再通过显隐控制”的策略; +- 图例显示被设计为“锚点完成后再显示”; +- 地图实例、Store、UI 组件三方互相直接调用。 + +## 4.2 基础图层加载与切换 + +基础底图主要由 `LayerController.vue` 和 `map.ol.ts` 协同完成: + +- `LayerController.vue` 中监听图层树配置; +- 对类型为 `GISMap` 的节点解析 `paramJson`,通过 `getMapConfig()` 补齐 GeoServer 地址; +- 调用 `mapClass.addBaseDataLayer()` 初始化基础图层; +- 同时调用 `controlBaseLayerTreeShowAndHidden()` 控制显隐; +- `BaseLayerSwitcher` 再通过 `baseLayerSwitcher()` 在矢量 / 地形 / 影像底图之间切换。 + +当前基础图层类型主要包括: + +- WMTS:GeoServer WMTS 瓦片; +- XYZ:例如 DEM 或其他切片图层; +- vector:部分矢量底图或区域配置。 + +### 自然保护区图层特点 + +- 属于叠加在底图之上的 GIS 图层; +- 显隐仍通过基础图层控制逻辑处理; +- 与区域裁切场景存在较强耦合。 + +## 4.3 图层树勾选控制 + +右侧图层树由 `LayerController.vue` 驱动: + +- 树节点勾选结果通过 `broadcast()` 调用 `mapStore.updateLayerData()`; +- 图层树中包含多种特殊规则: + - 视频监控站与 AI 视频监控站互斥; + - 环保设施和环保设施在建互斥; + - 珍稀鱼类与沿程鱼类互斥; +- 初始选中状态通过递归遍历图层树生成。 + +### 现状问题 + +- 互斥逻辑分散在 UI 组件和 Store 两处; +- “图层树状态”与“地图真实状态”并非单向流; +- 图层节点既承担展示,又携带业务配置与运行态字段。 + +## 4.4 锚点数据加载 + +锚点数据由 `mapStore.loadAllLayerData()` 和 `loadLayerData()` 负责: + +- 遍历图层树中全部带 URL 的图层; +- 使用 `GisUrlList.ts` 将图层 key / title / url 映射成真实请求地址、筛选条件、排序规则; +- 请求 Java 接口; +- 将返回记录补充: + - `iconCode` + - `code` + - `_id` + - `tm` +- 然后缓存到: + - `pointDataCache[layerKey]` + - `layer.data` + - 合并后的 `pointData` +- 若地图上还不存在该图层,则直接调用 `mapClass.addInitDataLayer()` 创建 `VectorLayer`。 + +### 当前锚点渲染方式 + +- 每个 `pointMap` 图层对应一个 `VectorLayer`; +- 每个点被转为 `Feature`; +- Feature 上维护多个运行态字段: + - `_iconUrl` + - `_labelText` + - `_legendVisible` + - `_regionVisible` + - `_layerKey` +- 样式函数 `createPointStyle()` 在渲染时综合判断: + - 图例是否显示; + - 是否在基地区域内; + - 当前缩放级别; + - 点之间距离阈值; + - 是否悬停。 + +## 4.5 图例动态生成与点击联动 + +图例数据来源于两部分: + +- `legendDataOriginal`:后端返回的全量图例; +- `legendDataSelected`:根据当前选中的图层动态筛选后的图例结构。 + +当前机制: + +1. 初始化时拉取全部图例; +2. 通过 `layerCode` 与图层树选中结果建立关联; +3. `mapStore.updateLayerData()` 重新计算当前选中的图例树; +4. `MapLegend` 监听 `legendDataSelected` 进行展示; +5. 点击图例项后: + - 更新 Store 中图例 checked 状态; + - 若是锚点图层,则调用 `mapClass.setLegendPointVisible()`; + - 若是 GIS 图层,则调用 `controlBaseLayerTreeShowAndHidden()`。 + +### 环保设施特殊逻辑 + +- 勾选 `fp_point`、`eq_point`、`fb_point`、`vp_point`、`va_point`、`sg_point`、`dw_point` 中任意图层时,图例自动补充“环保设施”分组; +- 全部取消时自动移除该图例分组。 + +## 4.6 筛选与搜索 + +`MapFilter` 负责以下功能: + +- 装机容量筛选; +- 锚点关键字搜索; +- 时间筛选; +- 基地筛选; +- 个别专题下的鱼类分布筛选。 + +当前实现方式: + +- 搜索下拉列表从 `pointData` 里计算; +- 只展示当前已选中图层中的锚点; +- 容量筛选直接修改图例状态,并调用 `map.mdLayerShowOrHidden()` 控制 feature 显隐; +- 时间筛选通过 `mapStore.updateSearchTimeRange()` 清缓存、删图层、重新请求; +- 基地切换通过监听 `JidiSelectEventStore.selectedItem` 联动地图区域裁切。 + +## 4.7 基地选择与区域裁切 + +基地逻辑入口在 `GisView.vue` 监听器中: + +- 当基地变化时,调用 `mapClass.jdPanelControlShowAndHidden()`; +- `map.ol.ts` 内会: + - 更新当前 `BASEID`; + - 请求基地 GeoJSON 边界; + - 隐藏所有锚点; + - 通过射线法判断锚点是否在区域内; + - 标记 `_regionVisible`; + - 调整视角; + - 对底图应用遮罩。 + +### 该能力的业务效果 + +- 只显示当前基地区域内的锚点; +- 底图裁切到当前基地范围; +- 全选时取消遮罩并显示全部锚点。 + +## 4.8 Popup 与点击详情 + +当前交互如下: + +- `pointermove` 时调用 `detectFeatureAtPixel()` 检查命中点要素; +- 若命中图标区域,则: + - 更新鼠标指针; + - 更新 `hoveredFeatureId`; + - 调用 `showPopup()` 展示悬停浮窗; + - 重绘所有点图层; +- `click` 命中点要素时,打开详情弹窗并将 feature 属性写入 `modelStore`。 + +### 当前特点 + +- Popup 内容由 `popupHtml` 或 `generatePopupHtml(props)` 生成; +- 命中检测采用逐像素回调加距离二次判断; +- 所有点图层在 hover 状态切换时都会 `layer.changed()`。 + +## 4.9 菜单与缩放级别联动 + +在水电开发状况菜单下: + +- 地图缩放级别大于等于 12 时自动添加一组动态图层; +- 缩回 12 以下时自动移除; +- 菜单切换时会根据当前层级重新判断是否添加。 + +当前动态图层 key 包括: + +- `dw_point` +- `stinfo_video_point` +- `stinfo_gjllz_point` +- `wt_point` +- `wq_ownWq_point` +- `wq_countryWq_point` +- `fp_point` +- `eq_point` +- `fb_point` +- `vp_point` +- `va_point` +- `sg_point` + +--- + +## 5. 当前数据流与调用关系 + +当前主数据流可概括为: + +1. `GisView.vue` 拉取配置; +2. `mapStore` 保存图层树、图例、缓存; +3. `LayerController.vue` / `MapLegend.vue` / `MapFilter.vue` 直接操作 `mapStore`; +4. `mapStore` 又直接调用 `mapClass`; +5. `mapClass` 继续转发到 `map.ol.ts`; +6. `map.ol.ts` 内部维护图层注册表和 Feature 运行态; +7. 地图状态变化后,组件又通过监听 Store 再次更新 UI。 + +### 现有结构本质 + +当前是“多入口、多方向写状态”的结构: + +- 组件可以改 Store; +- 组件可以直接调地图; +- Store 可以直接调地图; +- 地图内部又维护一套运行态; +- 图例、图层树、地图显隐存在多份状态镜像。 + +这会导致: + +- 状态同步成本高; +- 某些场景下容易出现 UI 勾选状态与实际地图状态不一致; +- 新增规则时只能继续在现有逻辑上叠加 `if/else`。 + +--- + +## 6. 当前存在的主要问题 + +## 6.1 架构层面问题 + +### 1. UI、业务编排、地图渲染耦合过深 + +- `LayerController.vue`、`MapLegend.vue`、`MapFilter.vue` 都直接调 Store 和地图实例; +- `map.ts` 同时负责: + - 请求; + - 缓存; + - 图例结构整理; + - 图层勾选; + - 地图显隐; + - 业务互斥; +- `map.ol.ts` 同时负责: + - OpenLayers 适配; + - 业务过滤; + - 区域裁切; + - 弹窗; + - 图例控制; + - 锚点显示策略。 + +### 2. 缺乏清晰的单向数据流 + +- 图层树 checked、图例 checked、Feature `_legendVisible`、Layer visible 都是状态源; +- 任何一个点修改后都可能触发联动,难以推断最终状态; +- 某些流程依赖顺序正确才能表现正常。 + +### 3. 业务规则分散 + +- 互斥规则分散在 `LayerController.vue` 和 `map.ts`; +- 环保设施图例补充逻辑在 `map.ts`; +- 装机容量筛选逻辑在 `MapFilter.vue`; +- 基地区域过滤逻辑在 `map.ol.ts`; +- 这些规则没有统一归口,新增业务会继续扩大分散度。 + +## 6.2 性能问题 + +### 1. 初始化阶段预加载过重 + +- `loadAllLayerData()` 会递归处理大量图层; +- 即使图层未勾选,也会提前请求并建图层; +- 页面首次进入时网络压力和首屏渲染压力较大。 + +### 2. 递归遍历频繁 + +- 图层树查找 `findLayerByKey()` 多次递归; +- 图例生成 `getlegendData()` 递归; +- `updateLayerData()` 每次变化都要递归更新 checked 状态; +- 搜索项计算 `anchorPointOptions` 也会递归收集图层 key。 + +### 3. 锚点显隐是全量 feature 遍历 + +- 图例点击时逐个遍历 feature; +- 基地裁切时逐个 feature 做点在面内判断; +- hover 时所有点图层重绘; +- 缩放变化会重复执行样式计算。 + +### 4. 底图切换会 remove / add 图层 + +- `baseLayerSwitcher()` 每次切换都移除旧底图再新增; +- 对 WMTS / XYZ 来说会造成重复创建图层对象和重复请求开销。 + +## 6.3 一致性与可靠性问题 + +### 1. 存在明显临时代码与未收敛逻辑 + +- `GisView.vue` 中 `fetchMapConfigs()` 里对图层做了 `splice(0, 2)` 临时截断; +- 日志仍显示“临时限制”,说明线上逻辑可能仍处于测试状态。 + +### 2. 存在未定义引用 + +- `GisView.vue` 切换地图后调用 `fetchPointData()`,但项目中未找到定义; +- `map.ts` 中使用了 `wq_lineTime`、`wt_lineTime`,但项目中未找到定义。 + +### 3. 请求去重逻辑未真正落地 + +- `map.ts` 中生成了 `requestIdentifier`,但未实际用于请求去重; +- `requestParamsCopy` 也未参与有效逻辑。 + +### 4. 图层状态与渲染状态容易失同步 + +- `layer.checked`、`checkedLayerKeys`、图例 checked、Feature 可见状态是多份数据; +- 其中任意一份被跳过更新,就可能出现视觉不一致。 + +### 5. 部分代码存在明显遗留痕迹 + +- `addInitDataLayer()` 中存在无意义语句 `3;`; +- 有重复日志; +- 有注释掉的大量旧逻辑; +- 说明代码迁移过程中缺乏结构性收口。 + +## 6.4 可维护性问题 + +### 1. Store 过大 + +- `map.ts` 既是数据仓库,又是调度器,又是业务规则中心; +- 后续新增图层类型、筛选类型、专题逻辑时,文件会持续膨胀。 + +### 2. MapOl 职责过多 + +- 当前 `map.ol.ts` 既是 OpenLayers 适配器,又是图层经理、锚点经理、Popup 经理、区域裁切经理; +- 单文件理解和修改成本已经偏高。 + +### 3. 缺少规范化类型系统 + +- 大量 `any`; +- 图层配置、图例配置、锚点数据、请求映射结构都没有稳定类型; +- 特殊图层规则依赖字符串常量散落在各处。 + +--- + +## 7. 改造目标 + +本次改造建议达成以下目标: + +### 7.1 结构目标 + +- 建立清晰的四层结构:视图层、应用编排层、领域状态层、地图渲染层; +- 收拢业务规则,不再散落到多个 UI 组件和地图引擎实现中; +- 建立稳定的数据模型与类型定义。 + +### 7.2 性能目标 + +- 首屏只加载必要图层; +- 选中图层优先加载,未选中图层延后或懒加载;(待考虑) +- 图例切换、基地切换、搜索筛选尽量使用索引和差量更新; +- 减少重复递归、重复建图层、重复样式重算。 + +### 7.3 维护目标 + +- 新增图层类型、专题规则、图例规则时有固定扩展点; +- 2D/3D 共享统一业务层,底层只替换渲染适配器; +- 可以较容易增加埋点、日志、调试工具和单元测试。 + +--- + +## 8. 目标架构设计 + +建议将地图模块拆分为四层: + +## 8.1 视图层 + +只负责展示和用户交互,不直接编写复杂业务逻辑。 + +建议保留的组件: + +- `GisView.vue` +- `LayerController.vue` +- `MapLegend.vue` +- `MapFilter.vue` +- `BaseLayerSwitcher.vue` + +视图层职责: + +- 展示树、图例、筛选项、底图切换器; +- 分发用户动作; +- 订阅 Store 派生结果; +- 不直接调用 `map.ol.ts` 里的业务方法。 + +## 8.2 应用编排层 + +新增地图编排层,建议命名为: + +- `src/modules/map/application/map-orchestrator.ts` +- 或 `src/components/gis/core/orchestrator.ts` + +职责: + +- 承接 UI 动作; +- 统一处理“图层勾选、图例勾选、基地切换、时间筛选、搜索定位、底图切换”等命令; +- 控制加载顺序; +- 根据状态差异驱动地图渲染层; +- 管理互斥规则和特殊规则。 + +### 推荐模式 + +所有 UI 动作统一转换成 Command: + +- `toggleLayer(layerKey)` +- `toggleLegend(layerKey, legendKey)` +- `switchBaseMap(baseMapKey)` +- `changeBaseRegion(baseId)` +- `changeTimeRange(range)` +- `focusPoint(pointId)` + +## 8.3 领域状态层 + +保留 Pinia,但将当前大 Store 拆分为多个职责明确的 Store / Service: + +- `mapConfigStore` + + - 保存图层树、图例原始配置、页面配置; + +- `mapViewStateStore` + + - 保存当前选中图层、选中图例、当前底图、当前基地、当前时间范围、当前缩放级别; + +- `mapDataStore` + + - 保存锚点缓存、请求状态、加载状态、错误状态; + +- `mapRuleEngine` + - 保存互斥规则、派生规则、特殊专题规则。 + +## 8.4 地图渲染层 + +保留 `MapClass` 作为统一门面,但将 `MapOl` 拆分成多个 Manager: + +- `ol-map-adapter.ts` + + - 只负责地图实例生命周期; + +- `ol-base-layer-manager.ts` + + - 负责 WMTS / XYZ / GeoJSON / 底图切换; + +- `ol-point-layer-manager.ts` + + - 负责锚点图层创建、更新、索引、显隐; + +- `ol-popup-manager.ts` + + - 负责 hover / click / popup; + +- `ol-region-mask-manager.ts` + + - 负责基地裁切、遮罩、点在面内过滤; + +- `ol-interaction-manager.ts` + - 负责缩放监听、量算、定位等。 + +这样做后,`MapOl` 只保留聚合职责,不再直接承载全部细节。 + +--- + +## 9. 详细改造方案 + +## 9.1 统一领域模型 + +首先建立类型定义,避免继续依赖 `any`。 + +建议新增: + +- `types/map-layer.ts` +- `types/map-legend.ts` +- `types/map-point.ts` +- `types/map-rule.ts` + +### 图层类型建议 + +- `BaseMapLayer` +- `OverlayLayer` +- `PointLayer` +- `RegionMaskLayer` +- `DynamicLayer` + +### 图层运行态建议(待考虑) + +将运行态从后端配置中剥离,不再直接把运行态写回原始配置: + +- `config`: 后端返回配置,只读; +- `runtime`: + - `visible` + - `loaded` + - `loading` + - `error` + - `featureCount` + - `lastRequestKey` + - `lastUpdatedAt` + +## 9.2 统一图层树、图例、地图显隐状态源 + +建议明确一个唯一状态源: + +- 图层是否勾选:只认 `selectedLayerKeys`; +- 图例是否勾选:只认 `selectedLegendKeys`; +- 地图渲染层不再存业务真相,只接收派生后的可见性差量。 + +### 派生关系建议 + +- `selectedLayerKeys` -> 派生当前显示的图例组; +- `selectedLayerKeys + selectedLegendKeys + currentBaseId` -> 派生 Feature 可见性; +- `selectedBaseMapKey` -> 派生当前底图组合; +- `timeRange + filterConditions` -> 派生图层请求签名。 + +## 9.3 建立图层索引与图例索引 + +为提升速度,初始化配置后立即建立索引: + +- `layerByKey` +- `legendByNameEn` +- `legendByLayerCode` +- `childrenByParentKey` +- `layerDescendantsByKey` +- `featureIndexByLayerAndLegendKey` + +### 优化收益 + +- 避免每次 `findLayerByKey()` 递归; +- 图例切换时直接定位对应图层和对应 feature 集合; +- 图层树勾选联动时只处理差异节点。 + +## 9.4 抽离请求解析器 + +当前 `GisUrlList.ts` 的匹配逻辑散落在 `loadLayerData()` 中,建议拆出: + +- `map-layer-request-resolver.ts` + +职责: + +- 根据 `layer.key` / `layer.title` / `layer.url` 解析真实请求; +- 生成标准请求结构: + - `url` + - `method` + - `filter` + - `sort` + - `cacheKey` + +### 进一步建议 + +- 在应用启动时将 `GisUrlList.ts` 预编译成多索引字典; +- 不要在每次 `loadLayerData()` 内重新构建 `urlListDict`; +- 请求签名应真正参与去重和缓存。 + +## 9.5 重新设计锚点加载策略(待考虑) + +建议从“全量预加载”改为“分层加载”: + +### 第一阶段 + +- 首屏只加载默认勾选图层; +- 图例也只基于已加载的默认勾选图层生成; + +### 第二阶段(待考虑) + +- 对常用图层做后台低优先级预取; +- 非常规图层在首次勾选时再加载; + +### 第三阶段(待考虑) + +- 对时间敏感或高频筛选图层使用缓存失效策略: + - `cacheKey = layerKey + requestSignature` + - 基于时间范围、基地、专题条件生成。 + +### 配套措施(待考虑) + +- 增加并发控制,例如同时最多 4 到 6 个接口请求; +- 增加可取消请求,避免菜单切换时旧请求回写新页面; +- 记录每个图层单独 loading 和 error 状态。 + +## 9.6 重构点图层渲染管理 + +建议将点图层改造成“图层级管理 + 索引级更新”模式。 + +### 当前问题 + +- 图例点击靠遍历全量 feature; +- 基地裁切靠遍历全量 feature; +- hover 时所有点图层都重绘。 + +### 改造建议 + +在 `PointLayerManager` 中维护以下索引: + +- `featuresByLayerKey` +- `featuresByLegendKey` +- `featuresByBaseId` +- `featureById` + +### 改造后的显隐策略 + +- 图例点击时,只处理该图例对应 feature 集合; +- 基地切换时,优先按 `baseId` 做粗筛,再对边界交叉区域做点在面内判断; +- 图层勾选时只切换对应 `VectorLayer.visible`; +- 非必要不重新 `addFeatures()`。 + +### 样式策略建议 + +- 保留 style function,但减少在 style function 内做复杂业务判断; +- 将 `_legendVisible`、`_regionVisible`、`_layerVisible` 预先计算为单个 `renderVisible` 标记; +- 样式函数只做: + - 是否可见; + - 当前缩放级别; + - 当前 hover 状态; + - 图标与文本样式计算。 + +## 9.7 底图与叠加层管理重构(待考虑) + +建议明确区分三类图层: + +- 主底图:矢量 / 地形 / 影像三选一; +- 基础叠加层:自然保护区、行政边界等可附加; +- 专题锚点层:水电工程、生态流量、水质站、视频站等。 + +### 当前问题 + +- 底图切换会 remove / add `customBaseLayer`; +- 主底图和叠加底图概念混杂; +- `controlBaseLayerTreeShowAndHidden()` 实际控制的不全是底图。 + +### 改造建议 + +- 维护 `currentBaseMapKey`; +- 主底图预创建,切换时只改 visible; +- 叠加层作为独立 overlay 管理; +- 自然保护区等图层明确归类为 overlay,不与主底图复用同一逻辑。 + +## 9.8 图例模块重构 + +建议把“图例结构”和“图例选中态”彻底分离: + +- `legendSchema`: 后端原始图例树; +- `legendVisibleTree`: 根据当前图层选择派生; +- `legendCheckedSet`: 当前选中的图例 key 集。 + +### 这样做的好处 + +- 后端原始图例树不再被运行态污染; +- 图例点击只更新 `legendCheckedSet`; +- 图层变化只重算当前显示哪些图例,不直接修改原始结构; +- 更容易实现“重置图例”、“记忆用户图例偏好”。 + +## 9.9 基地裁切与区域过滤重构 + +建议将基地逻辑完全收口到 `RegionMaskManager`。 + +### 改造重点 + +- 缓存基地 GeoJSON; +- 一次解析边界,多次复用; +- 对点位先按 `baseId` 粗筛,再按 polygon 精筛; +- 避免每次基地切换都重新请求已缓存边界; +- 底图遮罩和锚点区域过滤使用同一份区域上下文。 + +### 进一步优化 + +- 若后端能返回基地与锚点的归属关系,可优先直接按 `baseId` 过滤; +- 点在面内判断只作为兜底校验; +- 对非常大的多边形可预处理 bbox,先做 bbox 命中,再做射线法。 - +- 有一个 baseID 来传值 直接请求接口数据加载 +- const url = this.hydropBaseConfig.geojson_url + `&cql_filter=BASEID='${this.BASEID}'`; console.log('正在请求裁切数据:', url); + + // 等待数据加载 + const geoJsonData = await this.loadGeoJsonData(url); + +## 9.10 Popup 与交互重构 + +建议将 Popup 逻辑从 `MapOl` 中抽离: + +- `PopupManager` 负责: + - hover 命中检测; + - popup 位置; + - popup 内容渲染; + - click 详情回调; + +### 优化方向 + +- 命中检测尽量只针对当前可见的点图层; +- 对 hover 更新增加最小移动阈值; +- 只重绘当前命中 feature 所在图层,而不是所有点图层; +- Popup 内容生成应支持模板注册,不直接在地图层拼接业务 HTML。 + +## 9.11 业务规则引擎化 + +建议把分散的特殊规则抽到统一规则层。 + +### 当前应纳入规则引擎的规则 + +- 视频监控站与 AI 视频监控站互斥; +- 环保设施与环保设施在建互斥; +- 珍稀鱼类与沿程鱼类互斥; +- 环保设施图例自动补充; +- 水电开发状况菜单的缩放级别动态图层; +- 水质断面多接口拼接; +- 生态流量三级数据结构处理。 + +### 建议实现方式 + +定义规则接口: + +```ts +interface MapBusinessRule { + id: string; + when(context: RuleContext): boolean; + apply(context: RuleContext): RulePatch; +} +``` + +这样新增业务时只加规则文件,不再继续往组件和 Store 塞判断。 + +## 9.12 组件层改造建议 + +### `GisView.vue` + +- 只保留地图容器、初始化、模块挂载; +- 配置请求交给 `mapOrchestrator.initialize(pageKey)`; +- 菜单切换、基地切换也只发送命令。 + +### `LayerController.vue` + +- 只处理树控件展示与事件抛出; +- 互斥逻辑不要写在组件中; +- 初始底图加载不要放在组件 watch 里,改到编排层统一处理。 + +### `MapLegend.vue` + +- 只负责展示图例树和发出切换事件; +- 不直接调用 `mapClass`。 + +### `MapFilter.vue` + +- 搜索、容量、时间、基地变化全部改为发送标准命令; +- 过滤后的锚点候选列表由 Store 派生,不在组件里自行拼装业务逻辑。 + +### `BaseLayerSwitcher.vue` + +- 只负责切换主底图; +- 不关心图层树中 `customBaseLayer` 的内部结构。 + +## 9.13 日志、监控与调试能力(待考虑) + +建议补充以下调试能力: + +- 图层加载耗时; +- 单图层接口耗时; +- 首屏加载耗时; +- 当前可见图层列表; +- 当前可见锚点数量; +- 当前选中图例数量; +- 当前缓存命中率; +- 当前基地裁切耗时。 + +可以在开发模式下提供一个简易的地图调试面板,便于排查性能与状态同步问题。 + +--- + +## 10. 分阶段落地方案 + +建议采用“四阶段渐进式改造”,避免一次性大改导致风险过高。 + +## 第 1 阶段:收口现状与止血 + +目标:不改变功能表现,先把明显风险收口。 + +建议内容: + +- 去掉测试遗留逻辑,如 `splice(0, 2)`; +- 修复未定义方法和未定义变量; +- 清理重复日志、无效代码、注释垃圾; +- 补充类型定义; +- 建立 `layerByKey`、`legendByNameEn` 等基础索引; +- 将互斥规则从组件内搬到 Store 或规则层统一处理; +- 实现真实请求去重和请求取消。 + +## 第 2 阶段:拆 Store 与编排层 + +目标:建立单向数据流。 + +建议内容: + +- 新增 `mapOrchestrator`; +- 拆 `map.ts` 为配置、状态、数据三个模块; +- UI 组件只发送命令; +- 图例派生、图层派生、筛选派生全部收口到编排层。 + +## 第 3 阶段:拆地图渲染层 + +目标:把 `MapOl` 大文件拆开。 + +建议内容: + +- 抽 `BaseLayerManager`; +- 抽 `PointLayerManager`; +- 抽 `PopupManager`; +- 抽 `RegionMaskManager`; +- 明确地图引擎层只负责“渲染执行”,不处理业务真相。 + +## 第 4 阶段:性能强化与能力扩展 + +目标:让模块适合长期迭代。 + +建议内容: + +- 实现懒加载与后台预取; +- feature 索引化; +- 地图交互性能优化; +- 支持规则插件化; +- 补充测试与性能指标看板; +- 为 3D 共用业务层做适配。 + +--- + +## 11. 推荐目录结构 + +建议重构后目录大致如下: + +```text +src/ + modules/ + map/ + application/ + map-orchestrator.ts + map-commands.ts + map-rule-engine.ts + domain/ + types/ + map-layer.ts + map-legend.ts + map-point.ts + map-filter.ts + services/ + layer-request-resolver.ts + legend-deriver.ts + layer-deriver.ts + infrastructure/ + stores/ + map-config.store.ts + map-view-state.store.ts + map-data.store.ts + repositories/ + map-config.repository.ts + map-point.repository.ts + render/ + map.class.ts + ol/ + ol-map-adapter.ts + ol-base-layer-manager.ts + ol-point-layer-manager.ts + ol-popup-manager.ts + ol-region-mask-manager.ts + ol-interaction-manager.ts + components/ + gis/ + GisView.vue + mapController/ + LayerController.vue + mapLegend/ + index.vue + mapFilter/ + index.vue + BaseLayerSwitcher/ + index.vue +``` + +--- + +## 12. 重点业务的改造策略 + +## 12.1 基础图层 + +策略: + +- 单独定义主底图与叠加图层; +- 预创建主底图; +- 切换时仅改 visible; +- `customBaseLayer` 不再作为特殊魔法 key 到处透传。 + +## 12.2 水电工程锚点 + +策略: + +- 作为标准 `PointLayer` 处理; +- 保留当前图标、标签、距离阈值、Popup 规则; +- 在 `PointLayerManager` 中建立 feature 索引。 + +## 12.3 生态流量三级数据 + +策略: + +- 在领域层定义树结构转换器; +- Store 不直接关心层级深浅; +- 图层树组件只拿已经标准化后的树。 + +## 12.4 水质监测断面三接口拼接 + +策略: + +- 不在 UI 或 Store 中散写拼接逻辑; +- 建立专题数据聚合器,例如 `water-quality-point-aggregator.ts`; +- 对外输出统一的 `PointLayerData`。 + +## 12.5 视频监控站与 AI 视频监控站互斥 + +策略: + +- 写成标准业务规则; +- 由规则引擎统一裁剪勾选结果; +- UI 不再内嵌业务互斥判断。 + +## 12.6 自然保护区与区域底图 + +策略: + +- 统一归类为 `OverlayLayer`; +- 与主底图切换分离; +- 与基地裁切共享区域上下文。 + +--- + +## 13. 测试与验收建议 + +## 13.1 功能验收清单 + +- 页面首次进入,默认勾选图层正确显示; +- 图层树勾选与取消勾选,地图表现与图例表现一致; +- 图例点击后,仅影响对应锚点; +- 基地切换后,区域外锚点正确隐藏; +- 底图切换不影响锚点和图例状态; +- 时间筛选后相关图层正确重载; +- 视频监控站与 AI 视频监控站互斥稳定; +- 菜单切换后图层、图例、筛选项正确重置; +- 悬停 Popup 与点击详情正常。 + +## 13.2 性能验收指标 + +建议至少跟踪: + +- 首屏地图可交互时间; +- 默认勾选图层加载总耗时; +- 单图层首次加载耗时; +- 图层勾选后锚点出现时间; +- 图例点击后的显隐响应时间; +- 基地切换后的裁切完成时间; +- 缓存命中率; +- 页面切换时旧请求是否被取消。 + +## 13.3 自动化测试建议 + +建议补充三类测试: + +- 单元测试: + + - 图例派生; + - 图层互斥规则; + - 请求解析器; + - 缓存 key 生成; + +- 集成测试: + + - 图层勾选 -> 图例变化 -> 地图显隐; + - 基地切换 -> 区域裁切 -> 搜索列表更新; + +- 端到端测试: + - 地图初始化; + - 图层切换; + - 图例切换; + - 筛选联动; + - Popup 和详情弹窗。 + +--- + +## 14. 优先级最高的首批改造项 + +如果本轮改造只做最有价值的一批,建议优先按以下顺序处理: + +1. 修复明显问题: + + - 去掉 `splice(0, 2)`; + - 修复 `fetchPointData()` 未定义; + - 修复 `wq_lineTime` / `wt_lineTime` 未定义; + - 清理无效代码与重复日志。 + +2. 建立统一状态源: + + - `selectedLayerKeys` + - `selectedLegendKeys` + - `currentBaseId` + - `currentBaseMapKey` + +3. 抽离请求解析器和规则引擎: + + - URL 映射规则统一; + - 互斥规则统一; + - 特殊图例补充规则统一。 + +4. 拆 `map.ts`: + + - 配置状态; + - 运行状态; + - 数据缓存; + - 行为编排。 + +5. 拆 `map.ol.ts`: + - 底图管理; + - 锚点管理; + - Popup 管理; + - 区域裁切管理。 + +--- + +## 15. 改造后的预期收益 + +完成改造后,地图模块应达到以下效果: + +- 新增图层和专题能力时,不需要修改多个组件和多个文件; +- 图层树、图例、地图显隐的状态不再互相打架; +- 首屏加载更快,图层切换更轻; +- 地图代码从“堆逻辑”变成“可扩展的稳定结构”; +- 后续增加 3D 共用逻辑、专题聚合图层、更多筛选条件时,改造成本明显下降。 + +--- + +## 16. 结论 + +当前地图模块功能已经较完整,但代码结构处于“功能可用、结构偏重、规则分散、性能隐患较多”的阶段。继续在现有结构上叠加新需求,后续维护成本会快速上升。 + +建议本次改造不要只做局部优化,而应围绕以下核心原则整体推进: + +- 单向数据流; +- 业务规则收口; +- 渲染层职责下沉; +- 类型与索引先行; +- 先止血,再拆层,再提速。 + +按照本文档的分阶段方案推进,可以在不一次性推翻现有功能的前提下,逐步完成地图模块的结构升级。 diff --git a/frontend-sjgl/docs/地图模块重构实施清单.md b/frontend-sjgl/docs/地图模块重构实施清单.md new file mode 100644 index 00000000..0a977c48 --- /dev/null +++ b/frontend-sjgl/docs/地图模块重构实施清单.md @@ -0,0 +1,380 @@ +# 地图模块重构实施清单 + +## 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` 体积明显下降; +- 新增地图业务时有明确扩展点; +- 后续继续做底图体系优化、长期性能建设时不需要再推翻本轮结构。 diff --git a/frontend-sjgl/index.html b/frontend-sjgl/index.html new file mode 100644 index 00000000..fb3b1fd4 --- /dev/null +++ b/frontend-sjgl/index.html @@ -0,0 +1,15 @@ + + + + + + + + + 全过程数据管理子系统 + + +
+ + + diff --git a/frontend-sjgl/package.json b/frontend-sjgl/package.json new file mode 100644 index 00000000..72fb6471 --- /dev/null +++ b/frontend-sjgl/package.json @@ -0,0 +1,97 @@ +{ + "name": "qgc-buji-web", + "version": "1.2.0", + "scripts": { + "dev": "vite serve --mode development", + "build": "vite build --mode production", + "build:mvn": "vite build --mode production", + "serve": "vite preview", + "lint": "eslint src/**/*.{ts,js,vue} --fix", + "prettier": "prettier --write ." + }, + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@element-plus/icons-vue": "^2.0.10", + "@turf/turf": "^7.3.5", + "@types/js-cookie": "^3.0.2", + "@univerjs-pro/exchange-client": "0.15.0", + "@univerjs/core": "0.14.0", + "@univerjs/preset-sheets-core": "^0.14.0", + "@univerjs/presets": "^0.14.0", + "@vueuse/core": "^9.1.1", + "@wangeditor/editor": "^5.0.0", + "@wangeditor/editor-for-vue": "^5.1.10", + "ant-design-vue": "latest", + "antdv-draggable-modal": "^1.1.6", + "axios": "^1.2.0", + "better-scroll": "^2.4.2", + "cesium": "^1.141.0", + "dayjs": "^1.11.20", + "default-passive-events": "^2.0.0", + "dom-to-image": "^2.6.0", + "echarts": "^5.2.2", + "element-plus": "^2.2.27", + "esri-leaflet": "^3.0.19", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", + "js-base64": "^3.7.5", + "js-cookie": "^3.0.1", + "jsencrypt": "^3.3.2", + "jszip": "^3.10.1", + "leaflet": "^1.9.4", + "lodash": "^4.18.1", + "moment": "^2.30.1", + "nprogress": "^0.2.0", + "ol": "^10.8.0", + "path-browserify": "^1.0.1", + "path-to-regexp": "^6.2.0", + "pdfjs-dist": "^6.0.227", + "pinia": "^2.0.12", + "react": "18", + "react-dom": "18", + "screenfull": "^6.0.0", + "sortablejs": "^1.14.0", + "video.js": "^8.23.7", + "videojs-contrib-hls": "^5.15.0", + "vue": "^3.2.40", + "vue-ant-modal-enhance": "^1.2.2", + "vue-i18n": "^9.1.9", + "vue-router": "^4.1.6", + "vuedraggable": "^2.24.3", + "wujie": "^1.0.24", + "wujie-vue3": "^1.0.24", + "xlsx": "^0.18.5", + "xlsx-js-style": "^1.2.0" + }, + "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", + "@types/dom-to-image": "^2.6.7", + "@types/lodash": "^4.17.24", + "@types/node": "^16.11.7", + "@types/nprogress": "^0.2.0", + "@types/path-browserify": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^5.19.0", + "@typescript-eslint/parser": "^5.19.0", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.13", + "eslint": "^8.14.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.6.0", + "fast-glob": "^3.2.11", + "husky": "^7.0.4", + "postcss": "^8.4.20", + "prettier": "^2.6.2", + "sass": "^1.53.0", + "tailwindcss": "^3.2.4", + "typescript": "latest", + "vite": "^4.0.3", + "vite-plugin-cesium": "^1.2.22", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "latest" + }, + "repository": "https://gitee.com/youlaiorg/vue3-element-admin.git", + "author": "有来开源组织", + "license": "MIT" +} diff --git a/frontend-sjgl/pnpm-lock.yaml b/frontend-sjgl/pnpm-lock.yaml new file mode 100644 index 00000000..42ba5b75 --- /dev/null +++ b/frontend-sjgl/pnpm-lock.yaml @@ -0,0 +1,13865 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ant-design/icons-vue': + specifier: ^7.0.1 + version: 7.0.1(vue@3.5.33(typescript@6.0.3)) + '@element-plus/icons-vue': + specifier: ^2.0.10 + version: 2.3.2(vue@3.5.33(typescript@6.0.3)) + '@turf/turf': + specifier: ^7.3.5 + version: 7.3.5 + '@types/js-cookie': + specifier: ^3.0.2 + version: 3.0.6 + '@univerjs-pro/exchange-client': + specifier: 0.15.0 + version: 0.15.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': + specifier: 0.14.0 + version: 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/preset-sheets-core': + specifier: ^0.14.0 + version: 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/presets': + specifier: ^0.14.0 + version: 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@vueuse/core': + specifier: ^9.1.1 + version: 9.13.0(vue@3.5.33(typescript@6.0.3)) + '@wangeditor/editor': + specifier: ^5.0.0 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^5.1.10 + version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.33(typescript@6.0.3)) + ant-design-vue: + specifier: latest + version: 4.2.6(vue@3.5.33(typescript@6.0.3)) + antdv-draggable-modal: + specifier: ^1.1.6 + version: 1.1.6(ant-design-vue@4.2.6(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)) + axios: + specifier: ^1.2.0 + version: 1.15.2 + better-scroll: + specifier: ^2.4.2 + version: 2.5.1 + cesium: + specifier: ^1.141.0 + version: 1.141.0 + dayjs: + specifier: ^1.11.20 + version: 1.11.20 + default-passive-events: + specifier: ^2.0.0 + version: 2.0.0 + dom-to-image: + specifier: ^2.6.0 + version: 2.6.0 + echarts: + specifier: ^5.2.2 + version: 5.6.0 + element-plus: + specifier: ^2.2.27 + version: 2.13.7(typescript@6.0.3)(vue@3.5.33(typescript@6.0.3)) + esri-leaflet: + specifier: ^3.0.19 + version: 3.0.19(leaflet@1.9.4) + exceljs: + specifier: ^4.4.0 + version: 4.4.0 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + js-base64: + specifier: ^3.7.5 + version: 3.7.8 + js-cookie: + specifier: ^3.0.1 + version: 3.0.5 + jsencrypt: + specifier: ^3.3.2 + version: 3.5.4 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + leaflet: + specifier: ^1.9.4 + version: 1.9.4 + lodash: + specifier: ^4.18.1 + version: 4.18.1 + moment: + specifier: ^2.30.1 + version: 2.30.1 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + ol: + specifier: ^10.8.0 + version: 10.9.0 + path-browserify: + specifier: ^1.0.1 + version: 1.0.1 + path-to-regexp: + specifier: ^6.2.0 + version: 6.3.0 + pdfjs-dist: + specifier: ^6.0.227 + version: 6.0.227 + pinia: + specifier: ^2.0.12 + version: 2.3.1(typescript@6.0.3)(vue@3.5.33(typescript@6.0.3)) + react: + specifier: '18' + version: 18.3.1 + react-dom: + specifier: '18' + version: 18.3.1(react@18.3.1) + screenfull: + specifier: ^6.0.0 + version: 6.0.2 + sortablejs: + specifier: ^1.14.0 + version: 1.15.7 + video.js: + specifier: ^8.23.7 + version: 8.23.7 + videojs-contrib-hls: + specifier: ^5.15.0 + version: 5.15.0 + vue: + specifier: ^3.2.40 + version: 3.5.33(typescript@6.0.3) + vue-ant-modal-enhance: + specifier: ^1.2.2 + version: 1.2.2(ant-design-vue@4.2.6(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)) + vue-i18n: + specifier: ^9.1.9 + version: 9.14.5(vue@3.5.33(typescript@6.0.3)) + vue-router: + specifier: ^4.1.6 + version: 4.6.4(vue@3.5.33(typescript@6.0.3)) + vuedraggable: + specifier: ^2.24.3 + version: 2.24.3 + wujie: + specifier: ^1.0.24 + version: 1.0.29 + wujie-vue3: + specifier: ^1.0.24 + version: 1.0.29(vue@3.5.33(typescript@6.0.3)) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + xlsx-js-style: + specifier: ^1.2.0 + version: 1.2.0 + devDependencies: + '@commitlint/cli': + specifier: ^16.2.3 + version: 16.3.0 + '@commitlint/config-conventional': + specifier: ^16.2.1 + version: 16.2.4 + '@types/dom-to-image': + specifier: ^2.6.7 + version: 2.6.7 + '@types/lodash': + specifier: ^4.17.24 + version: 4.17.24 + '@types/node': + specifier: ^16.11.7 + version: 16.18.126 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.3 + '@types/path-browserify': + specifier: ^1.0.0 + version: 1.0.3 + '@typescript-eslint/eslint-plugin': + specifier: ^5.19.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3) + '@typescript-eslint/parser': + specifier: ^5.19.0 + version: 5.62.0(eslint@8.57.1)(typescript@6.0.3) + '@vitejs/plugin-vue': + specifier: ^4.0.0 + version: 4.6.2(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0))(vue@3.5.33(typescript@6.0.3)) + autoprefixer: + specifier: ^10.4.13 + version: 10.5.0(postcss@8.5.10) + eslint: + specifier: ^8.14.0 + version: 8.57.1 + eslint-config-prettier: + specifier: ^8.5.0 + version: 8.10.2(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + eslint-plugin-vue: + specifier: ^8.6.0 + version: 8.7.1(eslint@8.57.1) + fast-glob: + specifier: ^3.2.11 + version: 3.3.3 + husky: + specifier: ^7.0.4 + version: 7.0.4 + postcss: + specifier: ^8.4.20 + version: 8.5.10 + prettier: + specifier: ^2.6.2 + version: 2.8.8 + sass: + specifier: ^1.53.0 + version: 1.99.0 + tailwindcss: + specifier: ^3.2.4 + version: 3.4.19 + typescript: + specifier: latest + version: 6.0.3 + vite: + specifier: ^4.0.3 + version: 4.5.14(@types/node@16.18.126)(sass@1.99.0) + vite-plugin-cesium: + specifier: ^1.2.22 + version: 1.2.22(cesium@1.141.0)(rollup@3.30.0)(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0)) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0)) + vue-tsc: + specifier: latest + version: 3.2.7(typescript@6.0.3) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ant-design/colors@6.0.0': + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + + '@ant-design/icons-svg@4.4.2': + resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + + '@ant-design/icons-vue@7.0.1': + resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} + peerDependencies: + vue: '>=3.0.3' + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@better-scroll/core@2.5.1': + resolution: {integrity: sha512-koKOuYA55dQ04FJRIVUpMGDr1hbCfWmfX0MGp1hKagkQSWSRpwblqACiwtggVauoj9aaJRJZ9hDsTM4weaavlg==} + + '@better-scroll/indicators@2.5.1': + resolution: {integrity: sha512-Hk+Y00pR6fTsu6C9HGg1yYZtsu1gAcTgcs4C9aM5h6fQANX/T2YIYrOSjZmdL+js2PTcXJWZS8VM4Xjoi1PbfQ==} + + '@better-scroll/infinity@2.5.1': + resolution: {integrity: sha512-GKHrrasIh0KlGzhASHDo5hEEBJcDFpP4XaZGPH9Ey8+QBH6/O1ykAXS2ixkVAOTkBrv+KgFXoCUr4oN1xWeM+g==} + + '@better-scroll/mouse-wheel@2.5.1': + resolution: {integrity: sha512-DGnrirRMY6zMM7xwgx09D/cA9A//3J1/uDkq8iBVEyE5p0sEr/keQpjEfFHGkBRa505BnbBwdbN6f5lugEDSPw==} + + '@better-scroll/movable@2.5.1': + resolution: {integrity: sha512-8bLPRY15bbK4K5+tjrtdaKsFFKmJx72wRdg+xz3xQGFcTD940HFkJiORSOcz8Ufue7eOJfcmreQJBw6XY+TqTw==} + + '@better-scroll/nested-scroll@2.5.1': + resolution: {integrity: sha512-3cRsARxf9tq1VWBq7YAaET0xGAmgY1ERMmnXDo2gHFrmsJoNOionlpAeHdZvKQp2jG7JrzJ1O27nGCXf40gnkw==} + + '@better-scroll/observe-dom@2.5.1': + resolution: {integrity: sha512-TCMGFLRfpXBPIwtUV/efliUmfmrhSNI7NXdSyjdWjsLOS7dh3eFkmcom5ERVWMaXVELSmujGXLqobT+dT0C/jg==} + + '@better-scroll/observe-image@2.5.1': + resolution: {integrity: sha512-0Lhfj83o8EESwOxr8bfStCzNOokTm3KB7JeyMS8u/xl+3tyTuls9889cyAukYk4Yly1cS49pCGfj2P8YOiwtUg==} + + '@better-scroll/pull-down@2.5.1': + resolution: {integrity: sha512-Y6XcGu2NlevPg3k9VBRRFvpmfoTA+rO96JGdog2qKHclIPNXnsVwsIHtZfAm9weE/f9UuC4BnB+VUFRlucfupg==} + + '@better-scroll/pull-up@2.5.1': + resolution: {integrity: sha512-1hu3xSMxdB8T391KffpNZ7g93lMwZEHjfb1F1Y4KvIkciDt8nXqkGpqrZF+YwR+EJTgYcWqUO8kgmI6XXu7Pkg==} + + '@better-scroll/scroll-bar@2.5.1': + resolution: {integrity: sha512-i6r60pWG/ztkFK2j5Gj54I0LJb2jGh5TWJNQBoW0gUkp28B+0JvBFTwZn9tF7beZCBorKR7Hvvu4O9A1TJy94Q==} + + '@better-scroll/shared-utils@2.5.1': + resolution: {integrity: sha512-AplkfSjXVYP9LZiD6JsKgmgQJ/mG4uuLmBuwLz8W5OsYc7AYTfN8kw6GqZ5OwCGoXkVhBGyd8NeC4xwYItp0aw==} + + '@better-scroll/slide@2.5.1': + resolution: {integrity: sha512-aDOrfsmjAcz6DXN7mDX3tPieAn195R43Yn9e3waI19TIEok/mQlI1a/kb5quqWOoxkiaZQ8xe3vx5ZTj9C+F6Q==} + + '@better-scroll/wheel@2.5.1': + resolution: {integrity: sha512-fYLcEvkh88Z/2L+P5/+SGMunuc+HzAjGOiORIa/x21qb/knO2RFH4A/V1Rt3OIW4QluWzuFnU6jJRPlsQVZ4fg==} + + '@better-scroll/zoom@2.5.1': + resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==} + + '@cesium/engine@25.0.0': + resolution: {integrity: sha512-vJZfgAAB7WTvUPsI8dFV+wKleweCZgpJj1ckcTIERnC+NWvJ9bjlAx0xPl0We57NoQKcdMDy+6UiFjOvPB/yGg==} + engines: {node: '>=22.0.0'} + + '@cesium/wasm-splats@0.1.0-alpha.2': + resolution: {integrity: sha512-t9pMkknv31hhIbLpMa8yPvmqfpvs5UkUjgqlQv9SeO8VerCXOYnyP8/486BDaFrztM0A7FMbRjsXtNeKvqQghA==} + + '@cesium/widgets@15.0.0': + resolution: {integrity: sha512-a0udi+EKEeCyM4F+pxp9Qx8HXgh2eWVQrksxGO4lSu3f35XWc+eKdYiJBEP2t1d4tjw2MxOsjbVyMj7VQZ4JDw==} + engines: {node: '>=22.0.0'} + + '@commitlint/cli@16.3.0': + resolution: {integrity: sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==} + engines: {node: '>=v12'} + hasBin: true + + '@commitlint/config-conventional@16.2.4': + resolution: {integrity: sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==} + engines: {node: '>=v12'} + + '@commitlint/config-validator@16.2.1': + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} + engines: {node: '>=v12'} + + '@commitlint/ensure@16.2.1': + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} + engines: {node: '>=v12'} + + '@commitlint/execute-rule@16.2.1': + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} + engines: {node: '>=v12'} + + '@commitlint/format@16.2.1': + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} + engines: {node: '>=v12'} + + '@commitlint/is-ignored@16.2.4': + resolution: {integrity: sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==} + engines: {node: '>=v12'} + + '@commitlint/lint@16.2.4': + resolution: {integrity: sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==} + engines: {node: '>=v12'} + + '@commitlint/load@16.3.0': + resolution: {integrity: sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==} + engines: {node: '>=v12'} + + '@commitlint/message@16.2.1': + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} + engines: {node: '>=v12'} + + '@commitlint/parse@16.2.1': + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} + engines: {node: '>=v12'} + + '@commitlint/read@16.2.1': + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} + engines: {node: '>=v12'} + + '@commitlint/resolve-extends@16.2.1': + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} + engines: {node: '>=v12'} + + '@commitlint/rules@16.2.4': + resolution: {integrity: sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==} + engines: {node: '>=v12'} + + '@commitlint/to-lines@16.2.1': + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} + engines: {node: '>=v12'} + + '@commitlint/top-level@16.2.1': + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} + engines: {node: '>=v12'} + + '@commitlint/types@16.2.1': + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} + engines: {node: '>=v12'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fast-csv/format@4.3.5': + resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} + + '@fast-csv/parse@4.3.6': + resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} + + '@flatten-js/interval-tree@1.1.3': + resolution: {integrity: sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@intlify/core-base@9.14.5': + resolution: {integrity: sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@9.14.5': + resolution: {integrity: sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==} + engines: {node: '>= 16'} + + '@intlify/shared@9.14.5': + resolution: {integrity: sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==} + engines: {node: '>= 16'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@napi-rs/canvas-android-arm64@1.0.0': + resolution: {integrity: sha512-3hNKJObUK7JsCF9aJlVCs1J0/KE/gGfZNeK8MO1ge6bB3aicr5walGme9t9No1f/oyk9GgvdAT/rjSdsx3gbIw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@1.0.0': + resolution: {integrity: sha512-ZIja19/BiGz2puhki+WUYSRriwFeFJ8Mi9eK3hZdSS85w4Y60cuEAJVhMCfKwswQkKkUtrnzdKMBuO7TupvexA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@1.0.0': + resolution: {integrity: sha512-hImggWc82jqZVpEsFR9S7PE9OQYjq/H/D7vwCGB6X1jRH+UVBP1+1niJTPBOat1B154T6GKK7/kcFtoWgjgFzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-hlJRy6d+kWLKVOG/+1rEvNQVURZ0DxxRPJsLmEWwhwiXZUJc0BF5o9esALHSEP4CoJK4wChRtj3hnyBgVx2oWA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-5Hru4T3RXkosRQafcjelv7AUzw9mXqmGYsxnzeDDOWveFCJyEPMSJltvGCM+jfH98seOCbfwm9KyFg6Jm5FhAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-LTUl9jS8WsLSUGaxQZKQkxfluOJRpgvBuxxdM4pYcjib+di8AU4OzQc6+L6SzGMLcKc9H0RAjojRatBhTMqYdg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-linux-riscv64-gnu@1.0.0': + resolution: {integrity: sha512-Iz931SAZf+WVDzpjk52Q3ffW3zw0YflFwEZMgs036Wfu1kX/LrwT9wGjsuSqyduqefUkl91/vTdAjn8hQu5ezA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-pFEQ5eFK4JusgN1K6KkO9DKP/Hi1WMJOkF8Ch03/khTc4bFbCKkCCsJG4YcOMOW9bI4XbT2/eMAWxhO0xaWgPA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/canvas-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-jnvr8NrLHiZ3NCiOKWqDbkI4Ah+QDrqtZ+sddPZBltEb1mQ2coSvCSJYfict+oAwcm0c970oTmVySpjKP/lnaA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/canvas-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-y2j9/Gfd5joqiqxdP/L1smqjQ+uAx3C4N0EC7bDHrnZEEH8ToM/OC5p3uHvtj4Lq591aHj+ArL01UDLNwT5HgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-qwdhh9N6Gge/hC4pL9S1tQp0iKwhSl/dYjg7+RGp9k26iRGRi5MqqUyKGOXIWli0zOcuy5Y2wIH/jk2ry6i/jA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@1.0.0': + resolution: {integrity: sha512-Jqxcy1XOIqj+lH9sl1GT+il6GR3uQv13vI2mrwubP3uT8Olak2ClDrK2RnxlQKjwv8BRr4b3ug0YR7c6hBX8wg==} + engines: {node: '>= 10'} + + '@noble/ed25519@2.3.0': + resolution: {integrity: sha512-M7dvXL2B92/M7dw9+gzuydL8qn/jiqNHaoR3Q+cb1q1GHV7uwE17WCyFMG+Y+TZb5izcaXk5TdJRrDUxHXL78A==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@petamoriken/float16@3.9.3': + resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + + '@radix-ui/primitive@1.1.4': + resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==} + + '@radix-ui/react-arrow@1.1.10': + resolution: {integrity: sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.10': + resolution: {integrity: sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.3': + resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.4': + resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.17': + resolution: {integrity: sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.2': + resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.13': + resolution: {integrity: sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.18': + resolution: {integrity: sha512-PZGV82gFk0WltDRI//SsG28ZIjlo9ANTmoNYg0jLNzXXiDsAy5PkOOYQaVD1pPxY6t7gxffb1QMD6qaUvsBZdw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.4': + resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.10': + resolution: {integrity: sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.17': + resolution: {integrity: sha512-GjZQIEANVkuuWeztlKz6QEHe31ZX2iDfHzcTMCQVZXC0JyQrgfKWSC+LOOEw6aVV64zyjzobIzSA4AU4eKWrHA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.2': + resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.18': + resolution: {integrity: sha512-lj8Rxjtn6zJq1oSbE/uDtAwCbB9BnxgHD+8MwJMuTh6u1dPamYhW9iuELr/Z8d0D/UysFblYYHeBPwi7T4k0YQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.17': + resolution: {integrity: sha512-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.1': + resolution: {integrity: sha512-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.12': + resolution: {integrity: sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.6': + resolution: {integrity: sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.6': + resolution: {integrity: sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.13': + resolution: {integrity: sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.10': + resolution: {integrity: sha512-Y6K6jLQCVfCnTL2MEtGxDLffkhNfEfHsEg3Wa8JU+IWdn3EWbLXd3OuOfQRN7p/W/cUce1WyTk3QeuAoDBzN9g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.3.0': + resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.2': + resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.3': + resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.3': + resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.2': + resolution: {integrity: sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.2': + resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.2': + resolution: {integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.2': + resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.2': + resolution: {integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==} + + '@rc-component/portal@1.1.2': + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rc-component/trigger@2.3.1': + resolution: {integrity: sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@simonwep/pickr@1.8.2': + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + + '@spz-loader/core@0.3.1': + resolution: {integrity: sha512-8qJ1WIBXaJu8HjnJAjYniE0kYcr0kCe5Hp7kDzYiGVvvd7zyrOBwbF5imoW5mvwx1Qba0hxGEK5R9jEoaHKJFA==} + engines: {node: '>=16', pnpm: '>=8'} + + '@sxzz/popperjs-es@2.11.8': + resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==} + + '@terraformer/arcgis@2.1.2': + resolution: {integrity: sha512-IvdfqehcNAUtKU1OFMKwPT8EvdKlVFZ7q7ZKzkIF8XzYZIVsZLuXuOS1UBdRh5u/o+X5Gax7jiZhD8U/4TV+Jw==} + + '@terraformer/common@2.1.2': + resolution: {integrity: sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==} + + '@transloadit/prettier-bytes@0.0.7': + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@turf/along@7.3.5': + resolution: {integrity: sha512-Ee4AHV9j2Bnlm/5nm4ChY7nkwpaaMffSez9nsJ9HcMbzG+GgTkt0F5pn9d02U7YvuWqckM5lfr3kBI+w2uTz+g==} + + '@turf/angle@7.3.5': + resolution: {integrity: sha512-+c3UZfkL1nNacfpLkj89rRreIlKM5UALeeWpcw7hCEK4MycXCBmITkyLLXOzoQaRBc/7ua4PV0Ov13Y6Ck9PzQ==} + + '@turf/area@7.3.5': + resolution: {integrity: sha512-sSn80wPT7XfBIDN3vurCPxhk9W4U8ozS/XImSqeLN8qveTICOxzZkhsGDMp0CuncaN+plWut4a2TdNM7mzZB6Q==} + + '@turf/bbox-clip@7.3.5': + resolution: {integrity: sha512-FuADTCBfRwdzJb2gFawDGnD1jKlUOfsWcu5Uv8iyEgu9JLuLAIYtI/l9xVF76BAoAvSkLgMfUvrPQ4SXCSUrVA==} + + '@turf/bbox-polygon@7.3.5': + resolution: {integrity: sha512-Cs9Laej8zfSY51kORM9UcbY4Uf/7X3OIZr/LydbrmmARFSpYH/FZsEQjAGi1S1Q0aYbibVqjEUReHN3ZVsV5eA==} + + '@turf/bbox@7.3.5': + resolution: {integrity: sha512-oG1ya/HtBjAIg4TimbWx+nOYPbY0bCvt82Bq8tm6sBw3qqtbOyRSfDz79Sq90TnH7DXJprJ1qnVGKNtZ6jemfw==} + + '@turf/bearing@7.3.5': + resolution: {integrity: sha512-/qabIt/IuPsGlE6RukJ0zOirc6afNxoK7fK1WBNVnHuJjeOpSkW+7q1QW5XQGXBMv3odcD0ZgRR+MBiAHduYSA==} + + '@turf/bezier-spline@7.3.5': + resolution: {integrity: sha512-54qnreNRvV9BeTGz2YXJyma+m8HMusuXWw3AkG0bIJGtqJMHqFKC/rWOcYxVj1VM2ScoTgglFxvq7GtSna+KMw==} + + '@turf/boolean-clockwise@7.3.5': + resolution: {integrity: sha512-VpDIpTKBjH4oPbzx1ns18TWcosi+qCRtgU1HIJHLj4NWyLNr7TX86DvomCvZRPfsFxkYYgkFlqHBG1a29dcyqQ==} + + '@turf/boolean-concave@7.3.5': + resolution: {integrity: sha512-CHrmnEww43CAwEPszrKtLjM13hWDmsFZe0eCocxOtXLMspj+LCheB0bjMfcoBYfoTsvOPXxnoLTK9n4xuWBRSA==} + + '@turf/boolean-contains@7.3.5': + resolution: {integrity: sha512-P4JUAHgvJkD+8ybQ6d1OHp9TBsGsjJxF5lWeXJgp0k4+Hd/D0CVy4/mhLkZdNa6QdljVdwNcfU0CTqy1WsSQig==} + + '@turf/boolean-crosses@7.3.5': + resolution: {integrity: sha512-o4Gmb2gbPl4j7810ZrT9GZsGigY+HRwcOI9pkkKH6BJ4ewSlQCPzP4JFruZp0+mIXS6NnPv7+Lw3J8LN3kYw1g==} + + '@turf/boolean-disjoint@7.3.5': + resolution: {integrity: sha512-Pz1GGUC6iL6xGVqhyo+fYg35kl4j/HONMEoC1voN3DcBOCcVlzq+ljvMpvE+oQiR7Q38xLhIxZneLCqMp5YrQA==} + + '@turf/boolean-equal@7.3.5': + resolution: {integrity: sha512-xjSFi/BpxBY5tDDuSbixIRVq2AnDGcdLL8XOHzZtJWZjSa6tAi6afxSiMbQTGIhYfwwcB/sJcIUUffBaIQ2BiA==} + + '@turf/boolean-intersects@7.3.5': + resolution: {integrity: sha512-Z6GPYjozrmTuzWQD0x7o8RPm+4HC7hz9q23hdB3U1+Qahesv8Mtc+wo82tO4CG6/NRnJ9u79DlEhmR1DxUU4iQ==} + + '@turf/boolean-overlap@7.3.5': + resolution: {integrity: sha512-DUeiPVqFSTjW79erPbo780pRcKCRad59NcscVsTYkZD/92peF/4rQvHbvAUpUDPZaQCxe+mvfeDHfUFmfVKCGA==} + + '@turf/boolean-parallel@7.3.5': + resolution: {integrity: sha512-+shvGYFUx1vPQRPNeKiJcHtLAf9fl3mzAl9tBx2z+dU0IZDKz76/MAaDYSrMya/BYilFZ0E4RCEVq1X3s+AfkA==} + + '@turf/boolean-point-in-polygon@7.3.5': + resolution: {integrity: sha512-ba7+B0wzaS9GtERZOoXUZ6oW8IcIJHNQZf3c+tiD9ESjcsPO1Q/4qIJGTKl92nBLhhracHJxMWBM/U6hAVkaRg==} + + '@turf/boolean-point-on-line@7.3.5': + resolution: {integrity: sha512-TuWfrAT63W43BDzgYc94UzQ5/PjF1aTnh4AIzmQwez1YnimShYcOTwo8OIHzDaB6gbbvFsfxYMuOA5JOp942Kg==} + + '@turf/boolean-touches@7.3.5': + resolution: {integrity: sha512-GwD0gmbV1p+EFHojBjaa1cwGMybayOZUDLj562RlAAoexC8ownrW7W6oMAlM2VCxk4gq6CLx3hss9pONuQcKjQ==} + + '@turf/boolean-valid@7.3.5': + resolution: {integrity: sha512-ZezJCgFJS0JRJfj6fVSI1idcifTaWFW70NYRCUur9926DHLvSkfbtEF5i63yPQt2Zxx00FTUJPcHRzdgOiwECA==} + + '@turf/boolean-within@7.3.5': + resolution: {integrity: sha512-FsZhkAoi9KU2F0D5dyOQ38A7y9Bk8XTmUfLKAJa12xHN0QtXZEYH86YdVlrI1XgfFB9gmUddJPFX+bJATy6rxw==} + + '@turf/buffer@7.3.5': + resolution: {integrity: sha512-TGls3nYtWzviKHT00XVBfHKa7Z2oIZKqiHN7R0xErGwMSAR7YhxVROhxq/iyIsWZjl1SlPwweZZIxWILQuxpZA==} + + '@turf/center-mean@7.3.5': + resolution: {integrity: sha512-8IpS7zUZg0fuUpN9ViqT4gR6YMjSR1R1kHysaDxhP1zMrTJ84U5lGG+VQC7HpHqybOnuwkXZrV970h9Ni78n6g==} + + '@turf/center-median@7.3.5': + resolution: {integrity: sha512-e+NeDKyZzIzSTA0qd9cwIuguCnDQSc6TLd1MjkHKTd37PCaPSc40TMEIBX1x+kJRwOxzmUgpubfHUG9zfjdtyA==} + + '@turf/center-of-mass@7.3.5': + resolution: {integrity: sha512-eEzx4YKxUP55Apdjt7XXuQ906KKx4uSQWLxJw5OHE0rKOSN/qYTSdu0s7nQBAmGgAqeSC2538vuN7wEqMfYMvQ==} + + '@turf/center@7.3.5': + resolution: {integrity: sha512-eub5/Kfdmn89ZqwCONHI7astmTDEtN5M6+JfOkgoSyhKKFhUJYNxUyH1F/vCtIP7j1K369Vs4L9TYiuGapvIKQ==} + + '@turf/centroid@7.3.5': + resolution: {integrity: sha512-hkWaqwGFdOn6Tf0EWfn2yn1XZ1FWE1h2C5ZWstDMu/FxYO5DB+YjlmOFPl4K6SmSOEgdV07eK2vDCyPeTHqKGA==} + + '@turf/circle@7.3.5': + resolution: {integrity: sha512-Tse7GJrx0rxaQ5BdY6pHZ9HFPrZwRMry2yaqq94UsUyonhy1m7U2icB3Zp4M8o4XjHIGTCq9i2BYcGJram51Sw==} + + '@turf/clean-coords@7.3.5': + resolution: {integrity: sha512-e0ZTqVWiQaCI/b8EFb+HAS8lCDomWafAKxQuIv0IYks0GwOlVTDWTwsY2RX2685j2Y+QssqOsyHsPZCtAjc3YQ==} + + '@turf/clone@7.3.5': + resolution: {integrity: sha512-qfIaHj3410QEcTpiCRnTzhq8YrUp2gWrUIPLBAEFykopNxJkq1du1VrRzvuAo36ap2UV7KppkS6wGNypbcxswQ==} + + '@turf/clusters-dbscan@7.3.5': + resolution: {integrity: sha512-xdc0ccv2fyiUSWrJYJFE6RTluf8oVCB0/aCOdUD/ZvtG3eyqGIXMRMzAR1PujQHjBWtI+ndD4Eq+DqiGukGK+g==} + + '@turf/clusters-kmeans@7.3.5': + resolution: {integrity: sha512-MnKymdmL7vy4TR5CLkcNkNgsJP8ZBEiWkqnRYBJLq/hFoppTvXxKvkRzftWtLfkIWb5oQ2XMvBh8BgALN22d5A==} + + '@turf/clusters@7.3.5': + resolution: {integrity: sha512-ZYQSCxElarAaG4azNieZ0ylX1sietkHIVAZv6H5JfSz/EXbAekQIom/isoynfDl/jVyNonDT7UrDZdCIjKQ2Gg==} + + '@turf/collect@7.3.5': + resolution: {integrity: sha512-ddcBDdnM2Rwjfedxsbjvb7Zhoqo6uCTcnaHvu3ej/g+Z9iJ/K2wkRWhEUVAg/wppso5io6qEPmmPpNlefePt+w==} + + '@turf/combine@7.3.5': + resolution: {integrity: sha512-olQH6WmLl3XAalbpiz7RSRr4/mogan38gvgDlo37ypW1ckeBUi+2TX5HgJUZq4wxa2gMlny72QYkqY9zW4Jw+A==} + + '@turf/concave@7.3.5': + resolution: {integrity: sha512-T496U4K5mXsJXTKjnf7eW+4SYoDP0bXWhpcfpWuCAaDJy8n1Q8Dbslj7wqrWd2lqIhulVRF+3zWAh0bJS34L5g==} + + '@turf/convex@7.3.5': + resolution: {integrity: sha512-d/pq86he+/GB/2ObuBHapeT15QFsCPhhGab3uE4YjogLMbD8qtu0sRGF+cvvPRDNuCLycOBL/xgFLnf9SteYlA==} + + '@turf/destination@7.3.5': + resolution: {integrity: sha512-x6ylChhOlIbucRSw7wF6z2gSEqqQl+dE0nSH5AL/ojZkqqGYahiw+2P4A8ZMuDM6rzH+FIqRYDes0o4nSArZCw==} + + '@turf/difference@7.3.5': + resolution: {integrity: sha512-iDyWYCvgS3vgB8W1ai2cvfJaTq9bOt1QghiVkCNIyccF97CgtYJzenREVVUlp8qU9lJlbQ/ameyKvXPA1uOAlA==} + + '@turf/directional-mean@7.3.5': + resolution: {integrity: sha512-Fm3rVgX7xiCL8Ed68dZpUl5NEAgEpaUdkAaZLvhedfUmKcuXcfBwX8RebHwNWctxcvKVOhoAMSlogpV33JnKdQ==} + + '@turf/dissolve@7.3.5': + resolution: {integrity: sha512-6kZTc8rbGuBqxWW8iK1sJZC8r7vr5uWdv7nsMJ0eX8/g0mTKNgSGXo14hYqp2GN4bE7JzpAgpFeSX8Xu1psxlQ==} + + '@turf/distance-weight@7.3.5': + resolution: {integrity: sha512-GpV2h5ZkbWMdUFe5BWm9lfeLFMnYR8CRj6HiguZBLesarSub6I0UNO1u8UhkRGi26YLGnFlBh7c4KyaakNx1Gg==} + + '@turf/distance@7.3.5': + resolution: {integrity: sha512-uQAC63zg/l91KUxzfhqio7Ii3+UXTrPOVJScIdRj6EO6+9XHI4kC+AdyIS4cPAv14sZfJLIBxzMnzcGrss+kEA==} + + '@turf/ellipse@7.3.5': + resolution: {integrity: sha512-C478LrdvUkjwIVGN6PoYsFp27PuT+W2IH4ZOVt9sd4359hRPFhJ2m+f8jSPfS6rdamdvc/O+h7vNmOIBRP/TeA==} + + '@turf/envelope@7.3.5': + resolution: {integrity: sha512-0Sc2AVx0JZ3MaQ0k6+khplU3wO7bwc1qAQ6Fd+Q4RhIVPY2JKstBdq5ftU1T/BHNf8KK+9y4qbSV2u8hnw/PqA==} + + '@turf/explode@7.3.5': + resolution: {integrity: sha512-Qdd7ehX5AF0DdpJl+JJyxws7jEmsZBRV35wTm+Lyhapuc3yLHU7tN5EqJ+2lVV7RkUgBXEFQV+34pmPLPGQn+w==} + + '@turf/flatten@7.3.5': + resolution: {integrity: sha512-4dDAyoY8wf4UCIJ2lH3JbypmEeqyuRFExHEPu6eJeaOybdpOV9kn3LqB0lsWArizFjJWQNS+0qpv08jD85jSPg==} + + '@turf/flip@7.3.5': + resolution: {integrity: sha512-qDSBFqo5+8yE5gfBCsQZxgj0bGRx6abQg6TgYvg1wvYYHtUJL/0VS+QdDTmxZiYm8N46uNAv9pKvun9MGK+elA==} + + '@turf/geojson-rbush@7.3.5': + resolution: {integrity: sha512-30/hQqc+ErnlcavvDdxGfgm8VtsJDEzSYpf3mPqYxOyI976l49T6+1jCQD5xKswml6o8zZAaTSe6ZcSKF+SCNw==} + + '@turf/great-circle@7.3.5': + resolution: {integrity: sha512-VAio6hwPJIheSzrvsMkLDMHkCfHyOi4H4r1Y2ynb2oMiGiqZjkQ7jIFlRYBcTyO2RnwEOgwM/d3kwRImAwMVBA==} + + '@turf/helpers@7.3.5': + resolution: {integrity: sha512-E/NMGV5MwbjjP7AJXBtsanC3yY8N2MQ87IGdIgkB2ji5AtBpwnH4L3gEqpYN4RlCJJWbLbzO91BbKv2waUd0eg==} + + '@turf/hex-grid@7.3.5': + resolution: {integrity: sha512-sPtYXqbNvUxt8h4NzspcoFAVotd/75LgrLxxI84LGIVPCN+fsK1uWwr4a6MAlzfSbWbOYOq7OSWMSSXzHoQzJg==} + + '@turf/interpolate@7.3.5': + resolution: {integrity: sha512-rl5LwK85etpvbSW1VEXp/I85kzgiGviXInrvvhQxzEF9xGKvs1ed/6dc1uy1LsczSr4wUnbdGATzZTF9lFYjIw==} + + '@turf/intersect@7.3.5': + resolution: {integrity: sha512-v11Do9ySbsE08ffiwboQeFKvYByyxzvAz0ls837A9T3rSC+8vKMmK815S+C5v8CBMLNhuBCSgqnOIV3zonNICQ==} + + '@turf/invariant@7.3.5': + resolution: {integrity: sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==} + + '@turf/isobands@7.3.5': + resolution: {integrity: sha512-WX6vpPkM8O8SY7hsijOtj4owVXP24nU33Q0eMhWdZ+YiDmAHgEOQcDhPJLvp0mIbyYj81mU73hdnilf3q9tk/A==} + + '@turf/isolines@7.3.5': + resolution: {integrity: sha512-n5QUX1/Z/PuPVpTUrKhYcKF95L5+nKF8hWznYtG/GsiMXfRqMeAEjTCqgKIgF8T65H4LrvcpLyq8VPQSi7aISw==} + + '@turf/jsts@2.7.2': + resolution: {integrity: sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==} + + '@turf/kinks@7.3.5': + resolution: {integrity: sha512-dPW8d4vs1v8WMobjyq/TVqajjPwkMsl94IF58yp1UYlmJDQrW4iNRUmI9fFzww+fl7epCKNwY+jZhXf1DRi93w==} + + '@turf/length@7.3.5': + resolution: {integrity: sha512-Bi+vEP54wt1ly3BRcCOP0nd2kGTYEhGk6haQxTpkrqr3XtmqDh8c3NowSgseN2cegIZRjwCOEC8eSsZ0JemJdA==} + + '@turf/line-arc@7.3.5': + resolution: {integrity: sha512-XrPicIoN7XCtiJ7e7ELje7GjMZrBw/nuJnz0mQoCwwHwmX8Oz9oRfb6uaiS8NeR4WBzUVdkmVR/ro0kW4lypog==} + + '@turf/line-chunk@7.3.5': + resolution: {integrity: sha512-z5/EBv79oyNXMYFpFIsA9gw/7TAKoJ9a/Ijo/jBeO47Fr1mV3JLtE3aB2i/nqLTYZWMU7K3Lnzwqt2Rn5Gri/Q==} + + '@turf/line-intersect@7.3.5': + resolution: {integrity: sha512-2Cl4oPsjaDdfIwz/5IRDdG2fNdfp3W6atICm81vnzl/GwURoVP+CLjXJ64QWWzpzIbgX2XprJQTmamByDt5MDw==} + + '@turf/line-offset@7.3.5': + resolution: {integrity: sha512-7tNI+4xKFOTQj720aJI7vuRMyTC+4hAqd7N8AnnZ0EpzH+sBfyrt8rNI/Vf3+d/iY0c9ZNbhU9Qhyb0ckJUdsA==} + + '@turf/line-overlap@7.3.5': + resolution: {integrity: sha512-7lZMWYHuzM6EMlL5pIIi/Nh7GLsM7ilW8/jVyHP1yGfQ0c0YAUoJd/Xy3J2+9v8OkYiZW/t2LdwVoTmCEJLWxg==} + + '@turf/line-segment@7.3.5': + resolution: {integrity: sha512-TM1aCu7utM6fllAEHO8PNqBJZ/uoFJVNp2A0YI7FyWN928hPbacsvNtLeVz/Kq1ZbeqQ1ZIKRxo9FdVjaj8hGg==} + + '@turf/line-slice-along@7.3.5': + resolution: {integrity: sha512-zLOU9mGFXJdbPvA3/zXpDsBmXY2paA7eD6/p0iYiP9OASYO0GDcarwY5K/E0uuEdLrMf8G8YA2cJDcEl9gRgFw==} + + '@turf/line-slice@7.3.5': + resolution: {integrity: sha512-BGw5N4UvjH691J/z1P2S+hWBgCcvbl2/HXaqGvKTijXw5i1vzsZ9m07wLl/qH+i38OJDRMJ/+FkNZnrKpsoXLw==} + + '@turf/line-split@7.3.5': + resolution: {integrity: sha512-GEuy+LdbbaqtYjHk/i1G8sK51wfCdPqTO8uH0dJZ6WlcIcZQfRcKKI4ksFm7NkVyfmw8gXWbpMJD8lO380GFBQ==} + + '@turf/line-to-polygon@7.3.5': + resolution: {integrity: sha512-PNWDN1B0nJRlgA4DAXeYEf53OZSWwsu/rtDB4wxe/1NwfM9zlDVElQ/mtgDPtZpwC2aDKV5+B0vTXfKR/MMIfg==} + + '@turf/mask@7.3.5': + resolution: {integrity: sha512-zs9bBtdANOsSkG7xiLFYforeI2nszXu0QwPv3vkaX747oEVdcyd0nSW81aQRmSWw/fvhXja++8duIVXOIYr4ng==} + + '@turf/meta@7.3.5': + resolution: {integrity: sha512-r+ohqxoyqeigFB0oFrQx/YEHIkOKqcKpCjvZkvZs7Tkv+IFco5MezAd2zd4rzK+0DfFgDP3KpJc7HqrYjvEjhg==} + + '@turf/midpoint@7.3.5': + resolution: {integrity: sha512-y92O2YDDBkZp7jAUuUPgof/HiXHjJSkKjEtQRjWXZcjTlzHd/Fqg6/twarY2wNkENK2EuaaiV9MDy74FeRG2Ow==} + + '@turf/moran-index@7.3.5': + resolution: {integrity: sha512-l/FgZkgPzwAsdj7rtKYWv2rxeTy+Tv8NMk6qSEwKqB4eHqn1TYHcTASWRcZIyipH4LtOJJOl77n7FmKcaDBtSg==} + + '@turf/nearest-neighbor-analysis@7.3.5': + resolution: {integrity: sha512-6vnSqt7OH8zTPdvUxCYnnN86Ci8VS5G3q2G1UrAcrnjTH7DbJ4KvIkRQlv4y6hj53G+bm9cA6TjeJuyP2jAOcg==} + + '@turf/nearest-point-on-line@7.3.5': + resolution: {integrity: sha512-MZn6OkEFZpjS6BNUANfqiHMIbQSivu7TNji3a+OAIrnPJ71vp8cbz0N2aVEa5M7I8ipvxoxAPIV3eqg3h280Vg==} + + '@turf/nearest-point-to-line@7.3.5': + resolution: {integrity: sha512-O27A9dFAqDYBRPhhoLP82Da7Q6rd0fXRR/jwQcBiycjTGdsXJmzxywuR08aDvWiARbJAmohEzdYzk4f9/eWXhA==} + + '@turf/nearest-point@7.3.5': + resolution: {integrity: sha512-qcsbj9fo5CYhGeIDaJORoqiZyjNGu2+Te31MVaFoTTxqqkXypxp9e6HJGvUi2zPd1Zk3oAWXhvm1a+UXw2G56w==} + + '@turf/planepoint@7.3.5': + resolution: {integrity: sha512-+hjECX1hDbol8psuG6iYSwcZHQ+RPJqFIBh3pXKc/pa0cdjZyB/L6q1d8ahnFrQBEpuoO3XVvo2hHN49VOEPjw==} + + '@turf/point-grid@7.3.5': + resolution: {integrity: sha512-aEPnqj/4C9ejNz4uCJKgk6Flux6SxnqxjQHAYPIP5C7ooAB1xRAT1NMnCzxUjjUq1SMtgdZ6skoNfvKNK4Rzrw==} + + '@turf/point-on-feature@7.3.5': + resolution: {integrity: sha512-Y7W+JZJCmm9Qq93NHpk4dVhzAtAk2Uyau2Uk1ttCJ2Jsnuu4dwSjOurpmgDmMUe7yPmzihAUYhMFDumpAja8ZA==} + + '@turf/point-to-line-distance@7.3.5': + resolution: {integrity: sha512-mR1NAIX+JfpYAJQ9u3gpIV37QzYvBOefDP+/16uBCAOM8Fp12goT8l7WdenT0dvB4wPibbqM2+2kyEl5u9XJog==} + + '@turf/point-to-polygon-distance@7.3.5': + resolution: {integrity: sha512-SQPhAlfiuCkIIFos/OPCxtt8iR3BlZqGKzKXLYqt6z8iaICaf2SjMyn4Zsr1oFO+Gy2K1rqandR+kuLTIo8Eqg==} + + '@turf/points-within-polygon@7.3.5': + resolution: {integrity: sha512-TRyVY5Xlx6j72sNIyBaHZNgTbILs2iUDevX5lnCFTiThkzp25BIBBQ77tv2VPilYH+v7+9/0T/pLO37SaVhsQw==} + + '@turf/polygon-smooth@7.3.5': + resolution: {integrity: sha512-dc/dlYFqVBcel6d5HM5tBANh1HfWbJ89lSVLR7YhRX+Y/UABTvbtJCWwxBBiFxFBeRmW7B45nv3jytHUYxQUOA==} + + '@turf/polygon-tangents@7.3.5': + resolution: {integrity: sha512-3/TtCQlXc2Lrgzb+LjwqbtILWan7lRD6P9Nn3edm2xGAZw5WY17+yZfpeySJPfcZhOWten9dXkOwDvSZF5uyWQ==} + + '@turf/polygon-to-line@7.3.5': + resolution: {integrity: sha512-Mat5tvJcW3grpXCNFcMvjHL3d8hO4eoIgF3qYpXj25BHx/S7SJUOgyCV5x3arC0rCfM/cB71VmNDm9k57ec7bw==} + + '@turf/polygonize@7.3.5': + resolution: {integrity: sha512-pD3Zv/392sLlZVKRGUrJ4CKLN/Im+TO6wMCOfm/uiq4F9pEL5R+HPvXTcwEyxbhEPKYn3cylGKt21Wq0OfNQDQ==} + + '@turf/projection@7.3.5': + resolution: {integrity: sha512-G4bejYKT0vCQZryMhEoS9aLmP7ThDg6nb3zi3wPzELiTrGNOd2YgkWVheQDGCk4hcqEIWZc9fI2alaRSSkkLVw==} + + '@turf/quadrat-analysis@7.3.5': + resolution: {integrity: sha512-e5Am3cJuiP43f89Xv7n9cv3Z4P0I17zBvQPvhj6UowpRbiYoD4TKHfOr2PWHLYUkXjQ+vKY5CwiWvCYbfj3BIg==} + + '@turf/random@7.3.5': + resolution: {integrity: sha512-Fid43jfmQpvrpr/wrUaW9hr66ukPqfZPuwzEt3gfCx6mAVpFWbCPx2yRuVlLNiRkMgmKTphFfh6267UCPOSnCg==} + + '@turf/rectangle-grid@7.3.5': + resolution: {integrity: sha512-SVtXOJIz7FYaRUinxb0HfE/GNSJU6eU9tlKQaERDo/vG7wjPoTCDvnH8p4BdE5GRdXZMjvBUhtNdMj+M3rGRjQ==} + + '@turf/rewind@7.3.5': + resolution: {integrity: sha512-4AZdDh55JeCoKWLS5AC6MuXqAvoqSpj2WigtowtA3JIJ/1J4SclRrV6BGq/Xemwm5yKtRePHazBVUmG5uU75og==} + + '@turf/rhumb-bearing@7.3.5': + resolution: {integrity: sha512-pYjBAuQTND0+6Y+v+zlQ7Y68SGjP4iG8qJ5QKjFRbB/yeorTY3m9yiXIN4lSyno3TPzEgBeNULuo26H6ygDyng==} + + '@turf/rhumb-destination@7.3.5': + resolution: {integrity: sha512-znICdPBtZq5EKh/Qu0TkiMyNhqiYfM2VUlFOWa7iegCWe1E+X7q/f6rlZ5TcmYVyLZ95XZ6eciDNmgVmpHVWaw==} + + '@turf/rhumb-distance@7.3.5': + resolution: {integrity: sha512-dBFxmKrjRaAdwc4SCmGyAS2BDPCH35IBNl++Ypd1RB8JR2D3khl3zrTvxrlJ5qoN1WDvyPbvDYCrt2UnTX+8Nw==} + + '@turf/sample@7.3.5': + resolution: {integrity: sha512-ayl/QlDAkqIDJjbzcBeAsMzFmIDanQP4xXdNKZmnYg83FhvH/Sgu7mMNNhrYwCVMWrmOicviDHu3xKuJ6jVnMA==} + + '@turf/sector@7.3.5': + resolution: {integrity: sha512-9mtBorGPZfbZI2MoI0nkN5ogmbCz/NLpHdEM0UwwWiOW430iPhwZ649DXH32lDGerfzREX10vpamX8v1P9YVrw==} + + '@turf/shortest-path@7.3.5': + resolution: {integrity: sha512-RmrfdDVTuBsHDNr88tGMRmIdJNFTdna3nQWRF8yFsgKR9LhZ4MWqebL24eQFn2hkyclL7O6lyPpOEJJtQxvcDw==} + + '@turf/simplify@7.3.5': + resolution: {integrity: sha512-9wzxlRA+0yNALeqyXNHFgj+8ebsg2aKdMrWRiSMS+ZqbiknZ/mCARiDYqM2Qz8TgTqdrNt53ze4o1vS6WeJrJw==} + + '@turf/square-grid@7.3.5': + resolution: {integrity: sha512-mcwefBumsO3nwRG4nPfmXsq7YqHOsa71Z3h4JwWQn/XOrhV/8l1/QX3IAIx1qUWC2RqRMOImt3et5mlc+g2SxQ==} + + '@turf/square@7.3.5': + resolution: {integrity: sha512-zUh9cxlZ4bPkSK2XynY26JSLDVy8oUss94mXACqSGrGjv308q3Voj4dzvfeh0E/Q3PQ3D8GJRZECXdCB/PU78Q==} + + '@turf/standard-deviational-ellipse@7.3.5': + resolution: {integrity: sha512-CIJaQ61bjmxxqi5CpRLWAwxnbeHcG6e7esK2IX2DXBIE/7p/F7Sk9F2GOAL6vt1o29GnmzU2APHZvTX/YKcLbw==} + + '@turf/tag@7.3.5': + resolution: {integrity: sha512-jwLOP7ZFfOcMPbK+0puT0SMOs0urSKYSYax7G4LDtZ9oPFAicVJtr2K0OB/rgmdoTK4VfUwb2nVZUdYAVnXtAw==} + + '@turf/tesselate@7.3.5': + resolution: {integrity: sha512-MI+pSkehJyZmbl2L5/43B9DlD6MEDcr63pW/LDSXYRDoRUXtSGY/NAAibIQ0gMAr8VxsimGCZKSuGMNUZdsuRQ==} + + '@turf/tin@7.3.5': + resolution: {integrity: sha512-70747SmLQttt+ywq+NmMqmkHdXsinO57SjHNFKX6G6qHuvxUu48vN7Kf3zjkqGAp2kQnu38OOqB4QPus6RdUqw==} + + '@turf/transform-rotate@7.3.5': + resolution: {integrity: sha512-WXkteI0DihwCukZesVXVVYpsoyftYoiBtq1b+u1Dz4HyATK25zfEeWChlgRtApbiePF6uqG7bSQS+K8vjC4c0A==} + + '@turf/transform-scale@7.3.5': + resolution: {integrity: sha512-eAmey/LtJVT6WlCMULsnd+sCAOwCezG6lVP67qN5HARZ8ft+b7yBiU4FC+IGXbVsrdRcCRLSzoQc6K0fROoo2Q==} + + '@turf/transform-translate@7.3.5': + resolution: {integrity: sha512-OMQLOFLIjqeDNARaa2kdh1AgvWKFgq41/I6k3CAaj1UcB4javpVFMlcjRJY+pL2oZtMRZRcUZxhO+zSNl6p83Q==} + + '@turf/triangle-grid@7.3.5': + resolution: {integrity: sha512-oiwtTm+yqZwuODOSEyLSQSFaZFyjC6kgftUFFW6kLGQtm+Fw1GjxwS7QjiY55GRWxgfgbg2l1iNZNgfsCiPQWA==} + + '@turf/truncate@7.3.5': + resolution: {integrity: sha512-Qx2iv3KIqKuDAUduMfaJ5fFegEWBeRve5zePalRevS16bMUqEX+jnKPK9fWGyUuPqT61qP1Kybz0PTWPbUbljQ==} + + '@turf/turf@7.3.5': + resolution: {integrity: sha512-l5Z1ZFEizN9p5GxX3mzUGf+i4t7AP3YpWcNdf9+kIzJcQD3eYuGBabj2hLrfrluqFJ+uxsuo4RgPtortQ9Dwpg==} + + '@turf/union@7.3.5': + resolution: {integrity: sha512-/FSKhl+LX4+M7L/Trmiln0CDPWS8vCneGnQktt1o5XbCY/zIpH1JdxHEBFXhFZg4beAyXCz0uuxRyW9N/DH+KA==} + + '@turf/unkink-polygon@7.3.5': + resolution: {integrity: sha512-7MwKCm7sPHVF4xBO/3s08/DtA/09UEBXaLNnm8/RUq3abS5zZ9PnakLsd36J18IHDscM6RmH7IZPLSwYh4TLcQ==} + + '@turf/voronoi@7.3.5': + resolution: {integrity: sha512-v51D9H+er/K5lP+rBs7jIBEXTFhl0FQOZn4mfhb7brN5sGGDmnfEFOaxIYOiJN4Qco1GtFD2Tq0NgZ8+dmJmEA==} + + '@tweenjs/tween.js@25.0.0': + resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==} + + '@types/d3-voronoi@1.1.12': + resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==} + + '@types/dom-to-image@2.6.7': + resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/event-emitter@0.3.5': + resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hoist-non-react-statics@3.3.7': + resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} + peerDependencies: + '@types/react': '*' + + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/kdbush@3.0.5': + resolution: {integrity: sha512-tdJz7jaWFu4nR+8b2B+CdPZ6811ighYylWsu2hpsivapzW058yP0KdfZuNY89IiRe5jbKvBGXN3LQdN2KPXVdQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + + '@types/node@16.18.126': + resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/path-browserify@1.0.3': + resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==} + + '@types/rbush@4.0.0': + resolution: {integrity: sha512-+N+2H39P8X+Hy1I5mC6awlTX54k3FhiUmvt7HWzGJZvF+syUAAxP/stwppS8JE84YHqFgRMv6fCy31202CMFxQ==} + + '@types/react-redux@7.1.34': + resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@univerjs-pro/collaboration-client-ui@0.14.0': + resolution: {integrity: sha512-aHB1zfcg4qz29SQXXh2DfiJ70DtK6gxDNEq0gFdl3TmqFJQOQ4iBPOi9db6oj+N2MQpROPhNDqpYsYYdxiaGQg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/collaboration-client@0.14.0': + resolution: {integrity: sha512-DhqykBAtYdrJrQYSsB9rR+Syc2WNenW0HTyn5pikLJgqUtP+u9oWckRzu2VyMjZ32i8nLmss2BYptkAv3rAlAA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/collaboration@0.14.0': + resolution: {integrity: sha512-PO5QCWieeGBB368s0ezUIkGxn5XeOxMf/QF0DvFSpUmy1B3wlr4tq2Ngi5nNXC4A8K9wcdBNMBXmzLPWBEQuzQ==} + + '@univerjs-pro/collaboration@0.15.0': + resolution: {integrity: sha512-D1ZbIylEdJvucJ42Can3lXpe4nhjnJqNnpNdsaKbo+7iGynDWUiOOjXjNzBJlchxFY/J9nlKpypVAjWRrb2aqQ==} + + '@univerjs-pro/docs-exchange-client@0.14.0': + resolution: {integrity: sha512-auYIakUUjyyy1M7wE4HLzfILa+kkXCBYsXFGPDFGCRMCn3eg5lE67xuZehBQgNOa9/xfOwNBTl25oOzrFG0/6w==} + + '@univerjs-pro/docs-print@0.14.0': + resolution: {integrity: sha512-x3ddKnqbbsqoGHHRQAilQmOtAOEc3FXq7AlTnNE9KQCQw7Hp1EoifjpHPQXuOwHS9dh5lOxQZS3mnLCLcNP/ew==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs-pro/edit-history-loader@0.14.0': + resolution: {integrity: sha512-fF7/4ye5AFwS4Obi/I8YaB2FpXy5uvhQEC81O53nFgZ25EW7skW9kjPb88jtFTe9eZAcwLddYBa9fJrMZs5azQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/edit-history-viewer@0.14.0': + resolution: {integrity: sha512-hKMRiUBcLBw8gbaQq28fWvV7IduQWrf/wU1m3oCwRSD3jpsNiA8kAgWUOzSoeJ1GvP8x/bYl/cL2feN2wumv/Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-chart@0.14.0': + resolution: {integrity: sha512-KF/HczxeCaAighj0dIB/PSfWICqZWf14jFGcxy3kKdyXIv/xk3NJKScbtfNZtdL8zQ+2ZVWJhT+266lBMBpORg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-formula@0.14.0': + resolution: {integrity: sha512-/EaD5ACfO6q5mhuCbjXMlVTfC5ayuEOT3ChwDUuA/3HuQYaoYfGjotVf0bR+SX+TXpArU2/XCb512K6BHvJppg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-pivot@0.14.0': + resolution: {integrity: sha512-4BWrO9kYjOV9+O7O5ednhLYoh9m8r0J7jpnB+VU/znRnXXP5O1rifN66BNZDk8uwBFA/qTgzbm0C92BA53SQcQ==} + + '@univerjs-pro/exchange-client@0.14.0': + resolution: {integrity: sha512-bK3O9nBqdWhEaOeykdZKOtWFtngfPZvts9lJGGWFqIGq9PEoISPVlaWFw6UlVcxo3InZ9srGkWULduK9dx6lug==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/exchange-client@0.15.0': + resolution: {integrity: sha512-wPyuYvNeOjjDBjaf0b5lA0DbIb+oFYELu+ylHaDGseIOFrwZyo45mDJQJuToXNCbTnJ03BoAY40aL+B58DFDhQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/license@0.14.0': + resolution: {integrity: sha512-5KleSxxg6LeCrqRO2ZMs928zP7XMgcSBSqmZztjREDv2WCHuKIY8gJAB2d7hHbNXGNpOP8f/E4L6jl8ggEJH4A==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/license@0.15.0': + resolution: {integrity: sha512-m6rPwBT+bdjZvsmm+qb0iVs8/O0DEEdieP+kiNzH7mqiMU5lcWMwtCBXoSCkQFD5snK+o+IBzicuHQV2hCPudQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/print@0.14.0': + resolution: {integrity: sha512-53tMov7YN7NZGwhlsYCXe61a6EpUPQMWZnsVTjIoM/WdXtg3RP0m1nV4obSzXa+QM8GTVW1fuDcKT1YKt3cHkA==} + + '@univerjs-pro/sheets-chart-ui@0.14.0': + resolution: {integrity: sha512-wf36OfV/RnSWe0cO+0TqA3XDCPGFqHylL0Yzuu1MA+QvQcZiwjVZWrlyJtTL7wwU0EtkbtVsr18X5YTw1hyDJA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-chart@0.14.0': + resolution: {integrity: sha512-Q12bWTpYcXfOKHg2UUT0SNCbpQH9SCjS7UViGiD3RXktImzVaB4ln4qd+lfKKHiqSn8RTi2tSMg2TIwDODasGA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-exchange-client@0.14.0': + resolution: {integrity: sha512-Cs9FO7fdZB75Io6NSCQokzGbwRhX/+Ump3ibepj403al31ZeAr5PW77p6Hde9M8hMZWpt31GLVelbsyrZ2VDcw==} + + '@univerjs-pro/sheets-pivot-ui@0.14.0': + resolution: {integrity: sha512-T8q7cs8QGO3YD9BJogf2y9laDr8X5cD7SOz7JEDOpcafTpoTKtBwojhhpFMGeziCDdRs2Q0wUKDOLXISN3nJOg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-pivot@0.14.0': + resolution: {integrity: sha512-sROfXPRwZ+6hDc80gojVQ4t369hvd1HlhcUnpZ9TTojIceCLhXKvNkAvlfARzmpxKnmjajzvheA24u+Eb5uqRQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-print@0.14.0': + resolution: {integrity: sha512-gs6ycmkkgeygTBv0coeXr8l/AFYR+3cATOTu141+LtD4Jz/NISHD45wIWSIhOA9KHnYbIiNqq4WsSGlAdEuzZg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-sparkline-ui@0.14.0': + resolution: {integrity: sha512-bvuhzZyEnT57dZZ7c2Yijq37KYdEvTVcAXH0bgy91TuV5CstK5QZZp1d9PxHS33zOScC+nmfCXStpOxQ8V3rPw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-sparkline@0.14.0': + resolution: {integrity: sha512-OlFSVIbgC4IqpKVOrtECubvnT+MCmJNRxX7O95LJ7KZjETCHYM+szbjsVSxiwILks8lD/JYkKO/b14guhDywFg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/thread-comment-datasource@0.14.0': + resolution: {integrity: sha512-j3Rqkk22cS5gxT1+1ryIPa2QDkxMw4rmkvMdGMDXGV+0OGgX9kFUKb50V60z2N352y3mnoYxgFU50vx/zHqp/w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/core@0.14.0': + resolution: {integrity: sha512-k2LOLByfknzAPKJtX7KTN1ZaGUNBORB6wNLGSYQ840HEwONLrflqnFfDMRm4nmQw0LtdlplwbLHZlhcRBZZEzA==} + peerDependencies: + '@wendellhu/redi': 1.0.1 + rxjs: '>=7.0.0' + + '@univerjs/core@0.15.0': + resolution: {integrity: sha512-0TyxqVxj5sewKS/njKdRZ1Gx9biMn8OupbpsjCjGfYFynKOtULh8GolDIZaNice4pmrHNuUop/4uxyan4TEj9Q==} + peerDependencies: + '@wendellhu/redi': 1.0.1 + rxjs: '>=7.0.0' + + '@univerjs/data-validation@0.14.0': + resolution: {integrity: sha512-72aORgfuVi7BthTqmIo0A0tK43OAJ64RzVghBMv7Z6EpF4YJW3XqBQ+IKRfUSvbeyH6C+v2GeIv4jJfcrkwSCw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/data-validation@0.15.0': + resolution: {integrity: sha512-NXq+fLLwd9tfp+uEuOUB96xd100J42WBZE+sYrcrZoVPR7w36EqCnwgkqzkeGWOj9M+PSiebFaNkkBvUyenuQQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/design@0.14.0': + resolution: {integrity: sha512-TgVbeFzbG41RtgjI/GdRUZOcKEp9DagA8Nh5LT+HSmaHWs5hI/3O44aqMHEXcya/hCi9xGe0iBl9yGubnUdVGw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs/design@0.15.0': + resolution: {integrity: sha512-Cd3vyr1ObbfAeRpyfljPiyPOBbrp91Bb+o2Vc3lLeRmq4stYGHR17gb6I86EMyRQcAR73eDmpq/KBa6Nq3m0Xw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs/docs-drawing-ui@0.14.0': + resolution: {integrity: sha512-fGLbQraUZI4ZcDDgaQPqMs3lw7/9zBMog8SC+cHTsXvEZAAi14tw+h8vseVDHQOKFQWA2OM1DvcmS0ZzBEU3xA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-drawing@0.14.0': + resolution: {integrity: sha512-Fvy8V/Vht0zUwb4eDOvBrZ+eN9ajWNyl7cMCwKZajgv10/wIkSgUkTBpU0jLmPeazuxBwGQuXL9OmITVglfeIw==} + + '@univerjs/docs-hyper-link-ui@0.14.0': + resolution: {integrity: sha512-2TuTQPjJwEjgAjuWiLKRzlwrqfPEcnuL6eIaXnPBxLIGRPXcce9BlwU0O/SxYL2X8iOyb2iM6NGeqBgXYd4wlw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-hyper-link@0.14.0': + resolution: {integrity: sha512-ip77sB86Uqje72qkYHYbd6+AcGCPCZnhH8G74Z8lo4ECqRGp9aFk7dbS6wEUqo6oYpWc4gbUDG0Io0lc7DnBSg==} + + '@univerjs/docs-thread-comment-ui@0.14.0': + resolution: {integrity: sha512-uCWfzM+bXyTtQc+5OeU7cu0vMnRTgASl541gqD06EC+TJkwbSZlPKCWTA+DjbxcUr/tyowA2w1O4L8QGssx3YQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-ui@0.14.0': + resolution: {integrity: sha512-cO6Q0dFwbzRXSnO+zy4jF5cpM+2xmaotLUIhgZiLTPFH85+gK+rlSSbG4qiEtcEdj+7VAkW2/Pka8vIir+VL8Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs@0.14.0': + resolution: {integrity: sha512-eyd6hX5m2JAxjSobXDny+uK/IWWNY1o92x/ag6iTQuZzGiwBds1tSvQJlCOdaKTgatHWNFsQVyh870Oe8U56YQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/docs@0.15.0': + resolution: {integrity: sha512-QXsFPWrJlwUXF6lqJKMKv0RdITd+XheHmoP44qcsY6ok2Ee9ck/1LQV7htjQMDv7qm36V0QZliyT10/j2hyctQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/drawing-ui@0.14.0': + resolution: {integrity: sha512-U6I7rHjJk6z5bTRDP7LvV+k6Vsbewxi6Vkc5FSi17L9Q7ermrn7EIrjMJsIRv2joS2pSUVT/GgSvRPNeJH+p8A==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/drawing@0.14.0': + resolution: {integrity: sha512-nVY5Cr+AZY61g4phXstceRAcxPow1tl8mt/4Zh0x3NT/s9on9MXREJ/5m74MW/M9mGFMTfK1+MZeAqyQ/SXEPw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/drawing@0.15.0': + resolution: {integrity: sha512-jBL/oDcWdJWx8e2r61rvVPAYDWCc4M2qImzkcEK0cASB7e/lNJAgThaRNGjEWvnkw46OFOZJvZYVFbGTEjDw3w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-formula@0.14.0': + resolution: {integrity: sha512-VWvjRDs6d54vpiDIkk0NR1ChG97Q/A1GMpSRvpsMfow11a84TJW3dG/eLu6SnWnnO5+8RYsfymspuGj012mYaA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-formula@0.15.0': + resolution: {integrity: sha512-eLAY2fj5HYyOGXQ1GFfv6S8BTP89kTu1ozh3PPjfI9guKtS14ui5OkvekN3PftqTRVvazXbdiqo9QhbcRVJQtw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-render@0.14.0': + resolution: {integrity: sha512-FGmGhAJko898K7j15oSRMRqKUmpgmG4J68/Dxb8FNsUARaulT0Xdqis0I8CF8mo4NvUrrZ+vdiOh7AjwShB20w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-render@0.15.0': + resolution: {integrity: sha512-ZINu4cT6E2TtUI/1ZMr/M92G9VBaPksHmsep5DQjHCtqEoJUNWwF58bpc/Yj3Dhbq7mWIEmgFc2vaJsK3TGdcQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/find-replace@0.14.0': + resolution: {integrity: sha512-XuiI2X/YxNesw28AaztGV0z3dToEXw1iujhp6nS4eW5uKCz6c7NerbLhEHWM7TCfYg72jtLJAZ/o4SBWIDZoew==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/icons@1.4.0': + resolution: {integrity: sha512-ohBfPk+EyLuSc+1Rvz06jiMDgEydwc6lLUOQyUjS/W3zBKYLhbXaEP4qq7/YQH8OhzkTsRQGvsTgYSg1roRXgg==} + peerDependencies: + react: '*' + react-dom: '*' + + '@univerjs/network@0.14.0': + resolution: {integrity: sha512-RmKxhYHDn9wDVCokN+Z1l0Qz3vm6bN0omDVF5Ib4T6r/Wistl05ojjqqU8eMjRew6p4qtu+NvYTpPxQdo88FNw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/network@0.15.0': + resolution: {integrity: sha512-7dyBTEb/zrREbPj1aeUN6/YurWbxWGiPrBPIeMB4MYMKoCvyjehi4Hc9AzJwHB/trWvhrZRQRYjTgWi3n1+NdQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-advanced@0.14.0': + resolution: {integrity: sha512-b+ToB6+WRkdinCcjnXGMfrXofzjNBxaLhDgq4qnkPh/GrApragiJNMdBf+047V8XrYqY42Ld2mVKhcNnjfQHNw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-collaboration@0.14.0': + resolution: {integrity: sha512-y+aADYhMYwVKMQbUQw1YOJM8Q38u92JRONUkXCb8G6Cdr8DOgwN7fp70yVVkhlyNEuxTPAY01htop8Y4vjn1JQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-core@0.14.0': + resolution: {integrity: sha512-qjiEt3B6XpM/M+NoyzDxNeCsyWS0wP4aP/vnJRfTlAhYoLQmjOWgMByLGJkoF53gNQjZcbSyS/7BOy5OHvPHPA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-drawing@0.14.0': + resolution: {integrity: sha512-wqkOk+dvU5XjGhbUkKdMoTz12uDk+hfpjZlhGYUitZtTSBEDgT91zY3M+g0RvM8y1R3IxmevIGsJn7LhFgaoyQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-hyper-link@0.14.0': + resolution: {integrity: sha512-pJSMWQaeTAkwhij8gdavKG2kuqKuJfyMY7jjKpSYZmV+o7KIVhdvPEtKwS5zx7D0r5KDc2OJk4iXzBU7hGwhTA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-node-core@0.14.0': + resolution: {integrity: sha512-jeDnI4/nG10vQAoworT/bf7NzBzfVOuwIqhNpqHpK4LkRnKa3EDJ1U3eTTJKsswUT1AqqGZXs9BeJknzA3NDzw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/preset-docs-thread-comment@0.14.0': + resolution: {integrity: sha512-d6goth0azsT0A/j6Z3LiBRQLB/78XYH7nrBgPC09uPO3WWJpxoJpUD0XAi4haCiMZfs9LtyXd+KyW93qTNXHEA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-advanced@0.14.0': + resolution: {integrity: sha512-qZGz889jDkN2OpYze4YKcZnOS8T2//8ULkZ6X2GLqYbPFsdb9KMFgzN8sPPpLJtvKXwJOxOsdQj8/IQtJfP4Yw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-collaboration@0.14.0': + resolution: {integrity: sha512-OdsJEeznMLHlTi+3BDusrcUQpDEM2EWABKUM2DTnzQk6x2d7UXMSlxiuRoU3BoQowrcykgIo1HfC393su5ajyA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-conditional-formatting@0.14.0': + resolution: {integrity: sha512-2RiPGcVaoH5MV1A+kenzQRWZDuXhr2p2vy2vnwiz0mC9ZEVBrBxVUmR1lTXa/G5DBgvkeZMpacKUKytB3ID4WA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-core@0.14.0': + resolution: {integrity: sha512-WsIoPPK3KaPZqyRNJpQx73Lw8I8wB2mWvggjtIlOYdCi64/084WTV0COuoG75i3UbG7ZP1mTF8RZ26nsb4epbw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-data-validation@0.14.0': + resolution: {integrity: sha512-7g/SiAjb5TAocFEcWXN+JjocKxSEVNTQuNiyUH/6gsV1MS33/iJORDl8WKuLzsEHQoY6pCcImn6wH2Glf5rNSA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-drawing@0.14.0': + resolution: {integrity: sha512-Dj1ribLYwk4QD1OADPeuWJQ8sU/yBreNEwyml/5IJIABil+Va+X2mOo7ZfabD0uySg4cWGY6MP30zV7cI460XQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-filter@0.14.0': + resolution: {integrity: sha512-6tgAQO3wQSChdeAGpyrryf6DzSxuU/QF8HJrlap5I4fSwLM9Os3NiaVI30gwsrzCpamvwcdJEevMmroOk60FRw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-find-replace@0.14.0': + resolution: {integrity: sha512-ibRfrP3lbXuHEWMC5N4tHqGL9lqOlzekEP+KZr+OZSqffFDDk5ESOS9Dn7BDq1KXZeW8JEoOq4/Nn6NLP6TFlw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-hyper-link@0.14.0': + resolution: {integrity: sha512-CzOHwui5YiX8jIinKECMvHpA5IJtzNeuFGcO+UnUMrTRjjNIlpRoGIT9Tr+Z8fq45BPG20+95W5nnyoeSiRW6Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-node-core@0.14.0': + resolution: {integrity: sha512-rY+2GNU2COkV6HniDipGngC6nVqfoJ8e71FgUBLaeFZ6dw9LjGl0d4fyI9IHMpYbrwM3gJeQWPocX/kyDDI7Qw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-note@0.14.0': + resolution: {integrity: sha512-OmDECNNmk1r1nkWfclCyYyQ+VwC7xFCF1XTtnccfVmzhcVy9L4DUgqhv46gEnvet7/5pO0dx6KGl2WkbONCx7Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-sort@0.14.0': + resolution: {integrity: sha512-0U5MID+IzebiuBcFj723TkXFlBGXmFWZ+hf+2KGNO0oVp/wcyM5rbN/792ZrUbab+voEZDuN5tPA5pDWcH4xvA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-table@0.14.0': + resolution: {integrity: sha512-lqzXHMc5r2gMLG2MAxAbKb+PScxqoBaglXuw/rCIcgNPD65p7nQT1x/igQV8dc12pgxEDIEr/HCNAEG4ZYBAKQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/preset-sheets-thread-comment@0.14.0': + resolution: {integrity: sha512-/U2rFweBwjLD9HRi5ATIEYcRwzInE+RM4myLhBrWKFAj72uCXUrvMymQaLWQTxeWaLukBBSiGk+d8LHw/luTCA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/presets@0.14.0': + resolution: {integrity: sha512-4laUGuSwmO2qQ3IPs6CTFqVsSUhrAG/Pc+qZ3pvfeFEzRHqx37pMJ6N0+cLHdK/aS5BGmiN1AIhUEsRR8TT0lQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/protocol@0.1.47': + resolution: {integrity: sha512-EkBSaBe51nGPcG1j58JRjE0yBe8ulomJMLKJbKikkkfhgAlt+f8i5inHFESfsfpG2Ui9FOueo2K0exYDpf6iaw==} + + '@univerjs/protocol@0.1.48': + resolution: {integrity: sha512-nFHNtGAWOV0u1+IqoznH9K7hV/M9OZ61Vqwy8JMWKlgLLsx12m3vJqodkrVlLkI2YU5WuwjaUT1+J8/nM+kcUg==} + + '@univerjs/rpc-node@0.14.0': + resolution: {integrity: sha512-6G1MMzVvleOcyK039EOfiiwI4FRRp1wpfWTU/hdaTX2KFtCR1iMGn0Lklffq2NuqVyfc4BzJul4SAzwpCGdGsg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/rpc@0.14.0': + resolution: {integrity: sha512-SemHl3KbDS0LNSe1YRs+7GBI2gh8VHYCh605YYSuVSO4ngnFgMTOnSEWzom1+Z1ZlwKax06c5IwfcsnlALGelw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/rpc@0.15.0': + resolution: {integrity: sha512-dizOeWIpSXk3Q78s7qjYyTpnPCunJ6YUz+GEMdVMlMMqXafQO2JFwbGH5B/1jF1b1XyLjOZg98v1E1APmPsWjQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-conditional-formatting-ui@0.14.0': + resolution: {integrity: sha512-GFOualeEc2qqF9NfuWNFkU/vvAk22+n9m6ABpPlJ309eGO7a6jZc9c0YizJ6dQUPwv8d+FsMtf82FIZk1ONVNg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-conditional-formatting@0.14.0': + resolution: {integrity: sha512-7j780xMqB8JKft3h39BksgZt8o0OfxzeFykhWqNCgTsNsMEuIocLL/hCpy/W3ww/H+HJXJA539YnlqKVOqOkyQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-conditional-formatting@0.15.0': + resolution: {integrity: sha512-u0YNh2WGan3f0xUlX6LUZn7vqQrBoaVPVOIlCUaAlccAnWeiKCqc2tcM6QBdPX2JW6kZzx1et85jcpNM5bFcgg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-data-validation-ui@0.14.0': + resolution: {integrity: sha512-ipigYw25H69FRzk5yWpOLByQebPWdTqnOEqu2vmKobEztSXGSQF5kYbBuRgGKyMDVgU0yx0SYsRkt0Aa3RbCbw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-data-validation@0.14.0': + resolution: {integrity: sha512-X3r1QsuHylsH/LbBx578yDQt0kIiKDCFN5pWIonKxA9lcC+bFmV4uUEGodwzAe+5VkfUs2L/R7/mnBt1oMCipg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-drawing-ui@0.14.0': + resolution: {integrity: sha512-3ckEmtd1l/HflfgMIs/5T8K32WexBcPWapjca6/iqDEYoWRg2AJgB7Xvjp6nf4DRAntcNQgumos7FJF5uv7aoA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-drawing@0.14.0': + resolution: {integrity: sha512-av/nz0FgVqgBW92rgr9d6pKp2kDheZt+gzR5+4MrPsqV+2Nwotf3Go8DXt9/SauoXwy/Bx6NvnZp/cmYMbWNMA==} + + '@univerjs/sheets-drawing@0.15.0': + resolution: {integrity: sha512-J1aqmRo0wvn+YhoZyiNNx0B87EFE/tKIPm6AOEePm+A467gFqYKJALyr/aLBLbls5auRkIW2iimj0AbqpAGmJQ==} + + '@univerjs/sheets-filter-ui@0.14.0': + resolution: {integrity: sha512-7do25esWpfX1ygA5ab7SCD+tvOfqV9t1jSiS2L4sKoFTlC9J+4kUnxqvR9TNqfJrYXa+nslKjX2A6812a7VzQQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-filter@0.14.0': + resolution: {integrity: sha512-j69evJkSZ2WLM1ouOIWnonQdKrJ5VFUICCrysZ05TDU2doHHRJ9LoNoKy7Pz/ts9zEZqapWx8tfIJ2UKiw+kFA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-filter@0.15.0': + resolution: {integrity: sha512-u6qD/EEEqerlrCPBPAqXCHL+UWKjjpkX2JqIiEKK7CjuIFgJr6TLGxXRyH1PQ/xc/blQlrTJU5UWTgTCPkwmJA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-find-replace@0.14.0': + resolution: {integrity: sha512-lUoY3e0Ag9VOjrgzXgBT7lZLBTHVMxWs4hgvvu3VH/hk5AdEfjBBeEq17HA30FCF2/6h04OhFSbKc/meCH9fpw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-formula-ui@0.14.0': + resolution: {integrity: sha512-ZTYBWsZUIxLKdg3k2cMKruELUs9ovLJfrQAXk6sJDZfHhe8dj800ylY6JNjCA159a0ppkWg8FJctisDTTH8I5g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-formula@0.14.0': + resolution: {integrity: sha512-NlutGs5MRPOyjWVSCDJWYPeRMtd+i7kwHUW00GUqy1LALBh8Ca9EOWxl8UeiDnwtvqaTh7cIeRn5bdQN8ZrbAw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-graphics@0.14.0': + resolution: {integrity: sha512-miy3GUqPu/vuHgQoNkHHgvn0nnJRqAZNDlIFUamhgT1vAPQgaq/CE/C+8IQ3dWS5/3CJ2uu3/6IoOt1FEUM1Qw==} + + '@univerjs/sheets-hyper-link-ui@0.14.0': + resolution: {integrity: sha512-UdmaAgDNIQrdk2hSn44N6iOmUUUhV6RiL+5P0NhovhM+umqSNoFrus9Txz9+9D+iMDPT1pA1fgtVfoP7joL8HA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-hyper-link@0.14.0': + resolution: {integrity: sha512-gwdKLMA6bCSl8oE+n0U0eX3ilqbMjlzNT7v/dSrFRwoYGKrkTK/aLC8eU3C5/eGKUvaNIEFoXfT9bbCH+yih/w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-hyper-link@0.15.0': + resolution: {integrity: sha512-blf1B3iDoTqKzgrKe7AnmaID2UPgm1CKBEQtNWIMIbZIk66n9W8gwwrFa5/+L18CTVeqDIHhanVstBIEpRiDdQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-note-ui@0.14.0': + resolution: {integrity: sha512-UKV1+Ml2BNYQKkEjaiBDLhy4S8YqxHMR3oqs7mKJ92dfVW/15z3ZbzTfNvTHnwAOaOLwCuNi2KNRZW1Bagv3cg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-note@0.14.0': + resolution: {integrity: sha512-0jNfaM7VeA1ERxXJ1eFAIeVJbefWAy6LuL7pRoTdNI2fl1N2AuZ9wNKHegXIlY+9tM5KlDzsy2ru1etJS3e/Rg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-numfmt-ui@0.14.0': + resolution: {integrity: sha512-s3qxz0p1dpnoy72xSmypTgxValuNJ0W17l7hBbCDxoxusNeyE5PxLg0HQQFPp8reVDwUXwjIUZNjxAfA2wj/eg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-numfmt@0.14.0': + resolution: {integrity: sha512-hQJcjjljRYRKmliH9D0uVZeSIEOdXBoj5VR7LLeZ/Xg/KlsXLkjdMXjBNdu+9OOT/2M+zZyIFUQGr2tTgfVY5Q==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-sort-ui@0.14.0': + resolution: {integrity: sha512-Re04OXlDp9zNdYskOC8p4UMqxlxQhi/HZ73Pmo59XImYtytmqvcgw0yklyVF0B4WYyTA/4J0PKlyechN0Ny0NQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-sort@0.14.0': + resolution: {integrity: sha512-uHjDz6YlwW8vUFLVBohVLg0s8pKx3Bq3xtMkWG76Op7Ko3BMWrDxCV7VEfRk4UQMLP06g2C1da7vR6tO99rM7g==} + + '@univerjs/sheets-table-ui@0.14.0': + resolution: {integrity: sha512-DAQnl+Nuqyj3uKinZFbfc+7jWCvcEPr6pZuzauryzSFzz0xOOaxR5Z5iXxIWP7jlLw/+cmXZHSRsi2dW6GYc3g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-table@0.14.0': + resolution: {integrity: sha512-yYIoL+bY5+7W3RvCu8wAz9y2lJkEs2OBPqX7YlL42BCp+vnipsWFGSjpDViTd52ipw8RIpt5StELRFaRz/bBJA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-thread-comment-ui@0.14.0': + resolution: {integrity: sha512-XjOEt7B22aJXg/SHOWiVKvC/nXq7mYYMwdgYGe5Zswhh8AAomOVtiPWNpTPqvn67G4Bfp1olr5x/ndUmF6u7Hg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-thread-comment@0.14.0': + resolution: {integrity: sha512-EdXa0gVAgrZJh6vmuzO6YwFx0hKXkW5Y9uEc6z4/kFDlXURMgHeXWyD7OSkhfffT4fiTnRuPAZB3k65qCfipUQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-ui@0.14.0': + resolution: {integrity: sha512-RHHadP7SvPijfprhycWIPS2xWYDx77dTbKJz/NE65DStTeDs2ldhEE8j0ckXtgrogpHFzd32MLXfVvo8dfMQdA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets@0.14.0': + resolution: {integrity: sha512-k0gVjIk5oLI7G8tyKA6LuJoDDe0X6AGktNP/p6gasSz1RaVwjU1PXvYsJq1icpmeGzXgitlGcTOcHZqmegmXiw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets@0.15.0': + resolution: {integrity: sha512-lxIkJj2m6lIUbnaTHOit2spRwt93TNbmFbzGwIhX3zlOEb2OZKJCeHQVU5bY72mlRNKkChoE4yiHmv0tx3akTw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/telemetry@0.14.0': + resolution: {integrity: sha512-7kEDIlIx47vC7buecdUQr6fb466skxdX0cI0wIUlkNHEj8lqZZ1Q8jVeVEjATdopuPLztuFziOinPQKit/P6og==} + + '@univerjs/themes@0.14.0': + resolution: {integrity: sha512-xfkjA4EbctI3WwDp5PWv93Yb4cDvbddJROc2ET2ReE1flEFacRjLWQLay8PeOYYuRXAOFomDUOmZTSBudbfyVA==} + + '@univerjs/themes@0.15.0': + resolution: {integrity: sha512-7jO/tX/ZpIs7zTis8fS4MvaeC/CDD2ozIu1fbtUKmhUQhtn/kn2iwr2a1DjANGO6u4CFtbegTd8SQLbLrgwlaw==} + + '@univerjs/thread-comment-ui@0.14.0': + resolution: {integrity: sha512-STyf4ztjYEmRtQel5BcXTRflfDjXyuwiPCu6UPjYs33vqLUli9UCwKP+sNDxyQYwmuSr4kU8+u8KhOc3Asqp5g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/thread-comment@0.14.0': + resolution: {integrity: sha512-cNhsjmZoEjQQfKQiAFPFKkpMOrwf1lLaMWT9FonrpjdGFpYMtHCG+dMDD99W6c+WVkHHoeSH1rX1SH3wRSTpEA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/thread-comment@0.15.0': + resolution: {integrity: sha512-jH6nLLrVX+eIXxKMRR9LjMiDb7nklYJaDeARpW7PVTeDwAJpyuRlxNygcGIi/IWlMnveP8EHhPA2wiBHRW+ZGQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/ui@0.14.0': + resolution: {integrity: sha512-so2XPPVqcsvKuZq1ZyhUlagISaveHNA1ixv3fNdlRHjUNto/Iom86u8RSXbM+9wLgQkRwtcbxz4je7ivnrbcCQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/ui@0.15.0': + resolution: {integrity: sha512-hcBM+34f055u/PP3V4a0JyNlyQ8Mo+ZSHzI39kKYY5Th+H8W5gKmIKdBk75Xw0b4GiWEmTr7NxJ+Gky5lxD9pQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@uppy/companion-client@2.2.2': + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==} + + '@uppy/core@2.3.4': + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==} + + '@uppy/store-default@2.1.1': + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==} + + '@uppy/utils@4.1.3': + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==} + + '@uppy/xhr-upload@2.1.3': + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==} + peerDependencies: + '@uppy/core': ^2.3.3 + + '@videojs/http-streaming@3.17.4': + resolution: {integrity: sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + video.js: ^8.19.0 + + '@videojs/vhs-utils@4.1.1': + resolution: {integrity: sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==} + engines: {node: '>=8', npm: '>=5'} + + '@videojs/xhr@2.7.0': + resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==} + + '@vitejs/plugin-vue@4.6.2': + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue/compiler-core@3.5.33': + resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==} + + '@vue/compiler-dom@3.5.33': + resolution: {integrity: sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==} + + '@vue/compiler-sfc@3.5.33': + resolution: {integrity: sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==} + + '@vue/compiler-ssr@3.5.33': + resolution: {integrity: sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/language-core@3.2.7': + resolution: {integrity: sha512-Gn4q/tRxbpVGLEuARQ43p3YELlNAFgRUVCgW9U5Cr+5q4vfD2bWDWpl3ABbJMXUt5xlE1dF8dkigg2aUq7JYYw==} + + '@vue/reactivity@3.5.33': + resolution: {integrity: sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==} + + '@vue/runtime-core@3.5.33': + resolution: {integrity: sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==} + + '@vue/runtime-dom@3.5.33': + resolution: {integrity: sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==} + + '@vue/server-renderer@3.5.33': + resolution: {integrity: sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==} + peerDependencies: + vue: 3.5.33 + + '@vue/shared@3.5.33': + resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==} + + '@vueuse/core@12.0.0': + resolution: {integrity: sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@12.0.0': + resolution: {integrity: sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@12.0.0': + resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + '@wangeditor/basic-modules@1.1.7': + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/code-highlight@1.0.3': + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/core@1.1.19': + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/editor-for-vue@5.1.12': + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + + '@wangeditor/editor@5.1.23': + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==} + + '@wangeditor/list-module@1.0.5': + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/table-module@1.1.4': + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/upload-image-module@1.0.2': + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wangeditor/video-module@1.1.4': + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + + '@wendellhu/redi@1.0.1': + resolution: {integrity: sha512-vKJFlaPjXsyqcJFNKJGmdLRup5uUZGQuZUA41e67at5y93kEYJo5FpJebAfs8LStJjItHWv21t0Aq+0UCSYSsw==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=16.8.0' + peerDependenciesMeta: + react: + optional: true + + '@xmldom/xmldom@0.8.13': + resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} + engines: {node: '>=10.0.0'} + + '@zarrita/storage@0.2.0': + resolution: {integrity: sha512-855ZXqtnds7spnT8vNvD+MXa3QExP1m2GqShe8yt7uZXHnQLgJHgkpVwFjE1B0KDDRO0ki09hmk6OboTaIfPsQ==} + + '@zip.js/zip.js@2.8.26': + resolution: {integrity: sha512-RQ4h9F6DOiHxpdocUDrOl6xBM+yOtz+LkUol47AVWcfebGBDpZ7w7Xvz9PS24JgXvLGiXXzSAfdCdVy1tPlaFA==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + adler-32@1.2.0: + resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} + engines: {node: '>=0.8'} + hasBin: true + + adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + + aes-decrypter@1.0.3: + resolution: {integrity: sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==} + + aes-decrypter@4.0.2: + resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==} + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + alien-signals@3.1.2: + resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ant-design-vue@4.2.6: + resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + + antdv-draggable-modal@1.1.6: + resolution: {integrity: sha512-nGYIbkHfXBwKOtcw9lknpCdXK/Co0MpikywHREdgGI7dNm5c0zwHgolWf2XQSRvQx9sAtv2+BJYeDsJF77bncg==} + engines: {node: '>=18.0.0'} + peerDependencies: + ant-design-vue: '>=3.2.0 <4.0.0' + vue: '>=3.2.0 <3.4.0' + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arc@0.2.0: + resolution: {integrity: sha512-8NFOo126uYKQJyXNSLY/jSklgfLQL+XWAcPXGo876JwEQ8nSOPXWNI3TV2jLZMN8QEw8uksJ1ZwS4npjBca8MA==} + engines: {node: '>=0.4.0'} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + autolinker@4.1.5: + resolution: {integrity: sha512-vEfYZPmvVOIuE567XBVCsx8SBgOYtjB2+S1iAaJ+HgH+DNjAcrHem2hmAeC9yaNGWayicv4yR+9UaJlkF3pvtw==} + engines: {pnpm: '>=10.10.0'} + + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} + + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + baseline-browser-mapping@2.10.20: + resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + better-scroll@2.5.1: + resolution: {integrity: sha512-OiF3cQroRfTzf+CRQH2z1G52ZAlNHINI6lCAvDmyFu0o0nRuTaV9F+fmBGIU2BL5p5IplUQ4E7sYa1TLfZarzQ==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bitmap-sdf@1.0.4: + resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001790: + resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} + + cesium@1.141.0: + resolution: {integrity: sha512-bRwgABDjsXRqNLjeJAxSlCrWCTvAt/yWJD30fY5CbqtoEKR6g/YCOcJW37vk4w/Gq3uMW7sF1uP74ajRrktjEw==} + engines: {node: '>=22.0.0'} + + cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cjk-regex@3.4.0: + resolution: {integrity: sha512-m+gbmlIP6gAG7tDvo2kpeSPAz/uh5wY5/zx10ymjdpbbiTHNTNoYnP2lCiyqtmbLxwhEdq8/lsVbsy4GTc9oUw==} + engines: {node: '>=16'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + codepage@1.14.0: + resolution: {integrity: sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==} + engines: {node: '>=0.8'} + hasBin: true + + codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.14.1: + resolution: {integrity: sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==} + + commander@2.17.1: + resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concaveman@1.2.1: + resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cosmiconfig-typescript-loader@2.0.2: + resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + typescript: '>=3' + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d3-array@1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + + d3-geo@1.7.1: + resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} + + d3-voronoi@1.1.2: + resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-passive-events@2.0.0: + resolution: {integrity: sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-to-image@2.6.0: + resolution: {integrity: sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + dompurify@3.4.3: + resolution: {integrity: sha512-VVwJidIJcp1hpg2OMXML3ZVRPYSZiq4aX7qBh83BSIpOaRDqI+qxhXjjIWnpzkOXhmp0L81lnoME1mnCc9H48A==} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + draco3d@1.5.7: + resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + + echarts-wordcloud@2.1.0: + resolution: {integrity: sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==} + peerDependencies: + echarts: ^5.0.1 + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.343: + resolution: {integrity: sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==} + + element-plus@2.13.7: + resolution: {integrity: sha512-XdHATFZOyzVFL1DaHQ90IOJQSg9UnSAV+bhDW+YB5UoZ0Hxs50mwqjqfwXkuwpSag+VXXizVcErBR6Movo5daw==} + peerDependencies: + vue: ^3.3.0 + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es5-shim@4.6.7: + resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==} + engines: {node: '>=0.4.0'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.2: + resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@4.2.5: + resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-vue@8.7.1: + resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + esri-leaflet@3.0.19: + resolution: {integrity: sha512-GBMRuRV0zyzVSxdImwKnnTh3ptMvzeaGdnsL68BwPLebibEOsgquRKArwLNpuIz0E03SXccaJafiDLCGvp2PGQ==} + peerDependencies: + leaflet: ^1.0.0 + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-on-epipe@1.0.1: + resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} + engines: {node: '>=0.8'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.3.11: + resolution: {integrity: sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + franc-min@6.2.0: + resolution: {integrity: sha512-1uDIEUSlUZgvJa2AKYR/dmJC66v/PvGQ9mWfI9nOr/kPpMFyvswK0gPXOwpYJYiYD008PpHLkGfG58SPjQJFxw==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + geojson-equality-ts@1.0.2: + resolution: {integrity: sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==} + + geojson-polygon-self-intersections@1.2.2: + resolution: {integrity: sha512-6XRNF4CsRHYmR9z5YuIk5f/aOototnDf0dgMqYGcS7y1l57ttt6MAIAxl3rXyas6lq1HEbTuLMh4PgvO+OV42w==} + + geotiff@3.0.5: + resolution: {integrity: sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==} + engines: {node: '>=10.19'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + global@4.3.2: + resolution: {integrity: sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==} + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + + i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + individual@2.0.0: + resolution: {integrity: sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsencrypt@3.5.4: + resolution: {integrity: sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==} + + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsts@2.7.1: + resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} + engines: {node: '>= 12'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + ktx-parse@1.1.0: + resolution: {integrity: sha512-mKp3y+FaYgR7mXWAbyyzpa/r1zDWeaunH+INJO4fou3hb45XuNSwar+7llrRyvpMWafxSIi99RNFJ05MHedaJQ==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + + lerc@2.0.0: + resolution: {integrity: sha512-7qo1Mq8ZNmaR4USHHm615nEW2lPeeWJ3bTyoqFbd35DLx0LUH7C6ptt5FDCTAlbIzs3+WKrk5SkJvw8AFDE2hg==} + + lerc@3.0.0: + resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + m3u8-parser@2.1.0: + resolution: {integrity: sha512-WbEpQ2FUaNGbJ0YanSeyj9D9ruu4FUvz+ZvebIzI2bSME+PUwcPXO1kKXZkjcPUAFruDikoOI5fWQNIA6JCCOQ==} + + m3u8-parser@7.2.0: + resolution: {integrity: sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mersenne-twister@1.1.0: + resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==} + + meshoptimizer@1.1.1: + resolution: {integrity: sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==} + + micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-document@2.19.2: + resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + mpd-parser@1.3.1: + resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mux.js@4.3.2: + resolution: {integrity: sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ==} + + mux.js@7.1.0: + resolution: {integrity: sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==} + engines: {node: '>=8', npm: '>=5'} + hasBin: true + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + n-gram@2.0.2: + resolution: {integrity: sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + nanopop@2.4.2: + resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + nosleep.js@0.12.0: + resolution: {integrity: sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + numfmt@3.2.6: + resolution: {integrity: sha512-MXc2KP3j+2usdHTY5/ENUc2S+3BRF/cJqnR6RHeq6LBqKoIZOAQ62DQw974nnaZOencbfkmkTPyTmMnlkCpjzg==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + ol@10.9.0: + resolution: {integrity: sha512-svbbgVQUmEHaKpLQ8kRySojs59Brvgl2zYIrqG9eQNXGfsbi55rQasZIDpwpQzDL6OlzrUb0H4hQaiX9wDoGmA==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + opentype.js@1.3.5: + resolution: {integrity: sha512-thKDiELidAApOvXlncrpwDZKJCa9fXLEKM4+FoEWI+qTLDeNb+h7EkN+8a7KQODsB1GZ+Exz9KknkoPrEdXZDw==} + hasBin: true + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ot-json1@1.0.2: + resolution: {integrity: sha512-IhxkqVWQqlkWULoi/Q2AdzKk0N5vQRbUMUwubFXFCPcY4TsOZjmp2YKrk0/z1TeiECPadWEK060sdFdQ3Grokg==} + + ot-text-unicode@4.0.0: + resolution: {integrity: sha512-W7ZLU8QXesY2wagYFv47zErXud3E93FGImmSGJsQnBzE+idcPPyo2u2KMilIrTwBh4pbCizy71qRjmmV6aDhcQ==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-headers@2.0.6: + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + pbf@4.0.1: + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + hasBin: true + + pdfjs-dist@6.0.227: + resolution: {integrity: sha512-/P6M4SXw+70waMVLUM7rdRtvo+dEzqE1t6W/zQNvBETo2MaRa5rrvCcAYdfWGiUzadTgM0lJmRApUrW0d9zgKg==} + engines: {node: '>=22.13.0 || >=24'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkcs7@0.2.3: + resolution: {integrity: sha512-kJRwmADEQUg+qJyRgWLtpEL9q9cFjZschejTEK3GRjKvnsU9G5WWoe/wKqRgbBoqWdVSeTUKP6vIA3Y72M3rWA==} + engines: {node: ^0.10, npm: ^1.4.6} + hasBin: true + + pkcs7@1.0.4: + resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} + hasBin: true + + point-in-polygon-hao@1.2.4: + resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==} + + point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + + polyclip-ts@0.16.8: + resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + + posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + + posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + + preact@10.29.1: + resolution: {integrity: sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + printj@1.1.2: + resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} + engines: {node: '>=0.8'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + process@0.5.2: + resolution: {integrity: sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==} + engines: {node: '>= 0.6.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protobufjs@8.3.0: + resolution: {integrity: sha512-JpJpFaR7yKNb6WqKvJJ1MLbiuIQWQnbUUb06nDtf2/i8YWYYLEfP6xf9BwSJoJQg1wAy61EQB8dssQg64oX4aA==} + engines: {node: '>=12.0.0'} + + protocol-buffers-schema@3.6.1: + resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + + quickselect@1.1.1: + resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + + raf-schd@4.0.3: + resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rbush@2.0.2: + resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==} + + rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + + rbush@4.0.1: + resolution: {integrity: sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==} + + rc-dropdown@4.2.1: + resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + + rc-menu@9.16.1: + resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-motion@2.9.5: + resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-overflow@1.5.0: + resolution: {integrity: sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-resize-observer@1.4.3: + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-util@5.44.4: + resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + rc-virtual-list@3.19.2: + resolution: {integrity: sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + + react-beautiful-dnd@13.1.1: + resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==} + deprecated: 'react-beautiful-dnd is now deprecated. Context and options: https://github.com/atlassian/react-beautiful-dnd/issues/2672' + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-draggable@4.7.0: + resolution: {integrity: sha512-kTpANmKWVnFXiZ76Ag2ZowiFStuBYnJ606PI1TbUsOg29/400/JNIxI9+CuenhiAqFuXWJffz6F4UI3R51kUug==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + + react-grid-layout@1.5.3: + resolution: {integrity: sha512-KaG6IbjD6fYhagUtIvOzhftXG+ViKZjCjADe86X1KHl7C/dsBN2z0mi14nbvZKTkp0RKiil9RPcJBgq3LnoA8g==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-redux@7.2.9: + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-resizable@3.2.0: + resolution: {integrity: sha512-3NKQ0SLZV7rs3LQHeXlOzDSRQfFrkX6TVet77/Qk03zqiZyee37b7N8/gwDJAA8UUjRz7PdWCCy49hcso45SMQ==} + peerDependencies: + react: '>= 16.3' + react-dom: '>= 16.3' + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + reference-spec-reader@0.2.0: + resolution: {integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp-util@2.0.3: + resolution: {integrity: sha512-GP6h9OgJmhAZpb3dbNbXTfRWVnGcoMhWRZv/HxgM4/qCVqs1P9ukQdYxaUhjWBSAs9oJ/uPXUUvGT1VMe0Bs0Q==} + engines: {node: '>=16'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@2.0.4: + resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} + + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + + rollup-plugin-external-globals@0.6.1: + resolution: {integrity: sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==} + peerDependencies: + rollup: ^2.25.0 + + rollup@3.30.0: + resolution: {integrity: sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rust-result@1.0.0: + resolution: {integrity: sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-json-parse@4.0.0: + resolution: {integrity: sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + sass@1.99.0: + resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + screenfull@6.0.2: + resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==} + engines: {node: ^14.13.1 || >=16.0.0} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + skmeans@0.9.7: + resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slate-history@0.66.0: + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + + slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==} + + snabbdom@3.6.3: + resolution: {integrity: sha512-W2lHLLw2qR2Vv0DcMmcxXqcfdBaIcoN+y/86SmHv8fn4DazEQSH6KN3TjZcWvwujW56OHiiirsbHWZb4vx/0fg==} + engines: {node: '>=12.17.0'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + sortablejs@1.10.2: + resolution: {integrity: sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==} + + sortablejs@1.15.7: + resolution: {integrity: sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + splaytree-ts@1.0.2: + resolution: {integrity: sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + + ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + + svgo@2.8.2: + resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==} + engines: {node: '>=10.13.0'} + hasBin: true + + sweepline-intersections@1.5.0: + resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-binary-search@1.0.3: + resolution: {integrity: sha512-STSHX/L5nI9WTLv6wrzJbAPbO7OIISX83KFBh2GVbX1Uz/vgZOU/ANn/8iV6t35yMTpoPzzO+3OQid3mifE0CA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + + topojson-server@3.0.1: + resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==} + hasBin: true + + traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + trigram-utils@2.0.1: + resolution: {integrity: sha512-nfWIXHEaB+HdyslAfMxSqWKDdmqY9I32jS7GnqpdWQnLH89r6A5sdk3fDVYqGAZ0CrT8ovAFSAo6HRiWcWNIGQ==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsml@1.0.1: + resolution: {integrity: sha512-3KmepnH9SUsoOVtg013CRrL7c+AK7ECaquAsJdvu4288EDJuraqBlP4PDXT/rLEJ9YDn4jqLAzRJsnFPx+V6lg==} + deprecated: no longer maintained + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unicode-regex@4.2.0: + resolution: {integrity: sha512-fEYz7CCnvHDAdrb8OYAP7qlQCWzXBO5cHXQ3XI+HoZaBpiAwyC6b2nixMGl91yrDYEIRm7NDskgTvnLZ7mqrKQ==} + engines: {node: '>=16'} + + unicount@1.1.0: + resolution: {integrity: sha512-RlwWt1ywVW4WErPGAVHw/rIuJ2+MxvTME0siJ6lk9zBhpDfExDbspe6SRlWT3qU6AucNjotPl9qAJRVjP7guCQ==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + unzipit@2.0.0: + resolution: {integrity: sha512-DVeVIWUZCAQPNzm5sB0hpsG1GygTTdBnzNtYYEpInkttx5evkyqRgZi6rTczoySqp8hO5jHVKzrH0f23X8FZLg==} + engines: {node: '>=18'} + + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-toolkit@2.2.5: + resolution: {integrity: sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-memo-one@1.1.3: + resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + video.js@6.13.0: + resolution: {integrity: sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==} + + video.js@8.23.7: + resolution: {integrity: sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA==} + + videojs-contrib-hls@5.15.0: + resolution: {integrity: sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==} + engines: {node: '>= 0.10.12'} + + videojs-contrib-media-sources@4.7.2: + resolution: {integrity: sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==} + + videojs-contrib-quality-levels@4.1.0: + resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==} + engines: {node: '>=16', npm: '>=8'} + peerDependencies: + video.js: ^8 + + videojs-font@2.1.0: + resolution: {integrity: sha512-zFqWpLrXf1q8NtYx5qtZhMC6SLUFScDmR6j+UGPogobxR21lvXShhnzcNNMdOxJUuFLiToJ/BPpFUQwX4xhpvA==} + + videojs-font@4.2.0: + resolution: {integrity: sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==} + + videojs-ie8@1.1.2: + resolution: {integrity: sha512-0Zb2T4MLkpfZbeGMK/Z93b8Lrepr+rLFoHgQV1CoDeFqXvH7b+Vsd/VHoILGxQrgCSHFQ7mAODR6oyMjuiD4/g==} + + videojs-vtt.js@0.12.6: + resolution: {integrity: sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==} + + videojs-vtt.js@0.15.5: + resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} + + vite-plugin-cesium@1.2.22: + resolution: {integrity: sha512-OnS+VKNGck4kUu4/67Fdfhz0/zF9mDVNUp9hUWtX19C38O0mJsJy2MH1ev2QcrVLf6VieJ7vCGxkLchdB1n1HQ==} + peerDependencies: + cesium: ^1.95.0 + vite: '>=2.7.1' + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-ant-modal-enhance@1.2.2: + resolution: {integrity: sha512-gLozUM4K+pESYcV5ljsc9rAOvy94jL4fId4oNfuxu2pT/hx1HIGnQixi08yKV4FoBOwiFe4cd6dPVqCQLNAANQ==} + peerDependencies: + ant-design-vue: ^3.0.0 || ^4.0.0 + vue: ^3.2.0 + + vue-component-type-helpers@3.2.7: + resolution: {integrity: sha512-+gPp5YGmhfsj1IN+xUo7y0fb4clfnOiiUA39y07yW1VzCRjzVgwLbtmdWlghh7mXrPsEaYc7rrIir/HT6C8vYQ==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@8.3.0: + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@9.14.5: + resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==} + engines: {node: '>= 16'} + deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@3.2.7: + resolution: {integrity: sha512-zc1tL3HoQni1zGTGrwBVRQb7rGP5SWdu/m4rGB6JcnAC5MT5LFZIxF7Y+EJEnt4hGF23d60rXH7gRjHGb5KQQQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue-types@3.0.2: + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.33: + resolution: {integrity: sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuedraggable@2.24.3: + resolution: {integrity: sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + + webwackify@0.1.6: + resolution: {integrity: sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + + wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wujie-vue3@1.0.29: + resolution: {integrity: sha512-OGt5Veyq/DtmFzHQCANmv8nZgu877u7ZjS5qjFpSrtKARKhLjID3x99D40a4pb3Kj5UmRatkV5Gn5hqOWpziZQ==} + peerDependencies: + vue: ^3.0.0 + + wujie@1.0.29: + resolution: {integrity: sha512-u7PmBT4l5ov7ciwmZNG8DLIRKrYrnXDa0LnAFgRQikJ/ZrVZYzzSNz6duzEJoj8/o46dnMy/g9Hh/PBYGbgFUw==} + + xhr@2.4.0: + resolution: {integrity: sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw==} + + xlsx-js-style@1.2.0: + resolution: {integrity: sha512-DDT4FXFSWfT4DXMSok/m3TvmP1gvO3dn0Eu/c+eXHW5Kzmp7IczNkxg/iEPnImbG9X0Vb8QhROda5eatSR/97Q==} + engines: {node: '>=0.8'} + hasBin: true + + xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + + xml-utils@1.10.2: + resolution: {integrity: sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zarrita@0.7.1: + resolution: {integrity: sha512-Nu4liRKJES1kkIjWALXSryglJf2+WJURUxgndklfX+mTBCd0lk4MV797p00lt4NzmU3Bbdbs10uxeN8LWwPyWA==} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + + zstddec@0.2.0: + resolution: {integrity: sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ant-design/colors@6.0.0': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons-vue@7.0.1(vue@3.5.33(typescript@6.0.3))': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.33(typescript@6.0.3) + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@better-scroll/core@2.5.1': + dependencies: + '@better-scroll/shared-utils': 2.5.1 + + '@better-scroll/indicators@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/infinity@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/mouse-wheel@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/movable@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/nested-scroll@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/observe-dom@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/observe-image@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/pull-down@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/pull-up@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/scroll-bar@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/shared-utils@2.5.1': {} + + '@better-scroll/slide@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/wheel@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@better-scroll/zoom@2.5.1': + dependencies: + '@better-scroll/core': 2.5.1 + + '@cesium/engine@25.0.0': + dependencies: + '@cesium/wasm-splats': 0.1.0-alpha.2 + '@spz-loader/core': 0.3.1 + '@tweenjs/tween.js': 25.0.0 + '@zip.js/zip.js': 2.8.26 + autolinker: 4.1.5 + bitmap-sdf: 1.0.4 + dompurify: 3.4.3 + draco3d: 1.5.7 + earcut: 3.0.2 + grapheme-splitter: 1.0.4 + jsep: 1.4.0 + kdbush: 4.0.2 + ktx-parse: 1.1.0 + lerc: 2.0.0 + mersenne-twister: 1.1.0 + meshoptimizer: 1.1.1 + pako: 2.1.0 + protobufjs: 8.3.0 + rbush: 4.0.1 + topojson-client: 3.1.0 + urijs: 1.19.11 + + '@cesium/wasm-splats@0.1.0-alpha.2': {} + + '@cesium/widgets@15.0.0': + dependencies: + '@cesium/engine': 25.0.0 + nosleep.js: 0.12.0 + + '@commitlint/cli@16.3.0': + dependencies: + '@commitlint/format': 16.2.1 + '@commitlint/lint': 16.2.4 + '@commitlint/load': 16.3.0 + '@commitlint/read': 16.2.1 + '@commitlint/types': 16.2.1 + lodash: 4.18.1 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/config-conventional@16.2.4': + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + + '@commitlint/config-validator@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + ajv: 6.14.0 + + '@commitlint/ensure@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + lodash: 4.18.1 + + '@commitlint/execute-rule@16.2.1': {} + + '@commitlint/format@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + + '@commitlint/is-ignored@16.2.4': + dependencies: + '@commitlint/types': 16.2.1 + semver: 7.3.7 + + '@commitlint/lint@16.2.4': + dependencies: + '@commitlint/is-ignored': 16.2.4 + '@commitlint/parse': 16.2.1 + '@commitlint/rules': 16.2.4 + '@commitlint/types': 16.2.1 + + '@commitlint/load@16.3.0': + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/execute-rule': 16.2.1 + '@commitlint/resolve-extends': 16.2.1 + '@commitlint/types': 16.2.1 + '@types/node': 16.18.126 + chalk: 4.1.2 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 2.0.2(@types/node@16.18.126)(cosmiconfig@7.1.0)(typescript@4.9.5) + lodash: 4.18.1 + resolve-from: 5.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/message@16.2.1': {} + + '@commitlint/parse@16.2.1': + dependencies: + '@commitlint/types': 16.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + + '@commitlint/read@16.2.1': + dependencies: + '@commitlint/top-level': 16.2.1 + '@commitlint/types': 16.2.1 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + + '@commitlint/resolve-extends@16.2.1': + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/types': 16.2.1 + import-fresh: 3.3.1 + lodash: 4.18.1 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/rules@16.2.4': + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/message': 16.2.1 + '@commitlint/to-lines': 16.2.1 + '@commitlint/types': 16.2.1 + execa: 5.1.1 + + '@commitlint/to-lines@16.2.1': {} + + '@commitlint/top-level@16.2.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@16.2.1': + dependencies: + chalk: 4.1.2 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ctrl/tinycolor@3.6.1': {} + + '@ctrl/tinycolor@4.2.0': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.33(typescript@6.0.3))': + dependencies: + vue: 3.5.33(typescript@6.0.3) + + '@emotion/hash@0.9.2': {} + + '@emotion/unitless@0.8.1': {} + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@fast-csv/format@4.3.5': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + + '@fast-csv/parse@4.3.6': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + + '@flatten-js/interval-tree@1.1.3': {} + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.11': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@intlify/core-base@9.14.5': + dependencies: + '@intlify/message-compiler': 9.14.5 + '@intlify/shared': 9.14.5 + + '@intlify/message-compiler@9.14.5': + dependencies: + '@intlify/shared': 9.14.5 + source-map-js: 1.2.1 + + '@intlify/shared@9.14.5': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/canvas-android-arm64@1.0.0': + optional: true + + '@napi-rs/canvas-darwin-arm64@1.0.0': + optional: true + + '@napi-rs/canvas-darwin-x64@1.0.0': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.0': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@1.0.0': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@1.0.0': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@1.0.0': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@1.0.0': + optional: true + + '@napi-rs/canvas-linux-x64-musl@1.0.0': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@1.0.0': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@1.0.0': + optional: true + + '@napi-rs/canvas@1.0.0': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 1.0.0 + '@napi-rs/canvas-darwin-arm64': 1.0.0 + '@napi-rs/canvas-darwin-x64': 1.0.0 + '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.0 + '@napi-rs/canvas-linux-arm64-gnu': 1.0.0 + '@napi-rs/canvas-linux-arm64-musl': 1.0.0 + '@napi-rs/canvas-linux-riscv64-gnu': 1.0.0 + '@napi-rs/canvas-linux-x64-gnu': 1.0.0 + '@napi-rs/canvas-linux-x64-musl': 1.0.0 + '@napi-rs/canvas-win32-arm64-msvc': 1.0.0 + '@napi-rs/canvas-win32-x64-msvc': 1.0.0 + optional: true + + '@noble/ed25519@2.3.0': {} + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@petamoriken/float16@3.9.3': {} + + '@radix-ui/primitive@1.1.4': {} + + '@radix-ui/react-arrow@1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-collection@1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-context@1.1.4(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dialog@1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-portal': 1.1.12(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-direction@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dismissable-layer@1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dropdown-menu@2.1.18(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-menu': 2.1.18(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-focus-scope@1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-hover-card@1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.12(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-menu@2.1.18(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-popper': 1.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.12(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-popover@1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-popper': 1.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.12(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-popper@1.3.1(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/rect': 1.1.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-portal@1.1.12(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-presence@1.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-primitive@2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-roving-focus@1.1.13(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-separator@1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-rect@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-size@1.1.2(@types/react@19.2.17)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/rect@1.1.2': {} + + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rc-component/trigger@2.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.2 + + '@simonwep/pickr@1.8.2': + dependencies: + core-js: 3.49.0 + nanopop: 2.4.2 + + '@spz-loader/core@0.3.1': {} + + '@sxzz/popperjs-es@2.11.8': {} + + '@terraformer/arcgis@2.1.2': + dependencies: + '@terraformer/common': 2.1.2 + + '@terraformer/common@2.1.2': {} + + '@transloadit/prettier-bytes@0.0.7': {} + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@turf/along@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/angle@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/area@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox-clip@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox-polygon@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bbox@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bearing@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/bezier-spline@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-clockwise@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-concave@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-contains@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-split': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-crosses@7.3.5': + dependencies: + '@turf/boolean-equal': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-disjoint@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-equal@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-equality-ts: 1.0.2 + tslib: 2.8.1 + + '@turf/boolean-intersects@7.3.5': + dependencies: + '@turf/boolean-disjoint': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-overlap@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-overlap': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-equality-ts: 1.0.2 + tslib: 2.8.1 + + '@turf/boolean-parallel@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-point-in-polygon@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + point-in-polygon-hao: 1.2.4 + tslib: 2.8.1 + + '@turf/boolean-point-on-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-touches@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/boolean-valid@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-crosses': 7.3.5 + '@turf/boolean-disjoint': 7.3.5 + '@turf/boolean-overlap': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@types/geojson': 7946.0.16 + geojson-polygon-self-intersections: 1.2.2 + tslib: 2.8.1 + + '@turf/boolean-within@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-split': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/buffer@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/center': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/jsts': 2.7.2 + '@turf/meta': 7.3.5 + '@turf/projection': 7.3.5 + '@types/geojson': 7946.0.16 + d3-geo: 1.7.1 + + '@turf/center-mean@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center-median@7.3.5': + dependencies: + '@turf/center-mean': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center-of-mass@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/convex': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/center@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/centroid@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/circle@7.3.5': + dependencies: + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clean-coords@7.3.5': + dependencies: + '@turf/boolean-point-on-line': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clone@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/clusters-dbscan@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/clusters-kmeans@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + skmeans: 0.9.7 + tslib: 2.8.1 + + '@turf/clusters@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/collect@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/combine@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/concave@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/tin': 7.3.5 + '@types/geojson': 7946.0.16 + topojson-client: 3.1.0 + topojson-server: 3.0.1 + tslib: 2.8.1 + + '@turf/convex@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + concaveman: 1.2.1 + tslib: 2.8.1 + + '@turf/destination@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/difference@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/directional-mean@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/length': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/dissolve@7.3.5': + dependencies: + '@turf/flatten': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/distance-weight@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/distance@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/ellipse@7.3.5': + dependencies: + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/transform-rotate': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/envelope@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/explode@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/flatten@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/flip@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/geojson-rbush@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/great-circle@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + arc: 0.2.0 + tslib: 2.8.1 + + '@turf/helpers@7.3.5': + dependencies: + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/hex-grid@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/intersect': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/interpolate@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/hex-grid': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/square-grid': 7.3.5 + '@turf/triangle-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/intersect@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/invariant@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/isobands@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/isolines@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/jsts@2.7.2': + dependencies: + jsts: 2.7.1 + + '@turf/kinks@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/length@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-arc@7.3.5': + dependencies: + '@turf/circle': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-chunk@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/length': 7.3.5 + '@turf/line-slice-along': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-intersect@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + sweepline-intersections: 1.5.0 + tslib: 2.8.1 + + '@turf/line-offset@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-overlap@7.3.5': + dependencies: + '@turf/boolean-point-on-line': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@types/geojson': 7946.0.16 + fast-deep-equal: 3.1.3 + tslib: 2.8.1 + + '@turf/line-segment@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-slice-along@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-slice@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-split@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/truncate': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/line-to-polygon@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/mask@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/meta@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/midpoint@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/moran-index@7.3.5': + dependencies: + '@turf/distance-weight': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-neighbor-analysis@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point-on-line@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point-to-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/nearest-point@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/planepoint@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-grid@7.3.5': + dependencies: + '@turf/boolean-within': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-on-feature@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/center': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-to-line-distance@7.3.5': + dependencies: + '@turf/bearing': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/projection': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/point-to-polygon-distance@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/points-within-polygon@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-smooth@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-tangents@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/boolean-within': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygon-to-line@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/polygonize@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/envelope': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/projection@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/quadrat-analysis@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/random': 7.3.5 + '@turf/square-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/random@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rectangle-grid@7.3.5': + dependencies: + '@turf/boolean-intersects': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rewind@7.3.5': + dependencies: + '@turf/boolean-clockwise': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-bearing@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-destination@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/rhumb-distance@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/sample@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/sector@7.3.5': + dependencies: + '@turf/circle': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/line-arc': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/shortest-path@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/clean-coords': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/transform-scale': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/simplify@7.3.5': + dependencies: + '@turf/clean-coords': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/square-grid@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/rectangle-grid': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/square@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/standard-deviational-ellipse@7.3.5': + dependencies: + '@turf/center-mean': 7.3.5 + '@turf/ellipse': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/points-within-polygon': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/tag@7.3.5': + dependencies: + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/tesselate@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + earcut: 2.2.4 + tslib: 2.8.1 + + '@turf/tin@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-rotate@7.3.5': + dependencies: + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-scale@7.3.5': + dependencies: + '@turf/bbox': 7.3.5 + '@turf/center': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/transform-translate@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/triangle-grid@7.3.5': + dependencies: + '@turf/distance': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/intersect': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/truncate@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/turf@7.3.5': + dependencies: + '@turf/along': 7.3.5 + '@turf/angle': 7.3.5 + '@turf/area': 7.3.5 + '@turf/bbox': 7.3.5 + '@turf/bbox-clip': 7.3.5 + '@turf/bbox-polygon': 7.3.5 + '@turf/bearing': 7.3.5 + '@turf/bezier-spline': 7.3.5 + '@turf/boolean-clockwise': 7.3.5 + '@turf/boolean-concave': 7.3.5 + '@turf/boolean-contains': 7.3.5 + '@turf/boolean-crosses': 7.3.5 + '@turf/boolean-disjoint': 7.3.5 + '@turf/boolean-equal': 7.3.5 + '@turf/boolean-intersects': 7.3.5 + '@turf/boolean-overlap': 7.3.5 + '@turf/boolean-parallel': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/boolean-point-on-line': 7.3.5 + '@turf/boolean-touches': 7.3.5 + '@turf/boolean-valid': 7.3.5 + '@turf/boolean-within': 7.3.5 + '@turf/buffer': 7.3.5 + '@turf/center': 7.3.5 + '@turf/center-mean': 7.3.5 + '@turf/center-median': 7.3.5 + '@turf/center-of-mass': 7.3.5 + '@turf/centroid': 7.3.5 + '@turf/circle': 7.3.5 + '@turf/clean-coords': 7.3.5 + '@turf/clone': 7.3.5 + '@turf/clusters': 7.3.5 + '@turf/clusters-dbscan': 7.3.5 + '@turf/clusters-kmeans': 7.3.5 + '@turf/collect': 7.3.5 + '@turf/combine': 7.3.5 + '@turf/concave': 7.3.5 + '@turf/convex': 7.3.5 + '@turf/destination': 7.3.5 + '@turf/difference': 7.3.5 + '@turf/directional-mean': 7.3.5 + '@turf/dissolve': 7.3.5 + '@turf/distance': 7.3.5 + '@turf/distance-weight': 7.3.5 + '@turf/ellipse': 7.3.5 + '@turf/envelope': 7.3.5 + '@turf/explode': 7.3.5 + '@turf/flatten': 7.3.5 + '@turf/flip': 7.3.5 + '@turf/geojson-rbush': 7.3.5 + '@turf/great-circle': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/hex-grid': 7.3.5 + '@turf/interpolate': 7.3.5 + '@turf/intersect': 7.3.5 + '@turf/invariant': 7.3.5 + '@turf/isobands': 7.3.5 + '@turf/isolines': 7.3.5 + '@turf/kinks': 7.3.5 + '@turf/length': 7.3.5 + '@turf/line-arc': 7.3.5 + '@turf/line-chunk': 7.3.5 + '@turf/line-intersect': 7.3.5 + '@turf/line-offset': 7.3.5 + '@turf/line-overlap': 7.3.5 + '@turf/line-segment': 7.3.5 + '@turf/line-slice': 7.3.5 + '@turf/line-slice-along': 7.3.5 + '@turf/line-split': 7.3.5 + '@turf/line-to-polygon': 7.3.5 + '@turf/mask': 7.3.5 + '@turf/meta': 7.3.5 + '@turf/midpoint': 7.3.5 + '@turf/moran-index': 7.3.5 + '@turf/nearest-neighbor-analysis': 7.3.5 + '@turf/nearest-point': 7.3.5 + '@turf/nearest-point-on-line': 7.3.5 + '@turf/nearest-point-to-line': 7.3.5 + '@turf/planepoint': 7.3.5 + '@turf/point-grid': 7.3.5 + '@turf/point-on-feature': 7.3.5 + '@turf/point-to-line-distance': 7.3.5 + '@turf/point-to-polygon-distance': 7.3.5 + '@turf/points-within-polygon': 7.3.5 + '@turf/polygon-smooth': 7.3.5 + '@turf/polygon-tangents': 7.3.5 + '@turf/polygon-to-line': 7.3.5 + '@turf/polygonize': 7.3.5 + '@turf/projection': 7.3.5 + '@turf/quadrat-analysis': 7.3.5 + '@turf/random': 7.3.5 + '@turf/rectangle-grid': 7.3.5 + '@turf/rewind': 7.3.5 + '@turf/rhumb-bearing': 7.3.5 + '@turf/rhumb-destination': 7.3.5 + '@turf/rhumb-distance': 7.3.5 + '@turf/sample': 7.3.5 + '@turf/sector': 7.3.5 + '@turf/shortest-path': 7.3.5 + '@turf/simplify': 7.3.5 + '@turf/square': 7.3.5 + '@turf/square-grid': 7.3.5 + '@turf/standard-deviational-ellipse': 7.3.5 + '@turf/tag': 7.3.5 + '@turf/tesselate': 7.3.5 + '@turf/tin': 7.3.5 + '@turf/transform-rotate': 7.3.5 + '@turf/transform-scale': 7.3.5 + '@turf/transform-translate': 7.3.5 + '@turf/triangle-grid': 7.3.5 + '@turf/truncate': 7.3.5 + '@turf/union': 7.3.5 + '@turf/unkink-polygon': 7.3.5 + '@turf/voronoi': 7.3.5 + '@types/geojson': 7946.0.16 + '@types/kdbush': 3.0.5 + tslib: 2.8.1 + + '@turf/union@7.3.5': + dependencies: + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + polyclip-ts: 0.16.8 + tslib: 2.8.1 + + '@turf/unkink-polygon@7.3.5': + dependencies: + '@turf/area': 7.3.5 + '@turf/boolean-point-in-polygon': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/meta': 7.3.5 + '@types/geojson': 7946.0.16 + rbush: 3.0.1 + tslib: 2.8.1 + + '@turf/voronoi@7.3.5': + dependencies: + '@turf/clone': 7.3.5 + '@turf/helpers': 7.3.5 + '@turf/invariant': 7.3.5 + '@types/d3-voronoi': 1.1.12 + '@types/geojson': 7946.0.16 + d3-voronoi: 1.1.2 + tslib: 2.8.1 + + '@tweenjs/tween.js@25.0.0': {} + + '@types/d3-voronoi@1.1.12': {} + + '@types/dom-to-image@2.6.7': {} + + '@types/estree@1.0.9': {} + + '@types/event-emitter@0.3.5': {} + + '@types/geojson@7946.0.16': {} + + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.17)': + dependencies: + '@types/react': 19.2.17 + hoist-non-react-statics: 3.3.2 + + '@types/js-cookie@3.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/kdbush@3.0.5': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.24 + + '@types/lodash@4.17.24': {} + + '@types/minimist@1.2.5': {} + + '@types/node@14.18.63': {} + + '@types/node@16.18.126': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/nprogress@0.2.3': {} + + '@types/parse-json@4.0.2': {} + + '@types/path-browserify@1.0.3': {} + + '@types/rbush@4.0.0': {} + + '@types/react-redux@7.1.34': + dependencies: + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.17) + '@types/react': 19.2.17 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 + + '@types/semver@7.7.1': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 16.18.126 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@6.0.3))(eslint@8.57.1)(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@6.0.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@6.0.3) + debug: 4.4.3 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.4 + tsutils: 3.21.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.3) + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@6.0.3) + debug: 4.4.3 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.4 + tsutils: 3.21.0(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@univerjs-pro/collaboration-client-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + crypto-js: 4.2.0 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/collaboration-client@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/telemetry': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + crypto-js: 4.2.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/collaboration@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + uuid: 13.0.2 + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs-pro/collaboration@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.48 + '@univerjs/sheets': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + uuid: 13.0.2 + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs-pro/docs-exchange-client@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react + - react-dom + - rxjs + + '@univerjs-pro/docs-print@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/print': 0.14.0 + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + optionalDependencies: + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + - rxjs + + '@univerjs-pro/edit-history-loader@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/edit-history-viewer': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-chart-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/edit-history-viewer@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/engine-chart@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/engine-formula@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/engine-pivot@0.14.0': {} + + '@univerjs-pro/exchange-client@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + pako: 2.1.0 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/exchange-client@0.15.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/license': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.15.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.48 + '@univerjs/ui': 0.15.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + pako: 2.1.0 + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/license@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@noble/ed25519': 2.3.0 + '@noble/hashes': 1.8.0 + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/license@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@noble/ed25519': 2.3.0 + '@noble/hashes': 1.8.0 + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/print@0.14.0': {} + + '@univerjs-pro/sheets-chart-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + echarts: 5.6.0 + echarts-wordcloud: 2.1.0(echarts@5.6.0) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/sheets-chart@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/sheets-exchange-client@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react + - react-dom + - rxjs + + '@univerjs-pro/sheets-pivot-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-pivot': 0.14.0 + '@univerjs-pro/sheets-pivot': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-beautiful-dnd: 13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-native + + '@univerjs-pro/sheets-pivot@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-pivot': 0.14.0 + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/sheets-print@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/print': 0.14.0 + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + optionalDependencies: + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/sheets-sparkline-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/sheets-sparkline': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-graphics': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs-pro/sheets-sparkline@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs-pro/thread-comment-datasource@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react + - react-dom + + '@univerjs/core@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/protocol': 0.1.47 + '@univerjs/themes': 0.14.0 + '@wendellhu/redi': 1.0.1(react@18.3.1) + async-lock: 1.4.1 + dayjs: 1.11.20 + fast-diff: 1.3.0 + kdbush: 4.0.2 + lodash-es: 4.18.1 + nanoid: 5.1.6 + numfmt: 3.2.6 + ot-json1: 1.0.2 + rbush: 4.0.1 + rxjs: 7.8.2 + + '@univerjs/core@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/protocol': 0.1.48 + '@univerjs/themes': 0.15.0 + '@wendellhu/redi': 1.0.1(react@18.3.1) + async-lock: 1.4.1 + dayjs: 1.11.20 + fast-diff: 1.3.0 + kdbush: 4.0.2 + lodash-es: 4.18.1 + nanoid: 5.1.6 + numfmt: 3.2.6 + ot-json1: 1.0.2 + rbush: 4.0.1 + rxjs: 7.8.2 + + '@univerjs/data-validation@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/data-validation@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/design@0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-dialog': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.18(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/themes': 0.14.0 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + dayjs: 1.11.20 + rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-grid-layout: 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sonner: 2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: 2.6.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs/design@0.15.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-dialog': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.18(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.1.17(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': 1.1.10(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@18.3.1) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/themes': 0.15.0 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + dayjs: 1.11.20 + rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-grid-layout: 1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sonner: 2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: 2.6.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs/docs-drawing-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/docs-drawing@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/docs-hyper-link-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/docs-hyper-link@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/docs-thread-comment-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/docs-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/docs@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/docs@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/drawing-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/drawing@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + ot-json1: 1.0.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/drawing@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + ot-json1: 1.0.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/engine-formula@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@flatten-js/interval-tree': 1.1.3 + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + decimal.js: 10.6.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/engine-formula@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@flatten-js/interval-tree': 1.1.3 + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + decimal.js: 10.6.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/engine-render@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + cjk-regex: 3.4.0 + franc-min: 6.2.0 + opentype.js: 1.3.5 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/engine-render@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + cjk-regex: 3.4.0 + franc-min: 6.2.0 + opentype.js: 1.3.5 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/find-replace@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@univerjs/network@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/network@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/preset-docs-advanced@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/docs-print': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-docs-collaboration@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-docs-core@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-docs-drawing@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/docs-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-docs-hyper-link@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/docs-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-hyper-link-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-docs-node-core@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc-node': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/preset-docs-thread-comment@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/docs-thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-advanced@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/license': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-chart-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-exchange-client': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-print': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-graphics': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-native + + '@univerjs/preset-sheets-collaboration@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs-pro/collaboration-client-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/edit-history-loader': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/edit-history-viewer': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs-pro/thread-comment-datasource': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-advanced': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-native + + '@univerjs/preset-sheets-conditional-formatting@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-conditional-formatting': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-core@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/network': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-numfmt-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-data-validation@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-drawing@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/docs-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-filter@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-find-replace@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/find-replace': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-find-replace': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-hyper-link@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-node-core@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc-node': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-sort': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/preset-sheets-note@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-note': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-note-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-sort@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-sort': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-sort-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-table@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-table': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-table-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/preset-sheets-thread-comment@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/sheets-thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + + '@univerjs/presets@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/preset-docs-advanced': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-docs-collaboration': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-docs-core': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-docs-drawing': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-docs-hyper-link': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-docs-node-core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/preset-docs-thread-comment': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-advanced': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-collaboration': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-conditional-formatting': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-core': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-data-validation': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-drawing': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-filter': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-find-replace': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-hyper-link': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-node-core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/preset-sheets-note': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-sort': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-table': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/preset-sheets-thread-comment': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-native + + '@univerjs/protocol@0.1.47': {} + + '@univerjs/protocol@0.1.48': {} + + '@univerjs/rpc-node@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/rpc@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/rpc@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-conditional-formatting-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-conditional-formatting@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-conditional-formatting@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-data-validation-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-data-validation@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-drawing-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-drawing@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/sheets-drawing@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/drawing': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/sheets-filter-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-filter': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-filter@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-filter@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-find-replace@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/find-replace': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react + - react-dom + + '@univerjs/sheets-formula-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-formula@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-graphics@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react + - react-dom + - rxjs + + '@univerjs/sheets-hyper-link-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-hyper-link@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-hyper-link@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-note-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-note': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-note@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-numfmt-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-numfmt@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-sort-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-sort': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-sort@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/sheets-table-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/sheets-sort': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-table': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-table@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-thread-comment-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets-thread-comment@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/protocol': 0.1.47 + '@univerjs/sheets': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/telemetry': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/sheets@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.47 + '@univerjs/rpc': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/sheets@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/engine-formula': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/protocol': 0.1.48 + '@univerjs/rpc': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/telemetry@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + transitivePeerDependencies: + - '@wendellhu/redi' + - rxjs + + '@univerjs/themes@0.14.0': {} + + '@univerjs/themes@0.15.0': {} + + '@univerjs/thread-comment-ui@0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/docs-ui': 0.14.0(@types/react@19.2.17)(@wendellhu/redi@1.0.1(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/thread-comment': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/ui': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2) + react: 18.3.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@wendellhu/redi' + - react-dom + + '@univerjs/thread-comment@0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/thread-comment@0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@wendellhu/redi' + + '@univerjs/ui@0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.14.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-render': 0.14.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@wendellhu/redi': 1.0.1(react@18.3.1) + localforage: 1.10.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs/ui@0.15.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/design': 0.15.0(@types/react@19.2.17)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@univerjs/engine-render': 0.15.0(@wendellhu/redi@1.0.1(react@18.3.1))(rxjs@7.8.2) + '@univerjs/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@wendellhu/redi': 1.0.1(react@18.3.1) + localforage: 1.10.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@uppy/companion-client@2.2.2': + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + '@uppy/core@2.3.4': + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.11 + preact: 10.29.1 + + '@uppy/store-default@2.1.1': {} + + '@uppy/utils@4.1.3': + dependencies: + lodash.throttle: 4.1.1 + + '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)': + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.11 + + '@videojs/http-streaming@3.17.4(video.js@8.23.7)': + dependencies: + '@babel/runtime': 7.29.2 + '@videojs/vhs-utils': 4.1.1 + aes-decrypter: 4.0.2 + global: 4.4.0 + m3u8-parser: 7.2.0 + mpd-parser: 1.3.1 + mux.js: 7.1.0 + video.js: 8.23.7 + + '@videojs/vhs-utils@4.1.1': + dependencies: + '@babel/runtime': 7.29.2 + global: 4.4.0 + + '@videojs/xhr@2.7.0': + dependencies: + '@babel/runtime': 7.29.2 + global: 4.4.0 + is-function: 1.0.2 + + '@vitejs/plugin-vue@4.6.2(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0))(vue@3.5.33(typescript@6.0.3))': + dependencies: + vite: 4.5.14(@types/node@16.18.126)(sass@1.99.0) + vue: 3.5.33(typescript@6.0.3) + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.33': + dependencies: + '@babel/parser': 7.29.2 + '@vue/shared': 3.5.33 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.33': + dependencies: + '@vue/compiler-core': 3.5.33 + '@vue/shared': 3.5.33 + + '@vue/compiler-sfc@3.5.33': + dependencies: + '@babel/parser': 7.29.2 + '@vue/compiler-core': 3.5.33 + '@vue/compiler-dom': 3.5.33 + '@vue/compiler-ssr': 3.5.33 + '@vue/shared': 3.5.33 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.10 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.33': + dependencies: + '@vue/compiler-dom': 3.5.33 + '@vue/shared': 3.5.33 + + '@vue/devtools-api@6.6.4': {} + + '@vue/language-core@3.2.7': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.33 + '@vue/shared': 3.5.33 + alien-signals: 3.1.2 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.4 + + '@vue/reactivity@3.5.33': + dependencies: + '@vue/shared': 3.5.33 + + '@vue/runtime-core@3.5.33': + dependencies: + '@vue/reactivity': 3.5.33 + '@vue/shared': 3.5.33 + + '@vue/runtime-dom@3.5.33': + dependencies: + '@vue/reactivity': 3.5.33 + '@vue/runtime-core': 3.5.33 + '@vue/shared': 3.5.33 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3))': + dependencies: + '@vue/compiler-ssr': 3.5.33 + '@vue/shared': 3.5.33 + vue: 3.5.33(typescript@6.0.3) + + '@vue/shared@3.5.33': {} + + '@vueuse/core@12.0.0(typescript@6.0.3)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 12.0.0 + '@vueuse/shared': 12.0.0(typescript@6.0.3) + vue: 3.5.33(typescript@6.0.3) + transitivePeerDependencies: + - typescript + + '@vueuse/core@9.13.0(vue@3.5.33(typescript@6.0.3))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.33(typescript@6.0.3)) + vue-demi: 0.14.10(vue@3.5.33(typescript@6.0.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@12.0.0': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@12.0.0(typescript@6.0.3)': + dependencies: + vue: 3.5.33(typescript@6.0.3) + transitivePeerDependencies: + - typescript + + '@vueuse/shared@9.13.0(vue@3.5.33(typescript@6.0.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.33(typescript@6.0.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + prismjs: 1.30.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@types/event-emitter': 0.3.5 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.11 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.6.3 + + '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.33(typescript@6.0.3))': + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.5.33(typescript@6.0.3) + + '@wangeditor/editor@5.1.23': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)': + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3) + dom7: 3.0.0 + nanoid: 3.3.11 + slate: 0.72.8 + snabbdom: 3.6.3 + + '@wendellhu/redi@1.0.1(react@18.3.1)': + optionalDependencies: + react: 18.3.1 + + '@xmldom/xmldom@0.8.13': {} + + '@zarrita/storage@0.2.0': + dependencies: + reference-spec-reader: 0.2.0 + unzipit: 2.0.0 + + '@zip.js/zip.js@2.8.26': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + adler-32@1.2.0: + dependencies: + exit-on-epipe: 1.0.1 + printj: 1.1.2 + + adler-32@1.3.1: {} + + aes-decrypter@1.0.3: + dependencies: + pkcs7: 0.2.3 + + aes-decrypter@4.0.2: + dependencies: + '@babel/runtime': 7.29.2 + '@videojs/vhs-utils': 4.1.1 + global: 4.4.0 + pkcs7: 1.0.4 + + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + alien-signals@3.1.2: {} + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ant-design-vue@4.2.6(vue@3.5.33(typescript@6.0.3)): + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 7.0.1(vue@3.5.33(typescript@6.0.3)) + '@babel/runtime': 7.29.2 + '@ctrl/tinycolor': 3.6.1 + '@emotion/hash': 0.9.2 + '@emotion/unitless': 0.8.1 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + csstype: 3.2.3 + dayjs: 1.11.20 + dom-align: 1.12.4 + dom-scroll-into-view: 2.0.1 + lodash: 4.18.1 + lodash-es: 4.18.1 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + stylis: 4.4.0 + throttle-debounce: 5.0.2 + vue: 3.5.33(typescript@6.0.3) + vue-types: 3.0.2(vue@3.5.33(typescript@6.0.3)) + warning: 4.0.3 + + antdv-draggable-modal@1.1.6(ant-design-vue@4.2.6(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)): + dependencies: + ant-design-vue: 4.2.6(vue@3.5.33(typescript@6.0.3)) + vue: 3.5.33(typescript@6.0.3) + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arc@0.2.0: {} + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + arg@4.1.3: {} + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-ify@1.0.0: {} + + array-tree-filter@2.1.0: {} + + array-union@2.1.0: {} + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + assign-symbols@1.0.0: {} + + async-function@1.0.0: {} + + async-lock@1.4.1: {} + + async-validator@4.2.5: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atob@2.1.2: {} + + autolinker@4.1.5: + dependencies: + tslib: 2.8.1 + + autoprefixer@10.5.0(postcss@8.5.10): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001790 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.15.2: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + babel-runtime@6.26.0: + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + baseline-browser-mapping@2.10.20: {} + + better-scroll@2.5.1: + dependencies: + '@better-scroll/core': 2.5.1 + '@better-scroll/indicators': 2.5.1 + '@better-scroll/infinity': 2.5.1 + '@better-scroll/mouse-wheel': 2.5.1 + '@better-scroll/movable': 2.5.1 + '@better-scroll/nested-scroll': 2.5.1 + '@better-scroll/observe-dom': 2.5.1 + '@better-scroll/observe-image': 2.5.1 + '@better-scroll/pull-down': 2.5.1 + '@better-scroll/pull-up': 2.5.1 + '@better-scroll/scroll-bar': 2.5.1 + '@better-scroll/slide': 2.5.1 + '@better-scroll/wheel': 2.5.1 + '@better-scroll/zoom': 2.5.1 + + big-integer@1.6.52: {} + + big.js@5.2.2: {} + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + binary@0.3.0: + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + + bitmap-sdf@1.0.4: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.4.7: {} + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.14: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.20 + caniuse-lite: 1.0.30001790 + electron-to-chromium: 1.5.343 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer-crc32@0.2.13: {} + + buffer-indexof-polyfill@1.0.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffers@0.1.1: {} + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001790: {} + + cesium@1.141.0: + dependencies: + '@cesium/engine': 25.0.0 + '@cesium/widgets': 15.0.0 + + cfb@1.2.2: + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + + chainsaw@0.1.0: + dependencies: + traverse: 0.3.9 + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cjk-regex@3.4.0: + dependencies: + regexp-util: 2.0.3 + unicode-regex: 4.2.0 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + classnames@2.5.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + codepage@1.14.0: + dependencies: + commander: 2.14.1 + exit-on-epipe: 1.0.1 + + codepage@1.15.0: {} + + collapse-white-space@2.1.0: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.14.1: {} + + commander@2.17.1: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + component-emitter@1.3.1: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + compute-scroll-into-view@1.0.20: {} + + concat-map@0.0.1: {} + + concaveman@1.2.1: + dependencies: + point-in-polygon: 1.1.0 + rbush: 3.0.1 + robust-predicates: 2.0.4 + tinyqueue: 2.0.3 + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.18.1 + q: 1.5.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.18.1 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + copy-descriptor@0.1.1: {} + + core-js@2.6.12: {} + + core-js@3.49.0: {} + + core-util-is@1.0.3: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig-typescript-loader@2.0.2(@types/node@16.18.126)(cosmiconfig@7.1.0)(typescript@4.9.5): + dependencies: + '@types/node': 16.18.126 + cosmiconfig: 7.1.0 + ts-node: 10.9.2(@types/node@16.18.126)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-box-model@1.2.1: + dependencies: + tiny-invariant: 1.3.3 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.2.3: {} + + d3-array@1.2.4: {} + + d3-geo@1.7.1: + dependencies: + d3-array: 1.2.4 + + d3-voronoi@1.1.2: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dargs@7.0.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.20: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.6.0: {} + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + default-passive-events@2.0.0: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.1.2: + optional: true + + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + diff@4.0.4: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-align@1.12.4: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.29.2 + csstype: 3.2.3 + + dom-scroll-into-view@2.0.1: {} + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-to-image@2.6.0: {} + + dom-walk@0.1.2: {} + + dom7@3.0.0: + dependencies: + ssr-window: 3.0.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.4.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + draco3d@1.5.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + earcut@2.2.4: {} + + earcut@3.0.2: {} + + echarts-wordcloud@2.1.0(echarts@5.6.0): + dependencies: + echarts: 5.6.0 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.343: {} + + element-plus@2.13.7(typescript@6.0.3)(vue@3.5.33(typescript@6.0.3)): + dependencies: + '@ctrl/tinycolor': 4.2.0 + '@element-plus/icons-vue': 2.3.2(vue@3.5.33(typescript@6.0.3)) + '@floating-ui/dom': 1.7.6 + '@popperjs/core': '@sxzz/popperjs-es@2.11.8' + '@types/lodash': 4.17.24 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 12.0.0(typescript@6.0.3) + async-validator: 4.2.5 + dayjs: 1.11.20 + lodash: 4.18.1 + lodash-es: 4.18.1 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.33(typescript@6.0.3) + vue-component-type-helpers: 3.2.7 + transitivePeerDependencies: + - typescript + + emoji-regex@8.0.0: {} + + emojis-list@3.0.0: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@7.0.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es5-shim@4.6.7: {} + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8): + dependencies: + eslint: 8.57.1 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.1 + optionalDependencies: + eslint-config-prettier: 8.10.2(eslint@8.57.1) + + eslint-plugin-vue@8.7.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 3.0.0(eslint@8.57.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.4 + vue-eslint-parser: 8.3.0(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + esri-leaflet@3.0.19(leaflet@1.9.4): + dependencies: + '@terraformer/arcgis': 2.1.2 + leaflet: 1.9.4 + tiny-binary-search: 1.0.3 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + exceljs@4.4.0: + dependencies: + archiver: 5.3.2 + dayjs: 1.11.20 + fast-csv: 4.3.6 + jszip: 3.10.1 + readable-stream: 3.6.2 + saxes: 5.0.1 + tmp: 0.2.7 + unzipper: 0.10.14 + uuid: 8.3.2 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-on-epipe@1.0.1: {} + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-csv@4.3.6: + dependencies: + '@fast-csv/format': 4.3.5 + '@fast-csv/parse': 4.3.6 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-equals@4.0.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fflate@0.3.11: {} + + fflate@0.8.2: {} + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-saver@2.0.5: {} + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.4.2: {} + + follow-redirects@1.16.0: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + frac@1.1.2: {} + + fraction.js@5.3.4: {} + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + franc-min@6.2.0: + dependencies: + trigram-utils: 2.0.1 + + fresh@0.5.2: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.3 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + geojson-equality-ts@1.0.2: + dependencies: + '@types/geojson': 7946.0.16 + + geojson-polygon-self-intersections@1.2.2: + dependencies: + rbush: 2.0.2 + + geotiff@3.0.5: + dependencies: + '@petamoriken/float16': 3.9.3 + lerc: 3.0.0 + pako: 2.1.0 + parse-headers: 2.0.6 + quick-lru: 6.1.2 + web-worker: 1.5.0 + xml-utils: 1.10.2 + zstddec: 0.2.0 + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-value@2.0.6: {} + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.18.1 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + + global@4.3.2: + dependencies: + min-document: 2.19.2 + process: 0.5.2 + + global@4.4.0: + dependencies: + min-document: 2.19.2 + process: 0.11.10 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + grapheme-splitter@1.0.4: {} + + graphemer@1.4.0: {} + + hard-rejection@2.1.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-void-elements@2.0.1: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + human-signals@2.1.0: {} + + husky@7.0.4: {} + + i18next@20.6.1: + dependencies: + '@babel/runtime': 7.29.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + image-size@0.5.5: {} + + immediate@3.0.6: {} + + immer@9.0.21: {} + + immutable@5.1.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + individual@2.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.3 + side-channel: 1.1.0 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.3 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.3 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.3 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-function@1.0.2: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hotkey@0.2.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@3.0.1: {} + + is-plain-object@5.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.9 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-url@1.2.4: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + jiti@1.21.7: {} + + js-base64@2.6.4: {} + + js-base64@3.7.8: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsencrypt@3.5.4: {} + + jsep@1.4.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + jsts@2.7.1: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + kdbush@4.0.2: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + ktx-parse@1.1.0: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + leaflet@1.9.4: {} + + lerc@2.0.0: {} + + lerc@3.0.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + listenercount@1.0.1: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + localforage@1.10.0: + dependencies: + lie: 3.1.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.18.1 + lodash-es: 4.18.1 + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.escaperegexp@4.1.2: {} + + lodash.flatten@4.4.0: {} + + lodash.foreach@4.5.0: {} + + lodash.groupby@4.6.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isequal@4.5.0: {} + + lodash.isfunction@3.0.9: {} + + lodash.isnil@4.0.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isundefined@3.0.1: {} + + lodash.merge@4.6.2: {} + + lodash.throttle@4.1.1: {} + + lodash.toarray@4.4.0: {} + + lodash.union@4.6.0: {} + + lodash.uniq@4.5.0: {} + + lodash@4.18.1: {} + + long@5.3.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + m3u8-parser@2.1.0: {} + + m3u8-parser@7.2.0: + dependencies: + '@babel/runtime': 7.29.2 + '@videojs/vhs-utils': 4.1.1 + global: 4.4.0 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + map-cache@0.2.2: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + memoize-one@5.2.1: {} + + memoize-one@6.0.0: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mersenne-twister@1.1.0: {} + + meshoptimizer@1.1.1: {} + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + min-document@2.19.2: + dependencies: + dom-walk: 0.1.2 + + min-indent@1.0.1: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.14 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + moment@2.30.1: {} + + mpd-parser@1.3.1: + dependencies: + '@babel/runtime': 7.29.2 + '@videojs/vhs-utils': 4.1.1 + '@xmldom/xmldom': 0.8.13 + global: 4.4.0 + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mux.js@4.3.2: {} + + mux.js@7.1.0: + dependencies: + '@babel/runtime': 7.29.2 + global: 4.4.0 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + n-gram@2.0.2: {} + + namespace-emitter@2.0.1: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + nanopop@2.4.2: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + next-tick@1.1.0: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.38: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + nosleep.js@0.12.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + numfmt@3.2.6: {} + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + ol@10.9.0: + dependencies: + '@types/rbush': 4.0.0 + earcut: 3.0.2 + geotiff: 3.0.5 + pbf: 4.0.1 + rbush: 4.0.1 + zarrita: 0.7.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + opentype.js@1.3.5: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ot-json1@1.0.2: + dependencies: + ot-text-unicode: 4.0.0 + + ot-text-unicode@4.0.0: + dependencies: + unicount: 1.1.0 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + pako@1.0.11: {} + + pako@2.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-headers@2.0.6: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + pathe@0.2.0: {} + + pbf@4.0.1: + dependencies: + resolve-protobuf-schema: 2.1.0 + + pdfjs-dist@6.0.227: + optionalDependencies: + '@napi-rs/canvas': 1.0.0 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pify@2.3.0: {} + + pinia@2.3.1(typescript@6.0.3)(vue@3.5.33(typescript@6.0.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.33(typescript@6.0.3) + vue-demi: 0.14.10(vue@3.5.33(typescript@6.0.3)) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@vue/composition-api' + + pirates@4.0.7: {} + + pkcs7@0.2.3: {} + + pkcs7@1.0.4: + dependencies: + '@babel/runtime': 7.29.2 + + point-in-polygon-hao@1.2.4: + dependencies: + robust-predicates: 3.0.3 + + point-in-polygon@1.1.0: {} + + polyclip-ts@0.16.8: + dependencies: + bignumber.js: 9.3.1 + splaytree-ts: 1.0.2 + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + + postcss-js@4.1.0(postcss@8.5.10): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.10 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.10): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.10 + + postcss-nested@6.2.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 6.1.2 + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.5.10: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + preact@10.29.1: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + printj@1.1.2: {} + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + process@0.5.2: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + protobufjs@8.3.0: + dependencies: + long: 5.3.2 + + protocol-buffers-schema@3.6.1: {} + + proxy-from-env@2.1.0: {} + + punycode@2.3.1: {} + + q@1.5.1: {} + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@4.0.1: {} + + quick-lru@6.1.2: {} + + quickselect@1.1.1: {} + + quickselect@2.0.0: {} + + quickselect@3.0.0: {} + + raf-schd@4.0.3: {} + + range-parser@1.2.1: {} + + rbush@2.0.2: + dependencies: + quickselect: 1.1.1 + + rbush@3.0.1: + dependencies: + quickselect: 2.0.0 + + rbush@4.0.1: + dependencies: + quickselect: 3.0.0 + + rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-menu@9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + '@rc-component/trigger': 2.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-overflow: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-overflow@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + + rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + + rc-virtual-list@3.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-beautiful-dnd@13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + css-box-model: 1.2.1 + memoize-one: 5.2.1 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: 4.2.1 + use-memo-one: 1.1.3(react@18.3.1) + transitivePeerDependencies: + - react-native + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-draggable@4.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-grid-layout@1.5.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + fast-equals: 4.0.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-resizable: 3.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + '@types/react-redux': 7.1.34 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 17.0.2 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + react-remove-scroll@2.7.2(@types/react@19.2.17)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.17)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@19.2.17)(react@18.3.1) + optionalDependencies: + '@types/react': 19.2.17 + + react-resizable@3.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + react-style-singleton@2.2.3(@types/react@19.2.17)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + readdirp@4.1.2: {} + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.29.2 + + reference-spec-reader@0.2.0: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerator-runtime@0.11.1: {} + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp-util@2.0.3: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-global@1.0.0: + dependencies: + global-dirs: 0.1.1 + + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.1 + + resolve-url@0.2.1: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + ret@0.1.15: {} + + reusify@1.1.0: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@2.0.4: {} + + robust-predicates@3.0.3: {} + + rollup-plugin-external-globals@0.6.1(rollup@3.30.0): + dependencies: + '@rollup/pluginutils': 4.2.1 + estree-walker: 2.0.2 + is-reference: 1.2.1 + magic-string: 0.25.9 + rollup: 3.30.0 + + rollup@3.30.0: + optionalDependencies: + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rust-result@1.0.0: + dependencies: + individual: 2.0.0 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-json-parse@4.0.0: + dependencies: + rust-result: 1.0.0 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + sass@1.99.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.5 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + + sax@1.6.0: {} + + saxes@5.0.1: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + screenfull@6.0.2: {} + + scroll-into-view-if-needed@2.2.31: + dependencies: + compute-scroll-into-view: 1.0.20 + + semver@5.7.2: {} + + semver@7.3.7: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.4: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + shallow-equal@1.2.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + skmeans@0.9.7: {} + + slash@3.0.0: {} + + slate-history@0.66.0(slate@0.72.8): + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + slate@0.72.8: + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + snabbdom@3.6.3: {} + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + sonner@2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + sortablejs@1.10.2: {} + + sortablejs@1.15.7: {} + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + sourcemap-codec@1.4.8: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + splaytree-ts@1.0.2: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + ssf@0.11.2: + dependencies: + frac: 1.1.2 + + ssr-window@3.0.0: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + statuses@2.0.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + strict-uri-encode@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + stylis@4.4.0: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.16 + ts-interface-checker: 0.1.13 + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + + svgo@2.8.2: + dependencies: + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + sax: 1.6.0 + stable: 0.1.8 + + sweepline-intersections@1.5.0: + dependencies: + tinyqueue: 2.0.3 + + tailwind-merge@2.6.0: {} + + tailwindcss@3.4.19: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-import: 15.1.0(postcss@8.5.10) + postcss-js: 4.1.0(postcss@8.5.10) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.10) + postcss-nested: 6.2.0(postcss@8.5.10) + postcss-selector-parser: 6.1.2 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + text-extensions@1.9.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + throttle-debounce@5.0.2: {} + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + tiny-binary-search@1.0.3: {} + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyqueue@2.0.3: {} + + tmp@0.2.7: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + toidentifier@1.0.1: {} + + topojson-client@3.1.0: + dependencies: + commander: 2.20.3 + + topojson-server@3.0.1: + dependencies: + commander: 2.20.3 + + traverse@0.3.9: {} + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.20 + + trigram-utils@2.0.1: + dependencies: + collapse-white-space: 2.1.0 + n-gram: 2.0.2 + + trim-newlines@3.0.1: {} + + ts-interface-checker@0.1.13: {} + + ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.126 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + tsml@1.0.1: {} + + tsutils@3.21.0(typescript@6.0.3): + dependencies: + tslib: 1.14.1 + typescript: 6.0.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.18.1: {} + + type-fest@0.20.2: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@4.9.5: {} + + typescript@6.0.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unicode-regex@4.2.0: + dependencies: + regexp-util: 2.0.3 + + unicount@1.1.0: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + unzipit@2.0.0: {} + + unzipper@0.10.14: + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urijs@1.19.11: {} + + urix@0.1.0: {} + + url-toolkit@2.2.5: {} + + use-callback-ref@1.3.3(@types/react@19.2.17)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + use-memo-one@1.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + use-sidecar@1.1.3(@types/react@19.2.17)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + uuid@13.0.2: {} + + uuid@8.3.2: {} + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vary@1.1.2: {} + + video.js@6.13.0: + dependencies: + babel-runtime: 6.26.0 + global: 4.3.2 + safe-json-parse: 4.0.0 + tsml: 1.0.1 + videojs-font: 2.1.0 + videojs-ie8: 1.1.2 + videojs-vtt.js: 0.12.6 + xhr: 2.4.0 + + video.js@8.23.7: + dependencies: + '@babel/runtime': 7.29.2 + '@videojs/http-streaming': 3.17.4(video.js@8.23.7) + '@videojs/vhs-utils': 4.1.1 + '@videojs/xhr': 2.7.0 + aes-decrypter: 4.0.2 + global: 4.4.0 + m3u8-parser: 7.2.0 + mpd-parser: 1.3.1 + mux.js: 7.1.0 + videojs-contrib-quality-levels: 4.1.0(video.js@8.23.7) + videojs-font: 4.2.0 + videojs-vtt.js: 0.15.5 + + videojs-contrib-hls@5.15.0: + dependencies: + aes-decrypter: 1.0.3 + global: 4.4.0 + m3u8-parser: 2.1.0 + mux.js: 4.3.2 + url-toolkit: 2.2.5 + video.js: 6.13.0 + videojs-contrib-media-sources: 4.7.2 + webwackify: 0.1.6 + + videojs-contrib-media-sources@4.7.2: + dependencies: + global: 4.4.0 + mux.js: 4.3.2 + video.js: 6.13.0 + webwackify: 0.1.6 + + videojs-contrib-quality-levels@4.1.0(video.js@8.23.7): + dependencies: + global: 4.4.0 + video.js: 8.23.7 + + videojs-font@2.1.0: {} + + videojs-font@4.2.0: {} + + videojs-ie8@1.1.2: + dependencies: + es5-shim: 4.6.7 + + videojs-vtt.js@0.12.6: + dependencies: + global: 4.4.0 + + videojs-vtt.js@0.15.5: + dependencies: + global: 4.4.0 + + vite-plugin-cesium@1.2.22(cesium@1.141.0)(rollup@3.30.0)(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0)): + dependencies: + cesium: 1.141.0 + fs-extra: 9.1.0 + rollup-plugin-external-globals: 0.6.1(rollup@3.30.0) + serve-static: 1.16.3 + vite: 4.5.14(@types/node@16.18.126)(sass@1.99.0) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-svg-icons@2.0.1(vite@4.5.14(@types/node@16.18.126)(sass@1.99.0)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.6 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.2 + vite: 4.5.14(@types/node@16.18.126)(sass@1.99.0) + transitivePeerDependencies: + - supports-color + + vite@4.5.14(@types/node@16.18.126)(sass@1.99.0): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.10 + rollup: 3.30.0 + optionalDependencies: + '@types/node': 16.18.126 + fsevents: 2.3.3 + sass: 1.99.0 + + vscode-uri@3.1.0: {} + + vue-ant-modal-enhance@1.2.2(ant-design-vue@4.2.6(vue@3.5.33(typescript@6.0.3)))(vue@3.5.33(typescript@6.0.3)): + dependencies: + ant-design-vue: 4.2.6(vue@3.5.33(typescript@6.0.3)) + vue: 3.5.33(typescript@6.0.3) + + vue-component-type-helpers@3.2.7: {} + + vue-demi@0.14.10(vue@3.5.33(typescript@6.0.3)): + dependencies: + vue: 3.5.33(typescript@6.0.3) + + vue-eslint-parser@8.3.0(eslint@8.57.1): + dependencies: + debug: 4.4.3 + eslint: 8.57.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + lodash: 4.18.1 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + vue-i18n@9.14.5(vue@3.5.33(typescript@6.0.3)): + dependencies: + '@intlify/core-base': 9.14.5 + '@intlify/shared': 9.14.5 + '@vue/devtools-api': 6.6.4 + vue: 3.5.33(typescript@6.0.3) + + vue-router@4.6.4(vue@3.5.33(typescript@6.0.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.33(typescript@6.0.3) + + vue-tsc@3.2.7(typescript@6.0.3): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.2.7 + typescript: 6.0.3 + + vue-types@3.0.2(vue@3.5.33(typescript@6.0.3)): + dependencies: + is-plain-object: 3.0.1 + vue: 3.5.33(typescript@6.0.3) + + vue@3.5.33(typescript@6.0.3): + dependencies: + '@vue/compiler-dom': 3.5.33 + '@vue/compiler-sfc': 3.5.33 + '@vue/runtime-dom': 3.5.33 + '@vue/server-renderer': 3.5.33(vue@3.5.33(typescript@6.0.3)) + '@vue/shared': 3.5.33 + optionalDependencies: + typescript: 6.0.3 + + vuedraggable@2.24.3: + dependencies: + sortablejs: 1.10.2 + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + web-worker@1.5.0: {} + + webwackify@0.1.6: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@1.1.2: {} + + wmf@1.0.2: {} + + word-wrap@1.2.5: {} + + word@0.3.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + wujie-vue3@1.0.29(vue@3.5.33(typescript@6.0.3)): + dependencies: + vue: 3.5.33(typescript@6.0.3) + wujie: 1.0.29 + + wujie@1.0.29: + dependencies: + '@babel/runtime': 7.29.2 + + xhr@2.4.0: + dependencies: + global: 4.3.2 + is-function: 1.0.2 + parse-headers: 2.0.6 + xtend: 4.0.2 + + xlsx-js-style@1.2.0: + dependencies: + adler-32: 1.2.0 + cfb: 1.2.2 + codepage: 1.14.0 + commander: 2.17.1 + crc-32: 1.2.2 + exit-on-epipe: 1.0.1 + fflate: 0.3.11 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + + xlsx@0.18.5: + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + + xml-utils@1.10.2: {} + + xmlchars@2.2.0: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@1.10.3: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zarrita@0.7.1: + dependencies: + '@zarrita/storage': 0.2.0 + numcodecs: 0.3.2 + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 + + zstddec@0.2.0: {} diff --git a/frontend-sjgl/postcss.config.js b/frontend-sjgl/postcss.config.js new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/frontend-sjgl/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/frontend-sjgl/public/file/注册操作手册.docx b/frontend-sjgl/public/file/注册操作手册.docx new file mode 100644 index 00000000..866c3f01 Binary files /dev/null and b/frontend-sjgl/public/file/注册操作手册.docx differ diff --git a/frontend-sjgl/public/file/过鱼设施数据填报操作手册.docx b/frontend-sjgl/public/file/过鱼设施数据填报操作手册.docx new file mode 100644 index 00000000..f3d2e60d Binary files /dev/null and b/frontend-sjgl/public/file/过鱼设施数据填报操作手册.docx differ diff --git a/frontend-sjgl/public/file/鱼种类字典数据.xlsx b/frontend-sjgl/public/file/鱼种类字典数据.xlsx new file mode 100644 index 00000000..250cae34 Binary files /dev/null and b/frontend-sjgl/public/file/鱼种类字典数据.xlsx differ diff --git a/frontend-sjgl/public/logo.png b/frontend-sjgl/public/logo.png new file mode 100644 index 00000000..127fda24 Binary files /dev/null and b/frontend-sjgl/public/logo.png differ diff --git a/frontend-sjgl/readme.md b/frontend-sjgl/readme.md new file mode 100644 index 00000000..dfaf36fc --- /dev/null +++ b/frontend-sjgl/readme.md @@ -0,0 +1 @@ +这里放置前端项目的readme文件 \ No newline at end of file diff --git a/frontend-sjgl/src/App.vue b/frontend-sjgl/src/App.vue new file mode 100644 index 00000000..36f4ab18 --- /dev/null +++ b/frontend-sjgl/src/App.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend-sjgl/src/api/DataQueryMenuModule/index.ts b/frontend-sjgl/src/api/DataQueryMenuModule/index.ts new file mode 100644 index 00000000..56885818 --- /dev/null +++ b/frontend-sjgl/src/api/DataQueryMenuModule/index.ts @@ -0,0 +1,310 @@ +import request from '@/utils/request'; + +// 基础信息 集团/公司 +export function getCompanyList(data) { + return request({ + url: '/env/hycd/selectForDropdown', + method: 'get', + params: data + }); +} +// 基础信息 表格 +export function getPowerTableList(data) { + return request({ + url: '/env/engInfo/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 基础信息 编辑 +export function updatePowerInfo(data) { + return request({ + url: '/env/engInfo/update', + method: 'post', + data + }); +} + +// 基础信息 删除 +export function deletePowerInfo(data) { + return request({ + url: '/env/engInfo/delete', + method: 'post', + data + }); +} + +// 鱼类基础信息 科 +export function getFishResourceList(data) { + return request({ + url: '/fpr/fishDic/GetKendoList', + method: 'post', + data + }); +} + +// 鱼类基础信息 表格 +export function getFishResourceZYList(data) { + return request({ + url: '/fpr/fishDic/zy/GetKendoList', + method: 'post', + data + }); +} + +// 批复文件 +export function getApprovalStatusList(data) { + return request({ + url: '/eng/base/eiaapproval/GetKendoList', + method: 'post', + data + }); +} +// 生态流量运行数据 - 小时 + +export function getFlowDataList(data) { + return request({ + url: '/eq/data/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量运行数据 - 日 + +export function getFlowDataDayList(data) { + return request({ + url: '/eq/data/day/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量运行数据 - 月 + +export function getFlowDataMonthList(data) { + return request({ + url: '/eq/data/drtp/GetKendoListCust', + method: 'post', + data + }); +} +// 水质监测数据 - 断面 +export function getWaterDataSectionList(data) { + return request({ + url: '/wq/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 水质监测数据 - 小时 +export function getWaterDataList(data) { + return request({ + url: '/wq/data/GetKendoListCust', + method: 'post', + data + }); +} +// 水质监测数据 - 日 +export function getWaterDataDayList(data) { + return request({ + url: '/wq/data/day/GetKendoListCust', + method: 'post', + data + }); +} +// 水质监测数据 - 月 +export function getWaterDataMonthList(data) { + return request({ + url: '/wq/data/drtp/GetKendoListCust', + method: 'post', + data + }); +} +// 水质监测数据 编辑 +export function updateWaterDataInfo(data) { + return request({ + url: '/wq/updateWqRsData', + method: 'post', + data + }); +} +// 水质监测数据 删除 +export function deleteWaterDataInfo(data) { + return request({ + url: '/wq/removeKendoByIds', + method: 'post', + data + }); +} +// 垂向 - 列表 +export function getVerticalList(data) { + return request({ + url: '/wt/cxDetail/GetKendoListCust', + method: 'post', + data + }); +} +// 垂向 - 编辑 +export function updateVerticalInfo(data) { + return request({ + url: '/wt/cxDetail/updateWtvtRData', + method: 'post', + data + }); +} +// 垂向 - 删除 +export function deleteVerticalInfo(data) { + return request({ + url: '/wt/cxDetail/removeKendoByIds', + method: 'post', + data + }); +} +// 表层水温 - 断面 +export function getSurfaceTempSectionList(data) { + return request({ + url: '/wt/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 表层水温 - 小时 +export function getSurfaceTempList(data) { + return request({ + url: '/wt/alongDetail/GetKendoListCust', + method: 'post', + data + }); +} +// 表层水温 - 日 +export function getSurfaceTempDayList(data) { + return request({ + url: '/wt/alongDetail/day/GetKendoListCust', + method: 'post', + data + }); +} +// 表层水温 - 月 +export function getSurfaceTempMonthList(data) { + return request({ + url: '/wt/alongDetail/drtp/GetKendoListCust', + method: 'post', + data + }); +} + +// 表层水温 - 编辑 +export function updateSurfaceTempInfo(data) { + return request({ + url: '/wt/alongDetail/updateWtrvRData', + method: 'post', + data + }); +} +// 表层水温 - 删除 +export function deleteSurfaceTempInfo(data) { + return request({ + url: '/wt/alongDetail/drtp/removeKendoByIds', + method: 'post', + data + }); +} +// 表层水温 - 数据分析 - 断面 +export function getSurfaceTempAnalysisList(data) { + return request({ + url: '/wt/msstbprpt/eng/GetKendoList', + method: 'post', + data + }); +} +// 表层水温 - 数据分析 - excel +export function getSurfaceTempAnalysisExcel(data) { + return request({ + url: '/wt/wtrvAmend/dayAmend/GetKendoListCust', + method: 'post', + data + }); +} +// 表层水温 - 数据分析 - 保存 +export function saveSurfaceTempAnalysisExcel(data) { + return request({ + url: '/wt/wtrvAmend/dayAmend/saveAmendData', + method: 'post', + data + }); +} + +// 过鱼设施名称 - 断面 +export function getFishReleaseMonitorSectionList(data) { + return request({ + url: '/fp/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 过鱼监测数据 +export function getFishReleaseMonitorList(data) { + return request({ + url: '/fp/query/qgc/GetKendoListCust', + method: 'post', + data + }); +} + +// 鱼类 放鱼 +export function getFishReleaseList(data) { + return request({ + url: '/fb/fishrun/qgc/GetKendoListCust', + method: 'post', + data + }); +} + +// 流量站 - 断面 +export function getFlowStationSectionList(data) { + return request({ + url: '/zq/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 流量站 - 小时 +export function getFlowStationList(data) { + return request({ + url: '/zq/river/GetKendoListCust', + method: 'post', + data + }); +} +// 流量站 - 日 +export function getFlowStationDayList(data) { + return request({ + url: '/zq/river/day/GetKendoListCust', + method: 'post', + data + }); +} +// 流量站 - 月 +export function getFlowStationMonthList(data) { + return request({ + url: '/zq/river/drtp/GetKendoListCust', + method: 'post', + data + }); +} + +// 流量站 - 编辑 +export function updateFlowStationInfo(data) { + return request({ + url: '/zq/river/updateRiverRData', + method: 'post', + data + }); +} +// 流量站 - 删除 +export function deleteFlowStationInfo(data) { + return request({ + url: '/zq/river/removeKendoByIds', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/auth/index.ts b/frontend-sjgl/src/api/auth/index.ts new file mode 100644 index 00000000..44f1e71f --- /dev/null +++ b/frontend-sjgl/src/api/auth/index.ts @@ -0,0 +1,175 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { LoginData, TokenResult, VerifyCode } from './types'; +export function getAccessToken() { + return request({ + url: '/register/accessToken', + method: 'get' + }); +} + +/** + * + * @param data {LoginForm} + * @returns + */ +export function loginApi(data: LoginData): AxiosPromise { + return request({ + url: '/user/login', + method: 'post', + params: data + }); +} + +/** + * 注销 + */ +export function logoutApi() { + return request({ + url: '/user/logout', + method: 'post' + }); +} + +/** + * 获取图片验证码 + */ +export function getCaptcha(): AxiosPromise { + return request({ + url: '/user/code?t=' + new Date().getTime().toString(), + method: 'get' + }); +} + +/** + * 用户注册 + */ +export function registerUser(data: any): AxiosPromise { + return request({ + url: '/sms/register', + method: 'post', + data + }); +} + +/** + * 获取流域列表 + * @param companyId 公司ID(可选),如果传入则根据公司获取流域列表 + */ +export function getBasinList(): AxiosPromise { + return request({ + url: '/register/dropdown/rvcd', + method: 'get', + headers: { + 'register-token': localStorage.getItem('register-token') || '' + } + // params: baseid ? { baseid } : {} + }); +} + +/** + * 获取集团列表(无参数,获取全量集团) + */ +export function getGroupList(): AxiosPromise { + return request({ + url: '/register/dropdown/hycd', + method: 'get', + params: { lx: 1 }, + headers: { + 'register-token': localStorage.getItem('register-token') || '' + } + }); +} + +/** + * 根据集团获取公司列表 + */ +export function getCompanyList(): AxiosPromise { + return request({ + url: '/register/dropdown/hycd', + method: 'get', + params: { lx: 2 }, + headers: { + 'register-token': localStorage.getItem('register-token') || '' + } + }); +} + +/** + * 根据流域获取电站列表 + */ +export function getStationList(params: any): AxiosPromise { + return request({ + url: '/register/dropdown/engInfo', + method: 'post', + data: params, + headers: { + 'register-token': localStorage.getItem('register-token') || '' + } + }); +} + +/** + * 发送短信验证码 + * @param phone 手机号 + * @param type 验证码类型:1-注册 2-找回密码 + */ +export function sendSmsCode(phone: string, type = 1): AxiosPromise { + return request({ + url: '/sms/sendCode', + method: 'post', + data: { phone, type } + }); +} + +/** + * 验证短信验证码 + * @param phone 手机号 + * @param code 验证码 + * @param type 验证码类型:1-注册 2-找回密码 + */ +export function verifySmsCode( + phone: string, + code: string, + type = 1 +): AxiosPromise { + return request({ + url: '/sms/verifyCode', + method: 'post', + data: { phone, code, type } + }); +} + +/** + * 短信验证码登录 + * @param phone 手机号 + * @param code 验证码 + */ +export function smsLoginApi( + phone: string, + code: string +): AxiosPromise { + return request({ + url: '/sms/login', + method: 'post', + data: { phone, code } + }); +} + +/** + * 重置密码 + * @param phone 手机号 + * @param code 验证码 + * @param password 新密码 + */ +export function resetPassword( + phone: string, + code: string, + password: string +): AxiosPromise { + return request({ + url: '/sms/resetPassword', + method: 'post', + data: { phone, code, password } + }); +} diff --git a/frontend-sjgl/src/api/auth/types.ts b/frontend-sjgl/src/api/auth/types.ts new file mode 100644 index 00000000..f6b18efe --- /dev/null +++ b/frontend-sjgl/src/api/auth/types.ts @@ -0,0 +1,34 @@ +/** + * 登录数据类型 + */ +export interface LoginData { + username: string; + password: string; + code: string; + uuid: string; + /** + * 验证码Code + */ + //verifyCode: string; + /** + * 验证码Code服务端缓存key(UUID) + */ + // verifyCodeKey: string; +} + +/** + * Token响应类型 + */ +export interface TokenResult { + token: string; + refreshToken: string; + expires: number; +} + +/** + * 验证码类型 + */ +export interface VerifyCode { + verifyCodeImg: string; + verifyCodeKey: string; +} diff --git a/frontend-sjgl/src/api/changePassWord/index.ts b/frontend-sjgl/src/api/changePassWord/index.ts new file mode 100644 index 00000000..727c442f --- /dev/null +++ b/frontend-sjgl/src/api/changePassWord/index.ts @@ -0,0 +1,9 @@ +import request from '@/utils/request'; +//修改密码 +export function updatePassword(params:any) { + return request({ + url: '/user/updatePassword', + method: 'post', + data: params + }); +} \ No newline at end of file diff --git a/frontend-sjgl/src/api/dept/index.ts b/frontend-sjgl/src/api/dept/index.ts new file mode 100644 index 00000000..9fb5599b --- /dev/null +++ b/frontend-sjgl/src/api/dept/index.ts @@ -0,0 +1,139 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DeptForm, DeptQuery, Dept } from './types'; + + +//获取组织架构 + +export function getTreelist(queryParams:any) { + return request({ + url: '/system/organization/getOrgTree', + method: 'POST', + params: queryParams + }); +} +//新增企业或部门 + +export function addTreelist(queryParams:any) { + return request({ + url: '/system/organization/addOrg', + method: 'POST', + data: queryParams + }); +} +// 修改企业部门 + +export function updataTreelist(queryParams:any) { + return request({ + url: '/system/organization/updateById', + method: 'POST', + data: queryParams + }); +} +//删除企业 +export function delTreelist(queryParams:any) { + return request({ + url: '/system/organization/deleteById', + method: 'POST', + params: queryParams + }); +} +//获取部门信息 +export function gettableData(queryParams:any) { + return request({ + url: '/system/organization/getOrganizationById', + method: 'POST', + params: queryParams + }); +} +//部门是否有效 +export function deptIsVaild(queryParams:any) { + return request({ + url: '/system/organization/setIsValid', + method: 'POST', + params: queryParams + }); +} + +//修改部门信息 +export function reviseDepartment(queryParams:any) { + return request({ + url: '/system/organization/updateById', + method: 'POST', + data: queryParams + }); +} + +/** + * 部门树形表格 + * + * @param queryParams + */ +export function listDepartments(queryParams?: DeptQuery): AxiosPromise { + return request({ + url: '/api/v1/dept', + method: 'get', + params: queryParams + }); +} + +/** + * 部门下拉列表 + */ +export function listDeptOptions(): AxiosPromise { + return request({ + url: '/api/v1/dept/options', + method: 'get' + }); +} + +/** + * 获取部门详情 + * + * @param id + */ +export function getDeptForm(id: string): AxiosPromise { + return request({ + url: '/api/v1/dept/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增部门 + * + * @param data + */ +export function addDept(data: DeptForm) { + return request({ + url: '/api/v1/dept', + method: 'post', + data: data + }); +} + +/** + * 修改部门 + * + * @param id + * @param data + */ +export function updateDept(id: string, data: DeptForm) { + return request({ + url: '/api/v1/dept/' + id, + method: 'put', + data: data + }); +} + +/** + * 删除部门 + * + * @param ids + */ +export function deleteDept(ids: string) { + return request({ + url: '/api/v1/dept/' + ids, + method: 'delete' + }); +} diff --git a/frontend-sjgl/src/api/dept/types.ts b/frontend-sjgl/src/api/dept/types.ts new file mode 100644 index 00000000..b99f819b --- /dev/null +++ b/frontend-sjgl/src/api/dept/types.ts @@ -0,0 +1,34 @@ +/** + * 部门查询参数 + */ +export interface DeptQuery { + keywords: string | undefined; + status: number | undefined; +} + +/** + * 部门类型 + */ +export interface Dept { + id: string; + name: string; + parentId: string; + treePath: string; + sort: number; + status: number; + leader?: string; + mobile?: string; + email?: string; + children: Dept[]; +} + +/** + * 部门表单类型 + */ +export interface DeptForm { + id?: string; + parentId: string; + name: string; + sort: number; + status: number; +} diff --git a/frontend-sjgl/src/api/dict/index.ts b/frontend-sjgl/src/api/dict/index.ts new file mode 100644 index 00000000..2b4d2a4a --- /dev/null +++ b/frontend-sjgl/src/api/dict/index.ts @@ -0,0 +1,250 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { + DictQuery, + DictPageResult, + DictTypeForm, + DictItemQuery, + DictItemPageResult, + DictItemForm +} from './types'; +// 查询字典 +export function getTreelist(params:any) { + return request({ + url: '/system/dictionary/dictList', + method: 'get', + params: params + }); +} + +// 新增字典 +export function addDict(params:any) { + return request({ + url: '/system/dictionary/addDict', + method: 'post', + data: params + }); +} + +// 修改字典 +export function updateDict(params:any) { + return request({ + url: '/system/dictionary/updateDict', + method: 'post', + data: params + }); +} +// 删除字典 +export function deleteById(params:any) { + return request({ + url: '/system/dictionary/deleteById', + method: 'post', + params: params + }); +} +// 字典排序 +export function changeDictOrder(params:any) { + return request({ + url: '/system/dictionary/changeDictOrder', + method: 'post', + params: params + }); +} +// 查询字典项 +export function getDictItemById(params:any) { + return request({ + url: '/system/dictionaryItems/page', + method: 'get', + params: params + }); +} + +// 新增字典项 +export function addDictionaryItem(params:any) { + return request({ + url: '/system/dictionaryItems/addDictionaryItem', + method: 'post', + data: params + }); +} + +// 修改字典项 +export function updateDictionaryItem(params:any) { + return request({ + url: '/system/dictionaryItems/updateDictionaryItem', + method: 'post', + data: params + }); +} +// 删除字典项 +export function deleteDictItemById(params:any) { + return request({ + url: '/system/dictionaryItems/deleteDictItemById', + method: 'post', + params: params + }); +} +// 批量删除字典项 +export function deleteDictItemByIds(params:any) { + return request({ + url: '/system/dictionaryItems/deleteDictItemByIds', + method: 'post', + params: params + }); +} + +// 字典项排序 +export function changeItemOrder(params:any) { + return request({ + url: '/system/dictionaryItems/changeItemOrder', + method: 'post', + params: params + }); +} +//根据字典编号查询字典项列表 +export function getDictItemsByCode(params:any) { + return request({ + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: params + }); +} +/** + * 获取字典类型分页列表 + * + * @param queryParams + */ +export function listDictTypePages( + queryParams: DictQuery +): AxiosPromise { + return request({ + url: '/api/v1/dict/types/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取字典类型表单数据 + * + * @param id + */ +export function getDictTypeForm(id: number): AxiosPromise { + return request({ + url: '/api/v1/dict/types/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增字典类型 + * + * @param data + */ +export function addDictType(data: DictTypeForm) { + return request({ + url: '/api/v1/dict/types', + method: 'post', + data: data + }); +} + +/** + * 修改字典类型 + * + * @param id + * @param data + */ +export function updateDictType(id: number, data: DictTypeForm) { + return request({ + url: '/api/v1/dict/types/' + id, + method: 'put', + data: data + }); +} + +/** + * 删除字典类型 + */ +export function deleteDictTypes(ids: string) { + return request({ + url: '/api/v1/dict/types/' + ids, + method: 'delete' + }); +} + +/** + * 获取字典类型的数据项 + * + * @param typeCode 字典类型编码 + */ +export function getDictionaries(typeCode: string): AxiosPromise { + return request({ + url: '/api/v1/dict/types/' + typeCode + '/items', + method: 'get' + }); +} + +/** + * 获取字典项分页列表 + */ +export function listDictItemPages( + queryParams: DictItemQuery +): AxiosPromise { + return request({ + url: '/api/v1/dict/items/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取字典数据项表单数据 + * + * @param id + */ +export function getDictItemData(id: number): AxiosPromise { + return request({ + url: '/api/v1/dict/items/' + id + '/form', + method: 'get' + }); +} + +/** + * 新增字典项 + * + * @param data + */ +export function saveDictItem(data: DictItemForm) { + return request({ + url: '/api/v1/dict/items', + method: 'post', + data: data + }); +} + +/** + * 修改字典项 + * + * @param id + * @param data + */ +export function updateDictItem(id: number, data: DictItemForm) { + return request({ + url: '/api/v1/dict/items/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除字典数据项 + * + * @param ids 字典项ID,多个以英文逗号(,)分割 + */ +export function deleteDictItems(ids: string) { + return request({ + url: '/api/v1/dict/items/' + ids, + method: 'delete' + }); +} diff --git a/frontend-sjgl/src/api/dict/types.ts b/frontend-sjgl/src/api/dict/types.ts new file mode 100644 index 00000000..972498c5 --- /dev/null +++ b/frontend-sjgl/src/api/dict/types.ts @@ -0,0 +1,92 @@ +/** + * 字典查询参数 + */ +export interface DictQuery extends PageQuery { + /** + * 字典名称 + */ + name?: string; +} +interface PageResult { + total: number; + list: T[]; +} + +/** + * 字典类型 + */ +export interface Dict { + id: number; + code: string; + name: string; + status: number; + remark: string; +} + +/** + * 字典分页项类型声明 + */ +export type DictPageResult = PageResult; + +/** + * 字典表单类型声明 + */ +export interface DictTypeForm { + id: number | undefined; + name: string; + code: string; + status: number; + remark: string; +} +interface PageQuery { + pageIndex: number; + pageSize: number; +} + +/** + * 字典项查询参数类型声明 + */ +export interface DictItemQuery extends PageQuery { + /** + * 字典项名称 + */ + name?: string; + /** + * 字典类型编码 + */ + typeCode?: string; +} + +/** + * 字典数据项类型 + */ +export interface DictItem { + id: number; + name: string; + value: string; + typeCode: string; + sort: number; + status: number; + defaulted: number; + remark?: string; +} + +/** + * 字典分页项类型声明 + */ +export type DictItemPageResult = PageResult; + +/** + * 字典表单类型声明 + */ +export interface DictItemForm { + id?: number; + typeCode?: string; + typeName?: string; + name: string; + code: string; + value: string; + status: number; + sort: number; + remark: string; +} diff --git a/frontend-sjgl/src/api/guoYuSheShiShuJuTianBao/index.ts b/frontend-sjgl/src/api/guoYuSheShiShuJuTianBao/index.ts new file mode 100644 index 00000000..52bb0db6 --- /dev/null +++ b/frontend-sjgl/src/api/guoYuSheShiShuJuTianBao/index.ts @@ -0,0 +1,138 @@ +import request from '@/utils/request'; + +// 分页查询过鱼数据 +export function getFishDraftPage(data: any) { + return request({ + url: '/data/fishDraft/page', + method: 'post', + data + }); +} +//新增过鱼数据 +export function addFishDraft(queryParams: any) { + return request({ + url: '/data/fishDraft/saveDraft', + method: 'post', + data: queryParams + }); +} +//修改过鱼数据 +export function editFishDraft(queryParams: any) { + return request({ + url: '/data/fishDraft/updateDraft', + method: 'post', + data: queryParams + }); +} +//删除 过鱼数据 +export function delFishDraft(data: any) { + return request({ + url: '/data/fishDraft/batchRemoveDraft', + method: 'post', + data + }); +} +//提交过鱼数据 +export function submitFishDraft(data: any) { + return request({ + url: '/data/fishDraft/submitDrafts', + method: 'post', + data + }); +} +//提交全部过鱼数据 +export function batchApproveAll() { + return request({ + url: '/data/fishDraft/submitDraftsAll', + method: 'post' + }); +} +//审批过鱼数据 +export function successFishDraft(data: any) { + return request({ + url: '/data/fishDraft/batchApprove', + method: 'post', + data + }); +} +//驳回过鱼数据 +export function rejectFishDraft(data: any) { + return request({ + url: '/data/fishDraft/reject', + method: 'post', + data + }); +} +// 导入zip +export function importFishZip(data: FormData) { + return request({ + url: '/data/fishDraft/importZip', + method: 'post', + data, + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 1000 * 60 * 5 // 5分钟 + }); +} +// 取消导入任务 +export function cancelImportTask(data: any) { + return request({ + url: '/data/fishDraft/cancelImport', + method: 'post', + data + }); +} +//检测用户导入状态 +export function checkImportStatus() { + return request({ + url: '/data/fishDraft/checkImportStatus', + method: 'get' + }); +} + +// 查询用户导入结果 +export function getLastImportResult() { + return request({ + url: '/data/fishDraft/getLastImportResult', + method: 'get' + }); +} +export function deleteFile(params: any) { + return request({ + url: '/data/fishDraft/deleteFile', + method: 'get', + params + }); +} +// 批量保存草稿 +export function batchSaveDraft(data: any) { + return request({ + url: '/data/fishDraft/batchSaveDraft', + method: 'post', + data + }); +} +// 批量删除 审批已驳回的 +export function batchRemoveDraft(data: any) { + return request({ + url: '/data/approvalMain/batchDelete', + method: 'post', + data + }); +} + +// 过鱼倒数统计 +export function statistics(data: any) { + return request({ + url: '/data/fishDraft/statistics', + method: 'post', + data + }); +} +// 催促 +export function batchUrgeContent(data: any) { + return request({ + url: '/sms/batchUrgeContent', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/map.ts b/frontend-sjgl/src/api/map.ts new file mode 100644 index 00000000..35ad43ea --- /dev/null +++ b/frontend-sjgl/src/api/map.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request'; + +// 获取图例列表 +export function getModuleMapLegendList(params?: { moduleId?: string }) { + const url = params?.moduleId + ? `/mapLegend/getModuleMapLegendList?moduleId=${params.moduleId}` + : '/mapLegend/getModuleMapLegendList'; + return request({ + url, + method: 'get' + }); +} +// 获取地图配置列表 +export function getMapList(data: any) { + return request({ + url: '/mapmodule/getMapData', + method: 'post', + data + }); +} +// 获取梯级流域地图 +export function getQgcRvcd(data: any) { + return request({ + url: '/eng/base/rsvrcscdb/getQgcRvcd', + method: 'post', + data + }); +} +// 获取梯级流域下拉框列表 +export function getRvcdList(data: any) { + return request({ + url: '/eng/base/rsvrcscdb/rvcd', + method: 'post', + data + }); +} + +// 获取梯级流域下拉框图表数据 +export function getKendoList(data: any) { + return request({ + url: '/eng/base/rsvrcscdb/GetKendoList', + method: 'post', + data + }); +} +// 鱼类分布查询 - 站点查询 +export function getFishPointList(data: any) { + return request({ + url: '/wte/we/fishPoint/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 鱼类分布查询 -鱼查询 +export function getFishList(data: any) { + return request({ + url: '/wte/we/fishList/GetKendoListCust', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/mapModal/index.ts b/frontend-sjgl/src/api/mapModal/index.ts new file mode 100644 index 00000000..748784b1 --- /dev/null +++ b/frontend-sjgl/src/api/mapModal/index.ts @@ -0,0 +1,544 @@ +import request from '@/utils/request'; +export function getStcdDetail(url: string, stcd: string) { + return request({ + url: url, + method: 'get', + params: { stcd } + }); +} +// 公共接口 - post +export function queryPostUrlList(url: string, data: any) { + return request({ + url: url, + method: 'post', + data + }); +} +// 公共接口 - 获取预览地址 +export function getIdUrl(params: any) { + return request({ + url: import.meta.env.VITE_APP_ATTACHMENT_URL + '/get', + method: 'get', + params + }); +} +export function postIdUrl(data: any) { + return request({ + url: import.meta.env.VITE_APP_ATTACHMENT_URL + '/get', + method: 'post', + data, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' + } + }); +} +// 查询站点建设状态 +export function getBuildState(data: any) { + return request({ + url: '/wt/vmsstbprpt/GetKendoList', + method: 'post', + data: { + filter: data.filter, + select: ['bldsttCcode', 'engIwtCode', 'engDwtCode'] + } + }); +} +// 查询鱼类栖息地监测数据类型可用性 +export function getFishTab(stcd: string) { + return request({ + url: `/wte/we/wer/getWeDefaultData`, + method: 'get', + params: { stcd } + }); +} +// 检查水质站是否启用 AI 预测功能 +export function checkAnalysisShow(data: any) { + return request({ + url: '/overview/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 查询站点的关联子站点 (垂向水温、AI 识别) +export function getStInfoByStcd(params: any) { + return request({ + url: '/eng/base/msstbprpt/getStInfoByStcd', + method: 'get', + params + }); +} +// 检查电站是否有专题配置数据 +export function checkPowerStationTopic(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/psbmodulelbb/GetKendoList', + method: 'post', + data + }); +} +// 全景影像 +export function getPanoramaList(data: any) { + return request({ + url: '/eq/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 实时视频 +export function getVideoList(data: any) { + return request({ + url: '/vd/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 录像视频 - 时间查询 +export function getNoLiveVideoYear(data: any) { + return request({ + url: '/vd/GetKendoListCust', + method: 'post', + data + }); +} + +// 录像视频 +export function getNoLiveVideoList(data: any) { + return request({ + url: '/vd/runData/GetKendoListCust', + method: 'post', + data + }); +} + +// 实时视频单个查询 +export function getVideoDetail(data: any) { + return request({ + url: '/vd/GetKendoListCust', + method: 'post', + data + }); +} +// 实时视频 回放 +export function getVideoPlayDetail(data: any) { + return request({ + url: '/vd/runData/GetKendoListCust', + method: 'post', + data + }); +} +// 监测数据 - 电站 +export function getMonitorData(data: any) { + return request({ + url: '/eq/data/GetKendoListCust', + method: 'post', + data + }); +} +// 监测数据 水温查询 栖息地 + +export function getMonitorDataWt(data: any) { + return request({ + url: '/wt/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +export function getMonitorDataWq(data: any) { + return request({ + url: '/wq/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +export function getMonitorDataZq(data: any) { + return request({ + url: '/zq/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 监测数据 - 水温 +export function getMonitorDataWaterTemp(data: any) { + return request({ + url: '/wt/alongDetail/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 监测数据 - 水温 - 查询显示 综合/等温 +export function getMonitorDataWaterTempPowerStation(params: any) { + return request({ + url: '/wt/wtrv/getIoWtrvFlag', + method: 'get', + params + }); +} +// 监测数据 - 水温 - 、综合分析导出数据 +export function exportMonitorDataWaterTempPowerStation(params: any) { + return request({ + url: '/wt/alongDetail/qgc/GetKendoListCust', + method: 'post', + params, + responseType: 'blob' + }); +} + +// 监测数据 - 水温 - 查询是否显示 等温水深 +export function getMonitorDataWaterTempPowerStation2(params: any) { + return request({ + url: '/wt/alongDetail/qgc/stcdCheck2', + method: 'get', + params + }); +} +// 监测数据 - 垂向水温 +export function getMonitorDataWaterTempVertical(data: any) { + return request({ + url: '/wt/cxDetail/GetKendoListCust', + method: 'post', + data + }); +} +// 监测数据 - 水质 判断是否显示综合分析 +export function getMonitorDataWaterQuality(data: any) { + return request({ + url: '/wq/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 监测数据 - 水质 - 获取水质参数 +export function getMonitorDataWaterQualityDetail(data: any) { + return request({ + url: '/wq/stbprp/GetStbprpYsByStcd', + method: 'get', + params: data + }); +} +// 监测数据 - 水质 - 获取水质数据 +export function getMonitorDataWaterQualityList(data: any) { + return request({ + url: '/wq/data/noAuth/GetKendoListCust', + method: 'post', + data + }); +} + +// 生态流量 - 限制范围查询 - 日 +export function getMonitorDataWaterTempVerticalDay(data: any) { + return request({ + url: '/eq/interval/qgc/day/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量 - 限制范围查询 - 小时 +export function getMonitorDataWaterTempVerticalHour(data: any) { + return request({ + url: '/eq/interval/qgc/hour/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量 - 查询限制和来源 +export function getEngLimit(data: any) { + return request({ + url: '/eq/data/getEngLimit', + method: 'post', + data + }); +} + +// 生态流量 - 列表 - 日 +export function getMonitorDataWaterTempVerticalDayList(data: any) { + return request({ + url: '/eq/data/day/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量 - 列表 - 小时 +export function getMonitorDataWaterTempVerticalHourList(data: any) { + return request({ + url: '/eq/data/GetKendoListCust', + method: 'post', + data + }); +} +// 在线监测数据 +export function getMonitorDataOnline(data: any) { + return request({ + url: '/fp/fpssTable/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 没接 +export function getMonitorDataFpq(data: any) { + return request({ + url: '/fp/msstbprpt/GetKendoList', + method: 'post', + data + }); +} + +// 运行状态 +export function getRunState(data: any) { + return request({ + url: '/fp/query/qgc/sdfpssr/GetKendoListCust', + method: 'post', + data + }); +} + +export function getRunStateSecondPlan(data: any) { + return request({ + url: '/fp/run/secondPlan/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 综合分析 + +export function getFishZHFX(data: any) { + return request({ + url: 'fp/run/fish/select', + method: 'post', + data + }); +} +export function getRunStateAnalysis(data: any) { + return request({ + url: '/fp/run/analysis/GetKendoListCust', + method: 'post', + data + }); +} +// ai运行识别 +export function getAIYXSB(data: any) { + return request({ + url: '/fp/msstbprpt/getStInfoByStcd', + method: 'get', + params: data + }); +} +// ai运行识别 视频/表格 +export function getAIComList(data: any) { + return request({ + url: '/warn/ai/com/GetKendoListCust', + method: 'post', + data + }); +} +// ai运行识别 日历 +export function getAIComCalendar(data: any) { + return request({ + url: '/warn/ai/com/qgc/aiRecord/GetKendoListCust', + method: 'post', + data + }); +} +// ai运行 日历点击 +export function getAIComCalendarClick(data: any) { + return request({ + url: '/warn/ai/com/qgc/aiFile/GetKendoListCust', + method: 'post', + data + }); +} + +// 鱼类增殖站 - 运行数据 -获取年 +export function getFishProgressionYear(data: any) { + return request({ + url: '/fb/fbrdmr/getFbRelatedYrByStcd', + method: 'get', + params: data + }); +} +//鱼类增殖站 - 运行数据 -获取鱼 +export function getFishProgressionFish(data: any) { + return request({ + url: '/fp/fishDic/stcd/GetKendoList', + method: 'post', + data + }); +} + +// 过程图 - 亲鱼 +export function getProcessDiagramParentFish(data: any) { + return request({ + url: '/fb/bsmfr/fish/GetKendoListCust', + method: 'post', + data + }); +} + +// 过程图 - 产卵/孵化 +export function getProcessDiagramHatch(data: any, type: 1 | 2) { + return request({ + url: `/fb/fishhatchrecr/fish/GetKendoListCust?type=${type}`, + method: 'post', + data + }); +} + +// 过程图 - 鱼苗 +export function getProcessDiagramFishFry(data: any) { + return request({ + url: '/fb/fishbreedr/fish/GetKendoListCust', + method: 'post', + data + }); +} +//增值放流情况 获取年 +export function getNormalAddedSituationYear(data: any) { + return request({ + url: '/fb/msfbrdm/fbFlData/GetKendoListCust', + method: 'post', + data + }); +} +//增值放流情况 列表 +export function getNormalAddedSituation(data: any) { + return request({ + url: '/fb/msfbrdm/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 科研情况 +export function getNormalResearchSituation(data: any) { + return request({ + url: '/fb/base/researchb/GetKendoList', + method: 'post', + data + }); +} +// 珍稀植物园 - 运行数据 没接 +export function getNormalDataMonitoring2Year(data: any) { + return request({ + url: '/vap/vpr/year/GetKendoListCust', + method: 'post', + data + }); +} +// 珍稀植物园 - 运行数据 列表 +export function getNormalDataMonitoring2List(data: any) { + return request({ + url: '/vap/vpr/basinVpIntDetail', + method: 'post', + data + }); +} +// 珍稀动物园 - 监测数据 时间 +export function getNormal2Year(data: any) { + return request({ + url: '/vap/var/year/GetKendoListCust', + method: 'post', + data + }); +} + +// 珍稀动物园 - 监测数据 列表 没接 +export function getNormal2List(data: any) { + return request({ + url: '/vap/var/GetKendoListCust', + method: 'post', + data + }); +} +// 水生生态调查断面 - 监测数据 年份 没接 +export function getEcologyYear(data: any) { + return request({ + url: '/wte/we/wer/getWeYr', + method: 'get', + params: data + }); +} +// 水生生态调查断面 - 监测数据 调查批次 +export function getEcologyBatch(data: any) { + return request({ + url: '/wte/we/fisht/GetKendoListCust', + method: 'post', + data + }); +} +// 水生生态调查断面 - 监测数据 调查鱼类列表 +export function getEcologyList(data: any) { + return request({ + url: '/wte/we/fisht/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 水生生态调查断面 - 监测数据 水温列表 没接 +export function getEcologyList1(data: any) { + return request({ + url: '/wte/we/wewtr/GetKendoListCust', + method: 'post', + data + }); +} +// 水生生态调查断面 - 监测数据 水质列表 没接 +export function getEcologyList2(data: any) { + return request({ + url: '/wte/we/wewqr/GetKendoListCust', + method: 'post', + data + }); +} + +// 水生生态调查断面 - 监测数据 流速列表 没接 +export function getEcologyList3(data: any) { + return request({ + url: '/wte/we/fvR/GetKendoListCust', + method: 'post', + data + }); +} +// 野生动物检测 -现场录像 - 年份 +export function getLiveFootageYear(data: any) { + return request({ + url: '/wte/wva/default/GetKendoListCust', + method: 'post', + data + }); +} +// 野生动物检测 -现场录像 +export function getLiveFootageList(data: any) { + return request({ + url: '/wte/wva/GetKendoListCust', + method: 'post', + data + }); +} +// 鱼类分布明细 - 年 没接 +export function getFishDistributionYear(data: any) { + return request({ + url: '/wte/we/wer/getWeYr', + method: 'get', + params: data + }); +} +// 鱼类分布明细 - 列表 +export function getFishDistributionList(data: any) { + return request({ + url: '/wte/we/fisht/qgc/GetKendoListCust', + method: 'post', + data + }); +} +// 生态流量泄放设施 - 监测数据 年份 没接 +export function getFlowDischargeYear(data: any) { + return request({ + url: '/eq/operat/default/year', + method: 'post', + data + }); +} +export function getFlowDischargeList(code: string, data: any) { + return request({ + url: `/env/engInfo/stbprpData/GetKendoListCust?tbCode=${code}`, + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/menu/index.ts b/frontend-sjgl/src/api/menu/index.ts new file mode 100644 index 00000000..4611ff30 --- /dev/null +++ b/frontend-sjgl/src/api/menu/index.ts @@ -0,0 +1,159 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MenuQuery, Menu, Resource, MenuForm } from './types'; + +//获取菜单表格 +export function getdata(queryParams:any) { + return request({ + url: '/system/menu/getMenuButtonTree', + method: 'post', + params: queryParams + }); +} +//新增目录 +export function addmenu(queryParams:any) { + return request({ + url: '/system/menu/addMenu', + method: 'post', + data: queryParams + }); +} +//修改目录 +export function editmenu(queryParams:any) { + return request({ + url: '/system/menu/updateById', + method: 'post', + data: queryParams + }); +} +//删除 +export function deltmenu(queryParams:any) { + return request({ + url: '/system/menu/deleteById', + method: 'post', + params: queryParams + }); +} +//排序 +export function moveOrderno(params:any) { + return request({ + url: '/system/menu/changeMenuOrder', + method: 'post', + params: params + }); +} +//上传图标之前获取ID + +//上传单个图标 +export function uploadIcon (data:any) { + return request({ + headers: { + 'Content-Type': 'multipart/form-data' + }, + url: '/system/menu/uploadIcon', + method: 'POST', + data + }); +} +//删除单个图标 +export function moveIcon(params:any) { + return request({ + url: '/system/menu/deleteIcon', + method: 'post', + params: params + }); +} + + +/** + * 获取路由列表 + */ +export function listRoutes() { + return request({ + url: 'system/menu/treeRoutes', + method: 'get', + }); +} + +/** + * 获取菜单表格列表 + * + * @param queryParams + */ +export function listMenus(queryParams: MenuQuery): AxiosPromise { + return request({ + url: '/api/v1/menus', + method: 'get', + params: queryParams + }); +} + +/** + * 获取菜单下拉树形列表 + */ +export function listMenuOptions(): AxiosPromise { + return request({ + url: '/api/v1/menus/options', + method: 'get' + }); +} + +/** + * 获取资源(菜单+权限)树形列表 + */ +export function listResources(): AxiosPromise { + return request({ + url: '/api/v1/menus/resources', + method: 'get' + }); +} + +/** + * 获取菜单详情 + * @param id + */ +export function getMenuDetail(id: string): AxiosPromise { + return request({ + url: '/api/v1/menus/' + id, + method: 'get' + }); +} + +/** + * 添加菜单 + * + * @param data + */ +export function addMenu(data: MenuForm) { + return request({ + url: '/api/v1/menus', + method: 'post', + data: data + }); +} + +/** + * 修改菜单 + * + * @param id + * @param data + */ +export function updateMenu(id: string, data: MenuForm) { + return request({ + url: '/api/v1/menus/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除菜单 + * + * @param ids 菜单ID,多个以英文逗号(,)分割 + */ +export function deleteMenus(ids: string) { + return request({ + url: '/api/v1/menus/' + ids, + method: 'delete' + }); +} diff --git a/frontend-sjgl/src/api/menu/types.ts b/frontend-sjgl/src/api/menu/types.ts new file mode 100644 index 00000000..8de7056c --- /dev/null +++ b/frontend-sjgl/src/api/menu/types.ts @@ -0,0 +1,105 @@ +/** + * 菜单查询参数类型声明 + */ +export interface MenuQuery { + keywords?: string; +} + +/** + * 菜单分页列表项声明 + */ + +export interface Menu { + id?: number; + parentId: number; + type?: string | 'CATEGORY' | 'MENU' | 'EXTLINK'; + createTime: string; + updateTime: string; + name: string; + icon: string; + component: string; + sort: number; + visible: number; + children: Menu[]; +} + +/** + * 菜单表单类型声明 + */ +export interface MenuForm { + /** + * 菜单ID + */ + id?: string; + /** + * 父菜单ID + */ + parentId: string; + /** + * 菜单名称 + */ + name: string; + /** + * 菜单是否可见(1:是;0:否;) + */ + visible: number; + icon?: string; + /** + * 排序 + */ + sort: number; + /** + * 组件路径 + */ + component?: string; + /** + * 路由路径 + */ + path: string; + /** + * 跳转路由路径 + */ + redirect?: string; + + /** + * 菜单类型 + */ + type: string; + + /** + * 权限标识 + */ + perm?: string; +} + +/** + * 资源(菜单+权限)类型 + */ +export interface Resource { + /** + * 菜单值 + */ + value: string; + /** + * 菜单文本 + */ + label: string; + /** + * 子菜单 + */ + children: Resource[]; +} + +/** + * 权限类型 + */ +export interface Permission { + /** + * 权限值 + */ + value: string; + /** + * 权限文本 + */ + label: string; +} diff --git a/frontend-sjgl/src/api/record/index.ts b/frontend-sjgl/src/api/record/index.ts new file mode 100644 index 00000000..9f263b1c --- /dev/null +++ b/frontend-sjgl/src/api/record/index.ts @@ -0,0 +1,18 @@ +import request from '@/utils/request'; + +//获取所有角色 +export function getLogList(params:any){ + return request({ + url: '/system/log/getLogList' , + method: 'post', + params: params + }); +} +export function exportExcel(queryParams: any) { + return request({ + url: '/system/log/exportExcel', + method: 'get', + params: queryParams, + responseType: 'arraybuffer' + }); +} diff --git a/frontend-sjgl/src/api/role/index.ts b/frontend-sjgl/src/api/role/index.ts new file mode 100644 index 00000000..9f106008 --- /dev/null +++ b/frontend-sjgl/src/api/role/index.ts @@ -0,0 +1,196 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { RoleQuery, RoleForm } from './types'; + +//获取所有角色 +export function listRolePages(queryParams:any){ + return request({ + url: '/system/role/list' , + method: 'post', + params:queryParams + }); +} +//角色是否有效 +export function isvaildTo(queryParams:any){ + return request({ + url: '/system/role/setIsvaild' , + method: 'post', + params:queryParams + }); +} +//新增角色 +export function addDept(queryParams:any){ + return request({ + url:'/system/role/addRole' , + method: 'post', + data: queryParams + }); +} +//更新角色信息 +export function renewDept (queryParams:any){ + return request({ + url:'/system/role/updateById' , + method: 'post', + data: queryParams + }); +} +//单个删除角色 +export function deleDept (queryParams:any){ + return request({ + url:'/system/role/deleteById' , + method: 'post', + params: queryParams + }); +} + +//获取分配权限 +export function assignmentPer (queryParams:any){ + return request({ + url:'/system/menu/permissionAssignment' , + method: 'post', + params: queryParams + }); +} +//发出分配权限 +export function setMenuById (queryParams:any){ + return request({ + url:'/system/role/setMenuById' , + method: 'post', + params: queryParams + }); +} +////获取组织范围 +export function setOrgscope (queryParams:any){ + return request({ + url:'/system/organization/getOrgScopeTree' , + method: 'post', + params: queryParams + }); +} +//修改组织范围 +export function postOrgscope (queryParams:any){ + return request({ + url:'/system/role/setOrgscope' , + method: 'post', + params: queryParams + }); +} + + +//删除角色 +// export function delDept(queryParams:any){ +// return request({ +// url:'/system/role/addRole' , +// method: 'post', +// data: queryParams +// }); +// } + +/** + * 获取角色分页数据 + * + * @param queryParam + */ +// export function listRolePages( +// queryParams?: RoleQuery +// ): AxiosPromise { +// return request({ +// url: '/system/role/list', +// method: 'post', +// params: queryParams +// }); +// } + +/** + * 获取角色下拉数据 + * + * @param queryParams + */ +export function listRoleOptions( + queryParams?: RoleQuery +): AxiosPromise { + return request({ + url: '/api/v1/roles/options', + method: 'get', + params: queryParams + }); +} + +/** + * 获取角色拥有的资源ID集合 + * + * @param queryParams + */ +export function getRoleMenuIds(roleId: string): AxiosPromise { + return request({ + url: '/api/v1/roles/' + roleId + '/menuIds', + method: 'get' + }); +} + +/** + * 修改角色资源权限 + * + * @param queryParams + */ +export function updateRoleMenus( + roleId: string, + data: number[] +): AxiosPromise { + return request({ + url: '/api/v1/roles/' + roleId + '/menus', + method: 'put', + data: data + }); +} + +/** + * 获取角色详情 + * + * @param id + */ +export function getRoleDetail(id: number): AxiosPromise { + return request({ + url: '/api/v1/roles/' + id, + method: 'get' + }); +} + +/** + * 添加角色 + * + * @param data + */ +export function addRole(data: RoleForm) { + return request({ + url: '/api/v1/roles', + method: 'post', + data: data + }); +} + +/** + * 更新角色 + * + * @param id + * @param data + */ +export function updateRole(id: number, data: RoleForm) { + return request({ + url: '/api/v1/roles/' + id, + method: 'put', + data: data + }); +} + +/** + * 批量删除角色,多个以英文逗号(,)分割 + * + * @param ids + */ +export function deleteRoles(ids: string) { + return request({ + url: '/api/v1/roles/' + ids, + method: 'delete' + }); +} diff --git a/frontend-sjgl/src/api/role/types.ts b/frontend-sjgl/src/api/role/types.ts new file mode 100644 index 00000000..798d34a7 --- /dev/null +++ b/frontend-sjgl/src/api/role/types.ts @@ -0,0 +1,47 @@ +/** + * 角色查询参数类型 + */ +interface PageQuery { + pageIndex: number; + pageSize: number; +} +export interface RoleQuery extends PageQuery { + keywords?: string; +} +interface PageResult { + total: number; + list: T[]; +} +/** + * 角色分页列表项 + */ +export interface Role { + id: string; + name: string; + code: string; + sort: number; + status: number; + deleted: number; + menuIds?: any; + permissionIds?: any; +} + +/** + * 角色分页项类型 + */ +export type RolePageResult = PageResult; + +/** + * 角色表单 + */ +export interface RoleForm { + id?: number; + name: string; + code: string; + sort: number; + status: number; + /** + * 数据权限 + */ + dataScope: number; +} diff --git a/frontend-sjgl/src/api/select/index.ts b/frontend-sjgl/src/api/select/index.ts new file mode 100644 index 00000000..e8a3581b --- /dev/null +++ b/frontend-sjgl/src/api/select/index.ts @@ -0,0 +1,132 @@ +import request from '@/utils/request'; +//水电基地数据获取 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/env/hydrobase/wbsb/GetKendoList', + method: 'post', + data + }); +} + +// 基地下拉列表 +export function getBaseDropdown(data: any) { + return request({ + url: '/env/hydrobase/dropdown', + method: 'get', + data + }); +} +// 流域下拉列表 +export function getSelectForDropdown(data: any) { + return request({ + // url: '/env/rvcd/selectForDropdown', + url: '/env/rvcd/selectRvcdDropdown', + method: 'get', + data + }); +} +// 所在河段下拉列表 +export function getRvcdDropdown(params: any) { + return request({ + url: '/env/rvcd/selectForDropdown', + method: 'get', + params: params + }); +} +//电站下拉列表 +export function getEngInfoDropdown(data: any) { + return request({ + url: '/env/engInfo/dropdown', + method: 'post', + data + }); +} +// 根据河段获取电站 +export function getByRvcd(data: any) { + return request({ + url: '/env/engInfo/getByRvcd', + method: 'get', + params:data + }); +} +// 根据id获取电站信息 +export function getEngInfoById(params: any) { + return request({ + url: '/env/engInfo/getById', + method: 'get', + params + }); +} +// 所在位置下拉列表 +export function getAddvcdDropdown(data: any) { + return request({ + url: '/env/addvcd/selectForDropdown', + method: 'post', + data + }); +} +// 重新验证并更新行数据 +export function revalidateAndUpdateRow(data: any) { + return request({ + url: '/data/fishDraft/revalidateAndUpdateRow', + method: 'post', + data + }); +} +// 删除 行数据 +export function deleteRowById(data: any) { + return request({ + url: '/data/fishDraft/deleteRowById', + method: 'post', + data + }); +} + +//过鱼设施下拉列表 +export function getFpssDropdown(params: any) { + return request({ + url: '/env/fpss/dropdown', + method: 'get', + params + }); +} +//鱼类名称下拉列表 +export function getFishDictoryDropdown() { + return request({ + url: '/env/fishDictory/listByName', + method: 'get' + }); +} +// 类似鱼类名称下拉列表 +export function getSimilarFishDictoryDropdown(params: any) { + return request({ + url: '/env/fishDictory/similar', + method: 'get', + params + }); +} +// 上传文件 +export function uploadFile(data: any) { + return request({ + url: import.meta.env.VITE_APP_ATTACHMENT_URL + '/upload', + method: 'post', + data, + headers: { 'Content-Type': 'multipart/form-data' } + }); +} +// 所在位置下拉列表 +export function getAddvcdDropdownByRvcd(data: any = {}) { + return request({ + url: '/base/msalongb/noAuth/GetKendoList', + method: 'post', + data + }); +} +//沿程配置下拉列表 +export function noAuthGetKendoPage(data: any = {}) { + return request({ + url: '/base/msalongb/noAuth/GetKendoPage', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/shengPiJiLu/index.ts b/frontend-sjgl/src/api/shengPiJiLu/index.ts new file mode 100644 index 00000000..70203136 --- /dev/null +++ b/frontend-sjgl/src/api/shengPiJiLu/index.ts @@ -0,0 +1,45 @@ +import request from '@/utils/request'; + +export function queryPageList(queryParams:any){ + return request({ + url: '/data/approvalMain/queryPageList' , + method: 'post', + data:queryParams + }); +} + +// 查询审批操作日志列表 +export function getApprovalLogList(params: any) { + return request({ + url: '/data/approvalLog/queryPageList', + method: 'post', + data: params + }); +} + +// 查询审批变更记录列表 +export function getApprovalChangeLogList(params: any) { + return request({ + url: '/data/approvalChangeLog/queryPageList', + method: 'post', + data: params + }); +} + +// 批量审批 +export function batchApproveByApprovalId(data: any) { + return request({ + url: '/data/fishDraft/batchApproveByApprovalId', + method: 'post', + data + }); +} + +// 批量驳回 +export function batchReject(data: { approvalIds: string[], rejectReason: string }) { + return request({ + url: '/data/fishDraft/batchReject', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/shiPinJianKong/index.ts b/frontend-sjgl/src/api/shiPinJianKong/index.ts new file mode 100644 index 00000000..dbb59dac --- /dev/null +++ b/frontend-sjgl/src/api/shiPinJianKong/index.ts @@ -0,0 +1,25 @@ +import request from '@/utils/request'; +// 顶部tabs +export function baseMsstbprpt(data: any) { + return request({ + url: '/vd/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 实时视频 +export function envVdTreeGetKendoListCust(data: any) { + return request({ + url: '/vd/tree/GetKendoListCust', + method: 'post', + data + }); +} +// 录像 +export function envVdRunDataGetKendoList(data: any) { + return request({ + url: '/vd/runData/GetKendoListCust', + method: 'post', + data + }); +} diff --git a/frontend-sjgl/src/api/sw/index.ts b/frontend-sjgl/src/api/sw/index.ts new file mode 100644 index 00000000..b8fe2449 --- /dev/null +++ b/frontend-sjgl/src/api/sw/index.ts @@ -0,0 +1,154 @@ +import request from '@/utils/request'; +export function getKendoListCust(data: any) { + return request({ + url: '/wt/alongList/qgc/GetKendoListCust', + method: 'post', + data + }); +} +//获取水温下拉框 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/wt/wbsb/GetKendoList', + method: 'post', + data + }); +} +/** + * 获取垂向水温变化树形站点数据 + * @param data 请求参数 + * @returns Promise + */ +export function getChuiXiangShuiWenTreeStcd(data: any) { + return request({ + url: '/wt/sdrvwts/default/treeStcd', + method: 'post', + data, + }); +} + +/** + * 获取垂向水温变化列表数据(按月份聚合) + * @param data 请求参数 { filter, sort } + * @returns Promise + */ +export function getCxswList(data: any) { + return request({ + url: '/wt/dzCxList/GetKendoListCust', + method: 'post', + data + }); +} +//获取出入库水温下拉选则树 +export function getVmsstbprpt(data: any) { + return request({ + url: '/eq/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +//出入库水温图表数据 +// +export function inOutOneGetKendoListCust(data: any) { + return request({ + url: '/wt/inOutOne/GetKendoListCust', + method: 'post', + data + }); +} +//水温监测工作开展情况 +export function baseEvnmAutoMonitorGetKendoListCust(data: any) { + return request({ + url: '/wt/evnmAutoMonitor/GetKendoListCust', + method: 'post', + data + }); +} +////水温监测工作开展情况弹框 +export function vmsstbprptGetKendoList(data: any) { + return request({ + url: '/wt/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +//出入库水温打开弹框api/wmp-env-server/sw/inOutOne/details +export function inOutOneDetails(data: any) { + return request({ + url: '/wt/inOutOne/details', + method: 'post', + data + }); +} +//鱼类适宜性分析 - select +export function infoGetKendoListCust(data: any) { + return request({ + url: '/wt/wtrv/fish/info/GetKendoListCust', + method: 'post', + data + }); +} +//鱼类适宜性分析-图表和table +export function fishGetKendoListCust(data: any) { + return request({ + url: '/wt/wtrv/fish/GetKendoListCust', + method: 'post', + data + }); +} +//月平均水温历史对比 +export function avgMonGetKendoListCust(data: any) { + return request({ + url: '/wt/monthList/avgMon/GetKendoListCust', + method: 'post', + data + }); +} +//水温年内分布 +export function yearListGetKendoListCust(data: any) { + return request({ + url: '/wt/yearList/GetKendoListCust', + method: 'post', + data + }); +} +//设施类型介绍 +export function sttpbGetKendoList(data: any) { + return request({ + url: '/wt/sttpb/GetKendoList', + method: 'post', + data + }); +} +//设施类型及接入情况 +export function dwInfoGetKendoListCust(data: any) { + return request({ + url: '/wt/dwInfo/GetKendoListCust', + method: 'post', + data + }); +} +//月均水温对比,图表,表格 +export function DetGetKendoListCust(data: any) { + return request({ + url: '/wt/monthDetail/Det/GetKendoListCust', + method: 'post', + data + }); +} +//水温年内分布 +export function yearDetailGetKendoListCust(data: any) { + return request({ + url: '/wt/yearDetail/GetKendoListCust', + method: 'post', + data + }); +} +//获取建设状态 +export function dictgetRemoteDictValue(data: any) { + return request({ + url: '/wt/usm/v1/dict/getRemoteDictValue', + method: 'get', + params: data + }); +} diff --git a/frontend-sjgl/src/api/system/alertRules/index.ts b/frontend-sjgl/src/api/system/alertRules/index.ts new file mode 100644 index 00000000..5c0eea78 --- /dev/null +++ b/frontend-sjgl/src/api/system/alertRules/index.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request'; + +// 获取所有倾斜摄影 +export function warnruleGetKendoList(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/warn/rule/GetKendoList', + method: 'post', + data: data + }); +} +//预警类型下拉框 //水质等级下拉框 +export function dictGetRemoteDictValue(data: any) { + return request({ + url: '/api/dec-modules-usm-springcloud-starter/usm/v1/dict/getRemoteDictValue', + method: 'get', + params: data + }); +} +//新增修改获取相关输入数据 +export function ruleysList(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/warn/rule/ysList', + method: 'post', + data: data + }); +} diff --git a/frontend-sjgl/src/api/system/disposeManage/index.ts b/frontend-sjgl/src/api/system/disposeManage/index.ts new file mode 100644 index 00000000..3b3d9a01 --- /dev/null +++ b/frontend-sjgl/src/api/system/disposeManage/index.ts @@ -0,0 +1,50 @@ +import request from '@/utils/request'; + +// 飞行路径 +export function threedroambGetKendoListCust(data: any) { + return request({ + url: '/threedroamb/GetKendoListCust', + method: 'post', + data: data + }); +} +export function threedroambsave(data: any) { + return request({ + url: '/threedroamb/save', + method: 'post', + data: data + }); +} +export function threedroambdelete(data: any) { + return request({ + url: '/threedroamb/delete', + method: 'get', + params: data + }); +} +//根据id查询弹窗 +export function threedroambGetKendoById(data: any) { + return request({ + url: '/threedroamb/getThreedRoamDetails', + method: 'get', + params: data + }); +} +// 导入接口 +export function threedroambimport(data: FormData) { + return request({ + url: '/threedroamb/import', + method: 'post', + data: data, + headers: { 'Content-Type': 'multipart/form-data' } + }); +} +// 导出模板 +export function threedroambexport(data: any) { + return request({ + url: '/threedroamb/export', + method: 'post', + data: data, + responseType: 'blob' + }); +} \ No newline at end of file diff --git a/frontend-sjgl/src/api/system/map/ConfigManagement/index.ts b/frontend-sjgl/src/api/system/map/ConfigManagement/index.ts new file mode 100644 index 00000000..d8ebc4ff --- /dev/null +++ b/frontend-sjgl/src/api/system/map/ConfigManagement/index.ts @@ -0,0 +1,59 @@ +import request from '@/utils/request'; + +// 获取所有沿程配置数据 +export function getAllConfigTree(data: any) { + return request({ + url: '/base/msalongb/GetKendoList', + method: 'post', + data: data + }); +} +// 保存沿程配置 +export function saveBaseWbsb(data: any) { + return request({ + url: '/base/msalongb/save', + method: 'post', + data: data + }); +} +// 删除沿程配置 +export function deleteBaseWbsb(data: any) { + return request({ + url: '/base/msalongb/delete', + method: 'post', + data + }); +} +// 保存沿程配置子节点 +export function saveBaseWbsbChild(data: any) { + return request({ + url: '/base/msalongb/save', + method: 'post', + data: data + }); +} +// 查询子节点 +export function getChildConfigTree(data: any) { + return request({ + url: '/base/msalongdetb/GetKendoList', + method: 'post', + data: data + }); +} + +// 保存子节点 +export function saveBaseWbsbChildDetail(data: any) { + return request({ + url: '/base/msalongdetb/save', + method: 'post', + data: data + }); +} +//站点类型下拉框 +export function sttpGetKendoList(data: any) { + return request({ + url: '/base/msalongb/sttp/GetKendoList', + method: 'post', + data: data + }); +} diff --git a/frontend-sjgl/src/api/system/map/LayerManagement/index.ts b/frontend-sjgl/src/api/system/map/LayerManagement/index.ts new file mode 100644 index 00000000..76e02bce --- /dev/null +++ b/frontend-sjgl/src/api/system/map/LayerManagement/index.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request'; + +// 获取所有地图 图层树 +export function getAllMapLayerTree(data: any) { + return request({ + url: '/mapLayer/getAllMapLayerTree', + method: 'post', + data: data + }); +} +// 保存地图 图层 +export function saveMapLayer(data: any) { + return request({ + url: '/mapLayer/save', + method: 'post', + data: data + }); +} +// 删除地图 图层 +export function deleteMapLayer(data: any) { + return request({ + url: '/mapLayer/delete', + method: 'post', + data: data + }); +} diff --git a/frontend-sjgl/src/api/system/map/LegendStructure/index.ts b/frontend-sjgl/src/api/system/map/LegendStructure/index.ts new file mode 100644 index 00000000..8889a8af --- /dev/null +++ b/frontend-sjgl/src/api/system/map/LegendStructure/index.ts @@ -0,0 +1,60 @@ +import request from '@/utils/request'; + +// 获取所有地图 图例树 +export function getAllMapLegendTree(data: any) { + return request({ + url: '/mapLegend/GetKendoList', + method: 'post', + data: data + }); +} +// 选中配置 列表 +export function getAllMapLegendModuleTree(data: any) { + return request({ + url: '/mapmodule/GetKendoList', + method: 'post', + data: data + }); +} +// 选中配置 新增 +export function saveMapLegendModule(data: any) { + return request({ + url: '/mapmodule/save', + method: 'post', + data: data + }); +} +// 选中配置 删除 +export function deleteMapLegendModule(data: any) { + return request({ + url: '/mapmodule/delete', + method: 'post', + data: data + }); +} + +// 保存地图 图例 +export function saveMapLegend(data: any) { + return request({ + url: '/mapLegend/save', + method: 'post', + data: data + }); +} +// 删除地图 图例 +export function deleteMapLegend(data: any) { + return request({ + url: '/mapLegend/delete', + method: 'post', + data: data + }); +} + +// 获取所有地图 图例树 +export function getAllMapLegendParentIdTree(data: any) { + return request({ + url: '/mapLegend/getAllMapLegendTree', + method: 'get', + params: data + }); +} diff --git a/frontend-sjgl/src/api/system/map/TiltPhotoManagement/index.ts b/frontend-sjgl/src/api/system/map/TiltPhotoManagement/index.ts new file mode 100644 index 00000000..b88ee4ed --- /dev/null +++ b/frontend-sjgl/src/api/system/map/TiltPhotoManagement/index.ts @@ -0,0 +1,34 @@ +import request from '@/utils/request'; + +// 获取倾斜摄影 列表 +export function getListTiltPhotoTree(data: any) { + return request({ + url: '/sys/oblique/GetKendoListCust', + method: 'post', + data: data + }); +} +// 获取所有倾斜摄影 +export function getAllTiltPhotoTree(data: any) { + return request({ + url: '/overview/vmsstbprpt/GetKendoList', + method: 'post', + data: data + }); +} +// 保存倾斜摄影 +export function saveTiltPhoto(data: any) { + return request({ + url: '/sys/oblique/addOrUpdate', + method: 'post', + data: data + }); +} +// 删除倾斜摄影 +export function deleteTiltPhoto(data: any) { + return request({ + url: '/sys/oblique/delete', + method: 'get', + params: data + }); +} diff --git a/frontend-sjgl/src/api/system/map/pushManagement/index.ts b/frontend-sjgl/src/api/system/map/pushManagement/index.ts new file mode 100644 index 00000000..f6f3b6ae --- /dev/null +++ b/frontend-sjgl/src/api/system/map/pushManagement/index.ts @@ -0,0 +1,100 @@ +import request from '@/utils/request'; + +// 获取列表 +export function getPushConfigList(data: any) { + return request({ + url: '/system/pushConfig/getPushConfigList', + method: 'post', + data + }); +} +//新增推送配置 +export function addPushConfig(data: any) { + return request({ + url: '/system/pushConfig/addPushConfig', + method: 'post', + data + }); +} + +//修改新增配置 +export function deletePushConfig(data: any) { + return request({ + url: '/system/pushConfig/deletePushConfig', + method: 'post', + data + }); +} +//删除新增配置 +export function updatePushConfig(data: any) { + return request({ + url: '/system/pushConfig/updatePushConfig', + method: 'post', + data + }); +} +//推送目标配置 --用户 +export function queryUsersList(data: any) { + return request({ + url: '/system/pushConfig/queryUsersList', + method: 'get', + params:data + }); +} +//推送目标配置 -- 角色 +export function queryRolesList(data: any) { + return request({ + url: '/system/pushConfig/queryRolesList', + method: 'get', + params:data + }); +} +//查询推送目标 +export function getPushTargets(data: any) { + return request({ + url: '/system/pushConfig/getPushTargets', + method: 'get', + params:data + }); +} +//新增推送目标 +export function savePushTargets(data: any) { + return request({ + url: '/system/pushConfig/savePushTargets', + method: 'post', + data + }); +} +//短信提醒状态修改 +export function setPushConfigSmsSwitch(data: any) { + return request({ + url: '/system/pushConfig/setPushConfigSmsSwitch', + method: 'post', + params:data + }); +} +//获取推送历史列表 +export function postPushHistoryList(data: any) { + return request({ + url: '/system/pushConfig/postPushHistoryList', + method: 'post', + data + }); +} + +//推送情况 +export function getPushHistoryDetailList(data: any) { + return request({ + url: '/system/pushConfig/getPushHistoryDetailList', + method: 'post', + data + }); +} +//s数量 +export function getPushHistoryDetailById(data: any) { + return request({ + url: '/system/pushConfig/getPushHistoryDetailById', + method: 'get', + params:data + }); +} \ No newline at end of file diff --git a/frontend-sjgl/src/api/user/index.ts b/frontend-sjgl/src/api/user/index.ts new file mode 100644 index 00000000..29bbef41 --- /dev/null +++ b/frontend-sjgl/src/api/user/index.ts @@ -0,0 +1,279 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { UserForm, UserInfo, UserPageResult, UserQuery } from './types'; +//获取企业树 数据 +export function getTreelist(queryParams:any) { + return request({ + url: '/system/organization/getOrgTree', + method: 'POST', + params: queryParams + }); +} +//获取用户列表信息 +export function gettableData(queryParams:any) { + return request({ + url: '/system/user/queryUsers', + method: 'get', + params: queryParams + }); +} +// 审核用户列表 +export function queryPendingAuditUsers(queryParams:any) { + return request({ + url: '/system/user/queryPendingAuditUsers', + method: 'get', + params: queryParams + }); +} +//用户-禁用,启用 +export function DataStatus (queryParams:any) { + return request({ + url: '/system/user/setStatus', + method: 'POST', + params: queryParams + }); +} +//删除用户 +export function deltableData (queryParams:any) { + return request({ + url: '/system/user/deleteById', + method: 'POST', + params: queryParams + }); +} +//批量删除 +export function delChoise (queryParams:any) { + return request({ + url: '/system/user/deleteUserByIds', + method: 'POST', + params: queryParams + }); +} +//获取角色 +export function getRole (queryParams:any) { + return request({ + url: '/system/role/list', + method: 'POST', + params: queryParams + }); +} +//新建用户 +export function addUsers (queryParams:any,roleids:any) { + return request({ + url: '/system/user/addUser?'+'roleids='+roleids, + method: 'POST', + data: queryParams, + }); +} +//更改用户 +export function updataUser (queryParams:any,roleids:any) { + return request({ + url: '/system/user/updateUser?'+'roleids='+roleids, + method: 'POST', + data: queryParams, + }); +} +//更改用户 +export function updatePersonalInfo (queryParams:any) { + return request({ + url: '/user/updatePersonalInfo', + method: 'POST', + data: queryParams, + }); +} +//更改头像 +export function updateAvatar (data:any) { + return request({ + headers: { + 'Content-Type': 'multipart/form-data' + }, + url: '/system/user/updateAvatar', + method: 'POST', + data + }); +} + + +//重置密码 +export function setpass (queryParams:any) { + return request({ + url: '/system/user/resetPassword', + method: 'POST', + params: queryParams, + }); +} + +export function updatePassword (queryParams:any) { + return request({ + url: '/user/updatePassword', + method: 'GET', + params: queryParams, + }); +} +//获取过鱼设施权限树 +export function getFishtree(queryParams:any) { + return request({ + url: '/env/tree/rvcdEng', + method: 'get', + params: queryParams + }); +} +//保存权限 +export function saveFishqvan(queryParams:any) { + return request({ + url: '/data/userDataScope/batchAdd', + method: 'post', + data: queryParams + }); +} +//查询用户有效权限 +export function getuserdata(queryParams:any) { + return request({ + url: '/data/userDataScope/getValidPermissions', + method: 'get', + params: queryParams + }); +} + +// 审计用户(审批通过/驳回) +export function auditUser(data: any) { + return request({ + url: '/system/user/auditUser', + method: 'post', + data + }); +} + +/** + * 登录成功后获取用户信息(昵称、头像、权限集合和角色集合) + */ +export function getUserInfo(): AxiosPromise { + return request({ + url: '/user/me', + method: 'get' + }); +} + +/** + * 获取用户分页列表 + * + * @param queryParams + */ +export function listUserPages( + queryParams: UserQuery +): AxiosPromise { + return request({ + url: '/api/v1/users/pages', + method: 'get', + params: queryParams + }); +} + +/** + * 获取用户表单详情 + * + * @param userId + */ +export function getUserForm(userId: number): AxiosPromise { + return request({ + url: '/api/v1/users/' + userId + '/form', + method: 'get' + }); +} + +/** + * 添加用户 + * + * @param data + */ +export function addUser(data: any) { + return request({ + url: '/api/v1/users', + method: 'post', + data: data + }); +} + +/** + * 修改用户 + * + * @param id + * @param data + */ +export function updateUser(id: number, data: UserForm) { + return request({ + url: '/api/v1/users/' + id, + method: 'put', + data: data + }); +} + +/** + * 修改用户状态 + * + * @param id + * @param status + */ +export function updateUserStatus(id: number, status: number) { + return request({ + url: '/api/v1/users/' + id + '/status', + method: 'patch', + params: { status: status } + }); +} + +/** + * 修改用户密码 + * + * @param id + * @param password + */ +export function updateUserPassword(id: number, password: string) { + return request({ + url: '/api/v1/users/' + id + '/password', + method: 'patch', + params: { password: password } + }); +} + +/** + * 删除用户 + * + * @param ids + */ +export function deleteUsers(ids: string) { + return request({ + url: '/api/v1/users/' + ids, + method: 'delete' + }); +} + +/** + * 下载用户导入模板 + * + * @returns + */ +export function downloadTemplate() { + return request({ + url: '/api/v1/users/template', + method: 'get', + responseType: 'arraybuffer' + }); +} + +/** + * 导出用户 + * + * @param queryParams + * @returns + */ +export function exportUser(queryParams: UserQuery) { + return request({ + url: '/api/v1/users/_export', + method: 'get', + params: queryParams, + responseType: 'arraybuffer' + }); +} + + diff --git a/frontend-sjgl/src/api/user/types.ts b/frontend-sjgl/src/api/user/types.ts new file mode 100644 index 00000000..8190d041 --- /dev/null +++ b/frontend-sjgl/src/api/user/types.ts @@ -0,0 +1,75 @@ +/** + * 登录用户信息 + */ +export interface UserInfo { + permissions: string[]; + userInfo: any; + nickname: string; + avatar: string; + roles: string[]; + perms: string[]; +} +/** + * 用户查询参数 + */ +export interface PageQuery { + keywords: string; + status: number; + deptId: number; +} +export interface UserQuery extends PageQuery { + keywords: string; + status: number; + deptId: number; +} + +/** + * 用户分页列表项声明 + */ +export interface UserType { + id: string; + username: string; + nickname: string; + mobile: string; + gender: number; + avatar: string; + email: string; + status: number; + deptName: string; + roleNames: string; + createTime: string; +} + +interface PageResult { + total: number; + list: T[]; +} +/** + * 用户分页项类型声明 + */ +export type UserPageResult = PageResult; + +/** + * 用户表单类型声明 + */ +export interface UserForm { + id: number | undefined; + deptId: number; + username: string; + nickname: string; + password: string; + mobile: string; + email: string; + gender: number; + status: number; + remark: string; + roleIds: number[]; +} + +/** + * 用户导入表单类型声明 + */ +export interface UserImportData { + deptId: number; + roleIds: number[]; +} diff --git a/frontend-sjgl/src/assets/MenuIcon/czan_xz.png b/frontend-sjgl/src/assets/MenuIcon/czan_xz.png new file mode 100644 index 00000000..fe03405e Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/czan_xz.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sq.png b/frontend-sjgl/src/assets/MenuIcon/dh_sq.png new file mode 100644 index 00000000..adf9805a Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sq.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sq1.png b/frontend-sjgl/src/assets/MenuIcon/dh_sq1.png new file mode 100644 index 00000000..57e15141 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sq1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sy.png b/frontend-sjgl/src/assets/MenuIcon/dh_sy.png new file mode 100644 index 00000000..248c5903 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sy.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sy1.png b/frontend-sjgl/src/assets/MenuIcon/dh_sy1.png new file mode 100644 index 00000000..d092df73 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sy1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sz.png b/frontend-sjgl/src/assets/MenuIcon/dh_sz.png new file mode 100644 index 00000000..5fc1f6f0 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sz.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_sz1.png b/frontend-sjgl/src/assets/MenuIcon/dh_sz1.png new file mode 100644 index 00000000..1a13ddd9 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_sz1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_xm.png b/frontend-sjgl/src/assets/MenuIcon/dh_xm.png new file mode 100644 index 00000000..a750b022 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_xm.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_xm1.png b/frontend-sjgl/src/assets/MenuIcon/dh_xm1.png new file mode 100644 index 00000000..aead610e Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_xm1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_xx.png b/frontend-sjgl/src/assets/MenuIcon/dh_xx.png new file mode 100644 index 00000000..1fb61804 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_xx.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/dh_xx1.png b/frontend-sjgl/src/assets/MenuIcon/dh_xx1.png new file mode 100644 index 00000000..535abe1a Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/dh_xx1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/gb.png b/frontend-sjgl/src/assets/MenuIcon/gb.png new file mode 100644 index 00000000..b276de27 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/gb.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/grzx_tx.png b/frontend-sjgl/src/assets/MenuIcon/grzx_tx.png new file mode 100644 index 00000000..0f21833b Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/grzx_tx.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/grzx_xg.png b/frontend-sjgl/src/assets/MenuIcon/grzx_xg.png new file mode 100644 index 00000000..d6c8977a Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/grzx_xg.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/jscz_rl.png b/frontend-sjgl/src/assets/MenuIcon/jscz_rl.png new file mode 100644 index 00000000..22a323d0 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/jscz_rl.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/jscz_sc.png b/frontend-sjgl/src/assets/MenuIcon/jscz_sc.png new file mode 100644 index 00000000..674cf09f Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/jscz_sc.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/jscz_sc1.png b/frontend-sjgl/src/assets/MenuIcon/jscz_sc1.png new file mode 100644 index 00000000..cf2e0ca5 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/jscz_sc1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/jscz_scdc.png b/frontend-sjgl/src/assets/MenuIcon/jscz_scdc.png new file mode 100644 index 00000000..f47a2366 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/jscz_scdc.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/jscz_xz.png b/frontend-sjgl/src/assets/MenuIcon/jscz_xz.png new file mode 100644 index 00000000..8b2a892e Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/jscz_xz.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_an.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_an.png new file mode 100644 index 00000000..3177fafc Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_an.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_an1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_an1.png new file mode 100644 index 00000000..81e544c9 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_an1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_cd.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_cd.png new file mode 100644 index 00000000..25b8ecc2 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_cd.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_cd1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_cd1.png new file mode 100644 index 00000000..19aaa855 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_cd1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_czmm.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_czmm.png new file mode 100644 index 00000000..8f5b131c Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_czmm.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_jt.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_jt.png new file mode 100644 index 00000000..68620fbc Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_jt.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_jt1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_jt1.png new file mode 100644 index 00000000..b36fe61e Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_jt1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_qx.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_qx.png new file mode 100644 index 00000000..dd4d05e9 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_qx.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_sc.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc.png new file mode 100644 index 00000000..2ca9d72d Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_sc1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc1.png new file mode 100644 index 00000000..c831998d Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_sc2.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc2.png new file mode 100644 index 00000000..95ebdb6a Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_sc2.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_td.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_td.png new file mode 100644 index 00000000..54ebc819 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_td.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_td1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_td1.png new file mode 100644 index 00000000..3e5b329f Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_td1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_td2.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_td2.png new file mode 100644 index 00000000..6d0a88c4 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_td2.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_xg.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg.png new file mode 100644 index 00000000..05339137 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_xg1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg1.png new file mode 100644 index 00000000..0548fbcd Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_xg2.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg2.png new file mode 100644 index 00000000..ed5a1461 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_xg2.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_zml.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_zml.png new file mode 100644 index 00000000..b3528688 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_zml.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_zml1.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_zml1.png new file mode 100644 index 00000000..618b4290 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_zml1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_zyw.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_zyw.png new file mode 100644 index 00000000..76e14d15 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_zyw.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/lbcz_zz.png b/frontend-sjgl/src/assets/MenuIcon/lbcz_zz.png new file mode 100644 index 00000000..36eb52a2 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/lbcz_zz.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/top_qp.png b/frontend-sjgl/src/assets/MenuIcon/top_qp.png new file mode 100644 index 00000000..14ce318e Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/top_qp.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/top_qp1.png b/frontend-sjgl/src/assets/MenuIcon/top_qp1.png new file mode 100644 index 00000000..dda0cc9f Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/top_qp1.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/top_ss.png b/frontend-sjgl/src/assets/MenuIcon/top_ss.png new file mode 100644 index 00000000..f053c8bc Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/top_ss.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/top_tx.png b/frontend-sjgl/src/assets/MenuIcon/top_tx.png new file mode 100644 index 00000000..dc301d37 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/top_tx.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/top_zh.png b/frontend-sjgl/src/assets/MenuIcon/top_zh.png new file mode 100644 index 00000000..79f945d3 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/top_zh.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/ts.png b/frontend-sjgl/src/assets/MenuIcon/ts.png new file mode 100644 index 00000000..f5787ca4 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/ts.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u117_mouseOver.png b/frontend-sjgl/src/assets/MenuIcon/u117_mouseOver.png new file mode 100644 index 00000000..1d65625f Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u117_mouseOver.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u119.png b/frontend-sjgl/src/assets/MenuIcon/u119.png new file mode 100644 index 00000000..1520447d Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u119.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u241.png b/frontend-sjgl/src/assets/MenuIcon/u241.png new file mode 100644 index 00000000..250a19fc Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u241.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u343.png b/frontend-sjgl/src/assets/MenuIcon/u343.png new file mode 100644 index 00000000..36eb52a2 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u343.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u697.png b/frontend-sjgl/src/assets/MenuIcon/u697.png new file mode 100644 index 00000000..e0b432b9 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u697.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/u81.png b/frontend-sjgl/src/assets/MenuIcon/u81.png new file mode 100644 index 00000000..5fc1f6f0 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/u81.png differ diff --git a/frontend-sjgl/src/assets/MenuIcon/xqing.png b/frontend-sjgl/src/assets/MenuIcon/xqing.png new file mode 100644 index 00000000..d54255b6 Binary files /dev/null and b/frontend-sjgl/src/assets/MenuIcon/xqing.png differ diff --git a/frontend-sjgl/src/assets/components/arrow-down.png b/frontend-sjgl/src/assets/components/arrow-down.png new file mode 100644 index 00000000..5fb79e27 Binary files /dev/null and b/frontend-sjgl/src/assets/components/arrow-down.png differ diff --git a/frontend-sjgl/src/assets/components/arrow-left.png b/frontend-sjgl/src/assets/components/arrow-left.png new file mode 100644 index 00000000..36006be8 Binary files /dev/null and b/frontend-sjgl/src/assets/components/arrow-left.png differ diff --git a/frontend-sjgl/src/assets/components/arrow-right.png b/frontend-sjgl/src/assets/components/arrow-right.png new file mode 100644 index 00000000..dea156f6 Binary files /dev/null and b/frontend-sjgl/src/assets/components/arrow-right.png differ diff --git a/frontend-sjgl/src/assets/components/arrow-up.png b/frontend-sjgl/src/assets/components/arrow-up.png new file mode 100644 index 00000000..d5425e1a Binary files /dev/null and b/frontend-sjgl/src/assets/components/arrow-up.png differ diff --git a/frontend-sjgl/src/assets/components/bg-toggle.e1dabcf3.svg b/frontend-sjgl/src/assets/components/bg-toggle.e1dabcf3.svg new file mode 100644 index 00000000..072df1fd --- /dev/null +++ b/frontend-sjgl/src/assets/components/bg-toggle.e1dabcf3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/components/bg_sjtb.png b/frontend-sjgl/src/assets/components/bg_sjtb.png new file mode 100644 index 00000000..69170125 Binary files /dev/null and b/frontend-sjgl/src/assets/components/bg_sjtb.png differ diff --git a/frontend-sjgl/src/assets/components/fgx.svg b/frontend-sjgl/src/assets/components/fgx.svg new file mode 100644 index 00000000..f634805c --- /dev/null +++ b/frontend-sjgl/src/assets/components/fgx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/components/fish.png b/frontend-sjgl/src/assets/components/fish.png new file mode 100644 index 00000000..f163892d Binary files /dev/null and b/frontend-sjgl/src/assets/components/fish.png differ diff --git a/frontend-sjgl/src/assets/components/guoyu.png b/frontend-sjgl/src/assets/components/guoyu.png new file mode 100644 index 00000000..4a0666a0 Binary files /dev/null and b/frontend-sjgl/src/assets/components/guoyu.png differ diff --git a/frontend-sjgl/src/assets/components/shenpibohui.png b/frontend-sjgl/src/assets/components/shenpibohui.png new file mode 100644 index 00000000..28147e67 Binary files /dev/null and b/frontend-sjgl/src/assets/components/shenpibohui.png differ diff --git a/frontend-sjgl/src/assets/components/shenpitongguo.png b/frontend-sjgl/src/assets/components/shenpitongguo.png new file mode 100644 index 00000000..de9621cf Binary files /dev/null and b/frontend-sjgl/src/assets/components/shenpitongguo.png differ diff --git a/frontend-sjgl/src/assets/components/tishi.png b/frontend-sjgl/src/assets/components/tishi.png new file mode 100644 index 00000000..caf0338a Binary files /dev/null and b/frontend-sjgl/src/assets/components/tishi.png differ diff --git a/frontend-sjgl/src/assets/components/tishi1.png b/frontend-sjgl/src/assets/components/tishi1.png new file mode 100644 index 00000000..1f02d5e0 Binary files /dev/null and b/frontend-sjgl/src/assets/components/tishi1.png differ diff --git a/frontend-sjgl/src/assets/icons/advert.svg b/frontend-sjgl/src/assets/icons/advert.svg new file mode 100644 index 00000000..5adcf437 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/advert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/brand.svg b/frontend-sjgl/src/assets/icons/brand.svg new file mode 100644 index 00000000..e4b7ceee --- /dev/null +++ b/frontend-sjgl/src/assets/icons/brand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/bug.svg b/frontend-sjgl/src/assets/icons/bug.svg new file mode 100644 index 00000000..05a150dc --- /dev/null +++ b/frontend-sjgl/src/assets/icons/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/cascader.svg b/frontend-sjgl/src/assets/icons/cascader.svg new file mode 100644 index 00000000..e256024f --- /dev/null +++ b/frontend-sjgl/src/assets/icons/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/chart.svg b/frontend-sjgl/src/assets/icons/chart.svg new file mode 100644 index 00000000..27728fb0 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/client.svg b/frontend-sjgl/src/assets/icons/client.svg new file mode 100644 index 00000000..ad4bc15a --- /dev/null +++ b/frontend-sjgl/src/assets/icons/client.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/close.svg b/frontend-sjgl/src/assets/icons/close.svg new file mode 100644 index 00000000..5b5057f2 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/close_all.svg b/frontend-sjgl/src/assets/icons/close_all.svg new file mode 100644 index 00000000..aa13cd75 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/close_all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/close_left.svg b/frontend-sjgl/src/assets/icons/close_left.svg new file mode 100644 index 00000000..e5708ea5 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/close_left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/close_other.svg b/frontend-sjgl/src/assets/icons/close_other.svg new file mode 100644 index 00000000..212e6c28 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/close_other.svg @@ -0,0 +1 @@ + diff --git a/frontend-sjgl/src/assets/icons/close_right.svg b/frontend-sjgl/src/assets/icons/close_right.svg new file mode 100644 index 00000000..14d3cf39 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/close_right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/coupon.svg b/frontend-sjgl/src/assets/icons/coupon.svg new file mode 100644 index 00000000..2f952b24 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/coupon.svg @@ -0,0 +1 @@ + diff --git a/frontend-sjgl/src/assets/icons/dashboard.svg b/frontend-sjgl/src/assets/icons/dashboard.svg new file mode 100644 index 00000000..5317d370 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/dict.svg b/frontend-sjgl/src/assets/icons/dict.svg new file mode 100644 index 00000000..22a82781 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/dict.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/frontend-sjgl/src/assets/icons/dict_item.svg b/frontend-sjgl/src/assets/icons/dict_item.svg new file mode 100644 index 00000000..903109a7 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/dict_item.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/frontend-sjgl/src/assets/icons/download.svg b/frontend-sjgl/src/assets/icons/download.svg new file mode 100644 index 00000000..c8969513 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/drag.svg b/frontend-sjgl/src/assets/icons/drag.svg new file mode 100644 index 00000000..4185d3ce --- /dev/null +++ b/frontend-sjgl/src/assets/icons/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/edit.svg b/frontend-sjgl/src/assets/icons/edit.svg new file mode 100644 index 00000000..d26101f2 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/exit-fullscreen.svg b/frontend-sjgl/src/assets/icons/exit-fullscreen.svg new file mode 100644 index 00000000..485c128b --- /dev/null +++ b/frontend-sjgl/src/assets/icons/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/eye-open.svg b/frontend-sjgl/src/assets/icons/eye-open.svg new file mode 100644 index 00000000..88dcc98e --- /dev/null +++ b/frontend-sjgl/src/assets/icons/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/eye.svg b/frontend-sjgl/src/assets/icons/eye.svg new file mode 100644 index 00000000..16ed2d87 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/fishxz.7410ec88.svg b/frontend-sjgl/src/assets/icons/fishxz.7410ec88.svg new file mode 100644 index 00000000..8b9f4232 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/fishxz.7410ec88.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/fullscreen.svg b/frontend-sjgl/src/assets/icons/fullscreen.svg new file mode 100644 index 00000000..0e86b6fa --- /dev/null +++ b/frontend-sjgl/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/github.svg b/frontend-sjgl/src/assets/icons/github.svg new file mode 100644 index 00000000..db0a0d43 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/goods-list.svg b/frontend-sjgl/src/assets/icons/goods-list.svg new file mode 100644 index 00000000..fcb971ed --- /dev/null +++ b/frontend-sjgl/src/assets/icons/goods-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/goods.svg b/frontend-sjgl/src/assets/icons/goods.svg new file mode 100644 index 00000000..60c1c734 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/gth.svg b/frontend-sjgl/src/assets/icons/gth.svg new file mode 100644 index 00000000..d756cbfc --- /dev/null +++ b/frontend-sjgl/src/assets/icons/gth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/guide.svg b/frontend-sjgl/src/assets/icons/guide.svg new file mode 100644 index 00000000..b2710017 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/homepage.svg b/frontend-sjgl/src/assets/icons/homepage.svg new file mode 100644 index 00000000..48f4e249 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/homepage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/lab.svg b/frontend-sjgl/src/assets/icons/lab.svg new file mode 100644 index 00000000..d4d60aac --- /dev/null +++ b/frontend-sjgl/src/assets/icons/lab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/language.svg b/frontend-sjgl/src/assets/icons/language.svg new file mode 100644 index 00000000..0082b577 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/link.svg b/frontend-sjgl/src/assets/icons/link.svg new file mode 100644 index 00000000..d3f9e5a9 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/locationIcon.png b/frontend-sjgl/src/assets/icons/locationIcon.png new file mode 100644 index 00000000..fc01013d Binary files /dev/null and b/frontend-sjgl/src/assets/icons/locationIcon.png differ diff --git a/frontend-sjgl/src/assets/icons/menu.svg b/frontend-sjgl/src/assets/icons/menu.svg new file mode 100644 index 00000000..92c364c2 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/menuActiveBg.svg b/frontend-sjgl/src/assets/icons/menuActiveBg.svg new file mode 100644 index 00000000..2f80e83f --- /dev/null +++ b/frontend-sjgl/src/assets/icons/menuActiveBg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/message.svg b/frontend-sjgl/src/assets/icons/message.svg new file mode 100644 index 00000000..ea1ddef1 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/money.svg b/frontend-sjgl/src/assets/icons/money.svg new file mode 100644 index 00000000..60f7acf4 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/monitor.svg b/frontend-sjgl/src/assets/icons/monitor.svg new file mode 100644 index 00000000..bc308cb0 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/nested.svg b/frontend-sjgl/src/assets/icons/nested.svg new file mode 100644 index 00000000..06713a86 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/number.svg b/frontend-sjgl/src/assets/icons/number.svg new file mode 100644 index 00000000..ad5ce9af --- /dev/null +++ b/frontend-sjgl/src/assets/icons/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/order.svg b/frontend-sjgl/src/assets/icons/order.svg new file mode 100644 index 00000000..8f2107ec --- /dev/null +++ b/frontend-sjgl/src/assets/icons/order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/password.svg b/frontend-sjgl/src/assets/icons/password.svg new file mode 100644 index 00000000..6c64defe --- /dev/null +++ b/frontend-sjgl/src/assets/icons/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/peoples.svg b/frontend-sjgl/src/assets/icons/peoples.svg new file mode 100644 index 00000000..383b82d2 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/perm.svg b/frontend-sjgl/src/assets/icons/perm.svg new file mode 100644 index 00000000..b38d0657 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/perm.svg @@ -0,0 +1 @@ + diff --git a/frontend-sjgl/src/assets/icons/publish.svg b/frontend-sjgl/src/assets/icons/publish.svg new file mode 100644 index 00000000..e9b489c3 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/qq.svg b/frontend-sjgl/src/assets/icons/qq.svg new file mode 100644 index 00000000..98da3953 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/qq.svg @@ -0,0 +1 @@ + diff --git a/frontend-sjgl/src/assets/icons/rabbitmq.svg b/frontend-sjgl/src/assets/icons/rabbitmq.svg new file mode 100644 index 00000000..65aa1985 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/rabbitmq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/rate.svg b/frontend-sjgl/src/assets/icons/rate.svg new file mode 100644 index 00000000..aa3b14d7 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/redis.svg b/frontend-sjgl/src/assets/icons/redis.svg new file mode 100644 index 00000000..2f1d62df --- /dev/null +++ b/frontend-sjgl/src/assets/icons/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/refresh.svg b/frontend-sjgl/src/assets/icons/refresh.svg new file mode 100644 index 00000000..1f549f1a --- /dev/null +++ b/frontend-sjgl/src/assets/icons/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/role.svg b/frontend-sjgl/src/assets/icons/role.svg new file mode 100644 index 00000000..c484b137 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/security.svg b/frontend-sjgl/src/assets/icons/security.svg new file mode 100644 index 00000000..bcd9d2e6 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/shopping.svg b/frontend-sjgl/src/assets/icons/shopping.svg new file mode 100644 index 00000000..8d2b4bf9 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/size.svg b/frontend-sjgl/src/assets/icons/size.svg new file mode 100644 index 00000000..ddb25b8d --- /dev/null +++ b/frontend-sjgl/src/assets/icons/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/skill.svg b/frontend-sjgl/src/assets/icons/skill.svg new file mode 100644 index 00000000..a3b73121 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/system.svg b/frontend-sjgl/src/assets/icons/system.svg new file mode 100644 index 00000000..63feb20a --- /dev/null +++ b/frontend-sjgl/src/assets/icons/system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/theme.svg b/frontend-sjgl/src/assets/icons/theme.svg new file mode 100644 index 00000000..5982a2f7 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/tree.svg b/frontend-sjgl/src/assets/icons/tree.svg new file mode 100644 index 00000000..d40a414d --- /dev/null +++ b/frontend-sjgl/src/assets/icons/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/user.svg b/frontend-sjgl/src/assets/icons/user.svg new file mode 100644 index 00000000..e4c7b389 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/uv.svg b/frontend-sjgl/src/assets/icons/uv.svg new file mode 100644 index 00000000..ca4c3012 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/uv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/icons/valid_code.svg b/frontend-sjgl/src/assets/icons/valid_code.svg new file mode 100644 index 00000000..39bf4783 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/valid_code.svg @@ -0,0 +1,9 @@ + + + + diff --git a/frontend-sjgl/src/assets/icons/wechat.svg b/frontend-sjgl/src/assets/icons/wechat.svg new file mode 100644 index 00000000..35de4bc3 --- /dev/null +++ b/frontend-sjgl/src/assets/icons/wechat.svg @@ -0,0 +1 @@ + diff --git a/frontend-sjgl/src/assets/images/bg_sjtb.png b/frontend-sjgl/src/assets/images/bg_sjtb.png new file mode 100644 index 00000000..69170125 Binary files /dev/null and b/frontend-sjgl/src/assets/images/bg_sjtb.png differ diff --git a/frontend-sjgl/src/assets/images/fish_survey_liang.png b/frontend-sjgl/src/assets/images/fish_survey_liang.png new file mode 100644 index 00000000..d81b210f Binary files /dev/null and b/frontend-sjgl/src/assets/images/fish_survey_liang.png differ diff --git a/frontend-sjgl/src/assets/images/fish_survey_shu.png b/frontend-sjgl/src/assets/images/fish_survey_shu.png new file mode 100644 index 00000000..df6bdd5b Binary files /dev/null and b/frontend-sjgl/src/assets/images/fish_survey_shu.png differ diff --git a/frontend-sjgl/src/assets/images/fish_survey_zhong.png b/frontend-sjgl/src/assets/images/fish_survey_zhong.png new file mode 100644 index 00000000..3b85578d Binary files /dev/null and b/frontend-sjgl/src/assets/images/fish_survey_zhong.png differ diff --git a/frontend-sjgl/src/assets/images/linefeed.png b/frontend-sjgl/src/assets/images/linefeed.png new file mode 100644 index 00000000..54ebc819 Binary files /dev/null and b/frontend-sjgl/src/assets/images/linefeed.png differ diff --git a/frontend-sjgl/src/assets/images/login-bg.jpg b/frontend-sjgl/src/assets/images/login-bg.jpg new file mode 100644 index 00000000..d96649c4 Binary files /dev/null and b/frontend-sjgl/src/assets/images/login-bg.jpg differ diff --git a/frontend-sjgl/src/assets/images/logo.png b/frontend-sjgl/src/assets/images/logo.png new file mode 100644 index 00000000..127fda24 Binary files /dev/null and b/frontend-sjgl/src/assets/images/logo.png differ diff --git a/frontend-sjgl/src/assets/images/map-dixingtu.png b/frontend-sjgl/src/assets/images/map-dixingtu.png new file mode 100644 index 00000000..bc1969bf Binary files /dev/null and b/frontend-sjgl/src/assets/images/map-dixingtu.png differ diff --git a/frontend-sjgl/src/assets/images/map-shiliangtu.png b/frontend-sjgl/src/assets/images/map-shiliangtu.png new file mode 100644 index 00000000..6cb6bd12 Binary files /dev/null and b/frontend-sjgl/src/assets/images/map-shiliangtu.png differ diff --git a/frontend-sjgl/src/assets/images/map-yingxiangtu.png b/frontend-sjgl/src/assets/images/map-yingxiangtu.png new file mode 100644 index 00000000..c8204b1f Binary files /dev/null and b/frontend-sjgl/src/assets/images/map-yingxiangtu.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/bottom.png b/frontend-sjgl/src/assets/images/mapTip/bottom.png new file mode 100644 index 00000000..5dbe5f75 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/bottom.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/bottom@175.png b/frontend-sjgl/src/assets/images/mapTip/bottom@175.png new file mode 100644 index 00000000..a05589c4 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/bottom@175.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/bottom@215.png b/frontend-sjgl/src/assets/images/mapTip/bottom@215.png new file mode 100644 index 00000000..1b9ef190 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/bottom@215.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/bottom@260.png b/frontend-sjgl/src/assets/images/mapTip/bottom@260.png new file mode 100644 index 00000000..518f4e31 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/bottom@260.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/center.png b/frontend-sjgl/src/assets/images/mapTip/center.png new file mode 100644 index 00000000..e811ce15 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/center.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/center@175.png b/frontend-sjgl/src/assets/images/mapTip/center@175.png new file mode 100644 index 00000000..a72fd5da Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/center@175.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/center@215.png b/frontend-sjgl/src/assets/images/mapTip/center@215.png new file mode 100644 index 00000000..31049dfe Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/center@215.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/center@260.png b/frontend-sjgl/src/assets/images/mapTip/center@260.png new file mode 100644 index 00000000..c3b74caf Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/center@260.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/map-dxsdzGuihuaNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzGuihuaNetMonitor.svg new file mode 100644 index 00000000..af6811e6 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzGuihuaNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-dxsdzGuihuaNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/map-dxsdzYijianNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzYijianNetMonitor.svg new file mode 100644 index 00000000..c60e1e96 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzYijianNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-dxsdzYijianNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/map-dxsdzZaijianNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzZaijianNetMonitor.svg new file mode 100644 index 00000000..65054561 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-dxsdzZaijianNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-dxsdzZaijianNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/map-yingxiangtu1.png b/frontend-sjgl/src/assets/images/mapTip/map-yingxiangtu1.png new file mode 100644 index 00000000..39e3e801 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/map-yingxiangtu1.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/map-zxsdzGuihuaNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzGuihuaNetMonitor.svg new file mode 100644 index 00000000..6881f561 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzGuihuaNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-zxsdzGuihuaNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/map-zxsdzYijianNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzYijianNetMonitor.svg new file mode 100644 index 00000000..d22a2462 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzYijianNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-zxsdzYijianNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/map-zxsdzZaijianNetMonitor.svg b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzZaijianNetMonitor.svg new file mode 100644 index 00000000..c0928d79 --- /dev/null +++ b/frontend-sjgl/src/assets/images/mapTip/map-zxsdzZaijianNetMonitor.svg @@ -0,0 +1,14 @@ + + + map-zxsdzZaijianNetMonitor + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/images/mapTip/top.png b/frontend-sjgl/src/assets/images/mapTip/top.png new file mode 100644 index 00000000..6084df7f Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/top.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/top@175.png b/frontend-sjgl/src/assets/images/mapTip/top@175.png new file mode 100644 index 00000000..4b0d0495 Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/top@175.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/top@215.png b/frontend-sjgl/src/assets/images/mapTip/top@215.png new file mode 100644 index 00000000..4980f6dc Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/top@215.png differ diff --git a/frontend-sjgl/src/assets/images/mapTip/top@260.png b/frontend-sjgl/src/assets/images/mapTip/top@260.png new file mode 100644 index 00000000..9c489f4c Binary files /dev/null and b/frontend-sjgl/src/assets/images/mapTip/top@260.png differ diff --git a/frontend-sjgl/src/assets/images/nineSections-dixing.png b/frontend-sjgl/src/assets/images/nineSections-dixing.png new file mode 100644 index 00000000..f39453ca Binary files /dev/null and b/frontend-sjgl/src/assets/images/nineSections-dixing.png differ diff --git a/frontend-sjgl/src/assets/images/nineSections-shiliang.png b/frontend-sjgl/src/assets/images/nineSections-shiliang.png new file mode 100644 index 00000000..767d2373 Binary files /dev/null and b/frontend-sjgl/src/assets/images/nineSections-shiliang.png differ diff --git a/frontend-sjgl/src/assets/images/nineSections-yingxiang.png b/frontend-sjgl/src/assets/images/nineSections-yingxiang.png new file mode 100644 index 00000000..1a785430 Binary files /dev/null and b/frontend-sjgl/src/assets/images/nineSections-yingxiang.png differ diff --git a/frontend-sjgl/src/assets/images/videFm.jpg b/frontend-sjgl/src/assets/images/videFm.jpg new file mode 100644 index 00000000..76f2eadd Binary files /dev/null and b/frontend-sjgl/src/assets/images/videFm.jpg differ diff --git a/frontend-sjgl/src/assets/svg/diwenshuijianhuan.svg b/frontend-sjgl/src/assets/svg/diwenshuijianhuan.svg new file mode 100644 index 00000000..334378b6 --- /dev/null +++ b/frontend-sjgl/src/assets/svg/diwenshuijianhuan.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/guojiashuiwenzhan.svg b/frontend-sjgl/src/assets/svg/guojiashuiwenzhan.svg new file mode 100644 index 00000000..ac788c8e --- /dev/null +++ b/frontend-sjgl/src/assets/svg/guojiashuiwenzhan.svg @@ -0,0 +1,16 @@ + + + guojiashuiwenzhan + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/guojiashuizhizhan.svg b/frontend-sjgl/src/assets/svg/guojiashuizhizhan.svg new file mode 100644 index 00000000..8244b65f --- /dev/null +++ b/frontend-sjgl/src/assets/svg/guojiashuizhizhan.svg @@ -0,0 +1,13 @@ + + + guojiashuizhizhan + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/liuliangjiancezhan.svg b/frontend-sjgl/src/assets/svg/liuliangjiancezhan.svg new file mode 100644 index 00000000..8575ff7b --- /dev/null +++ b/frontend-sjgl/src/assets/svg/liuliangjiancezhan.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/qixiangzhan.svg b/frontend-sjgl/src/assets/svg/qixiangzhan.svg new file mode 100644 index 00000000..35374b96 --- /dev/null +++ b/frontend-sjgl/src/assets/svg/qixiangzhan.svg @@ -0,0 +1,16 @@ + + + qixiangzhan + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/qixidi.svg b/frontend-sjgl/src/assets/svg/qixidi.svg new file mode 100644 index 00000000..ea3b599c --- /dev/null +++ b/frontend-sjgl/src/assets/svg/qixidi.svg @@ -0,0 +1,9 @@ + + + qixidi + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/shipinjiankongshebei.svg b/frontend-sjgl/src/assets/svg/shipinjiankongshebei.svg new file mode 100644 index 00000000..74cbd7ce --- /dev/null +++ b/frontend-sjgl/src/assets/svg/shipinjiankongshebei.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/shuizhijiancezhan.svg b/frontend-sjgl/src/assets/svg/shuizhijiancezhan.svg new file mode 100644 index 00000000..0925a2c4 --- /dev/null +++ b/frontend-sjgl/src/assets/svg/shuizhijiancezhan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/zengzhizhanshuizhizhan.svg b/frontend-sjgl/src/assets/svg/zengzhizhanshuizhizhan.svg new file mode 100644 index 00000000..7632b476 --- /dev/null +++ b/frontend-sjgl/src/assets/svg/zengzhizhanshuizhizhan.svg @@ -0,0 +1,9 @@ + + + zengzhizhanshuizhizhan + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/assets/svg/zijianshuiwenzhan.svg b/frontend-sjgl/src/assets/svg/zijianshuiwenzhan.svg new file mode 100644 index 00000000..9114c677 --- /dev/null +++ b/frontend-sjgl/src/assets/svg/zijianshuiwenzhan.svg @@ -0,0 +1,16 @@ + + + zijianshuiwenzhan + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components.d.ts b/frontend-sjgl/src/components.d.ts new file mode 100644 index 00000000..94e8b829 --- /dev/null +++ b/frontend-sjgl/src/components.d.ts @@ -0,0 +1,9 @@ +// 全局组件类型声明 +import Pagination from '@/components/Pagination/index.vue'; + +declare module '@vue/runtime-core' { + export interface GlobalComponents { + Pagination: typeof Pagination; + } +} +export {}; diff --git a/frontend-sjgl/src/components/BasicSearch/index.vue b/frontend-sjgl/src/components/BasicSearch/index.vue new file mode 100644 index 00000000..1df4f7c2 --- /dev/null +++ b/frontend-sjgl/src/components/BasicSearch/index.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/frontend-sjgl/src/components/BasicTable/index.vue b/frontend-sjgl/src/components/BasicTable/index.vue new file mode 100644 index 00000000..716cc092 --- /dev/null +++ b/frontend-sjgl/src/components/BasicTable/index.vue @@ -0,0 +1,749 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/column.config.ts b/frontend-sjgl/src/components/MapModal/column.config.ts new file mode 100644 index 00000000..f40cef4d --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/column.config.ts @@ -0,0 +1,4982 @@ +//ModalTab详细信息弹框列的配置 + +// 电站基础信息 +const BasicColumns: Array = [ + { + key: 'a4d3b02a466677324278a9a153fb4adb', + name: '概述', + filed: 'a4d3b02a466677324278a9a153fb4adb', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: '72B97BE77AB64444A961EF184BCE776F', + name: '电站名称', + filed: 'ennm', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '拉西瓦' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '基地', + filed: 'baseName', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '黄河上游干流' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '所在位置', + filed: 'addvcdName', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'input', + url: '', + value: '共和县,贵南县' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '详细地址', + filed: 'stlc', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'input', + url: '', + value: '青海省贵德县、青海省贵南', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '所在河段', + filed: 'hbrvcdName', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '黄河干流上游', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '所属公司', + filed: 'hynm', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '青海黄河上游水电开发有限责任公司' + }, + { + key: '1CE83818DA304429BEBA965DBACE2FE0', + name: '所属集团', + filed: 'topHynm', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '国家电投集团' + }, + { + key: '2950C68264BF494B9C5E1748569D026C', + name: '坝址经度(°)', + filed: 'lgtd', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'number', + toFixed: 6, + url: '', + unitConfig: ['Other', 'LGTD'], + value: '101.184969', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '70423E92994B4620A73BA6DCF3861669', + name: '坝址纬度(°)', + filed: 'lttd', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'number', + toFixed: 6, + url: '', + unitConfig: ['Other', 'LTTD'], + value: '36.070816', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '3EAC90E681014714A32E425A7C691D7D', + name: '建设状态', + filed: 'bldsttCcodeName', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'select', + url: '', + value: '已建' + }, + { + key: '3EAC90E681014714A32E425A7C691D7D', + name: '建设时间', + filed: 'jcdt', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'date', + format: 'YYYY-MM-DD', + url: '', + value: '2010-08-01' + }, + { + key: 'D77E04DF590342959214F8ACD4D3ECC1', + name: '第一台机组投产时间', + filed: 'piodt', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'date', + format: 'YYYY-MM-DD', + url: '', + value: '2009-04-01', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '68C8F7DD279F4A33A1D3EE23243F1C33', + name: '全部机组投产时间', + filed: 'aiodt', + visible: true, + ruleTips: 'a4d3b02a466677324278a9a153fb4adb', + type: 'date', + format: 'YYYY-MM-DD', + url: '', + value: '2009-04-15' + }, + { + name: '', + filed: '', + visible: true, + type: '' + }, + { + key: '17bccbfa812362fa403c0bed06e58d0d', + name: '水文', + filed: '17bccbfa812362fa403c0bed06e58d0d', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: 'B0C630EAA8E54FE68A0163D7ACD71983', + name: '坝址以上流域面积(km²)', + filed: 'nrupar', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 2, + url: '', + value: '132160.00' + }, + { + key: '955B3BC9DAE24965AB0C08482519AF06', + name: '距河源距离(km)', + filed: 'dstcrvr', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 2, + url: '', + value: '32.80' + }, + { + key: '6E07FD8EC9A145A686317C3A07A897B9', + name: '多年平均降雨量(mm)', + filed: 'avyrp', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 2, + url: '', + value: '259.00' + }, + { + key: '80376049D8D94894B687C583CE376EFA', + name: '多年平均年径流量(亿m³)', + filed: 'avw', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '208' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC61', + name: '多年平均流量(m³/s)', + filed: 'avq', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '660', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC62', + name: '1月多年平均流量(m³/s)', + filed: 'avq01', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '495' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC63', + name: '2月多年平均流量(m³/s)', + filed: 'avq02', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '438' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC64', + name: '3月多年平均流量(m³/s)', + filed: 'avq03', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '524' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC65', + name: '4月多年平均流量(m³/s)', + filed: 'avq04', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '674' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC66', + name: '5月多年平均流量(m³/s)', + filed: 'avq05', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '781' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC67', + name: '6月多年平均流量(m³/s)', + filed: 'avq06', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '826' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC68', + name: '7月多年平均流量(m³/s)', + filed: 'avq07', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '1004' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC69', + name: '8月多年平均流量(m³/s)', + filed: 'avq08', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '975' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC70', + name: '9月多年平均流量(m³/s)', + filed: 'avq09', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '783' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC71', + name: '10月多年平均流量(m³/s)', + filed: 'avq10', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '698' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC72', + name: '11月多年平均流量(m³/s)', + filed: 'avq11', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '624' + }, + { + key: '403300B4F41549E09A3F8D5F7610CC73', + name: '12月多年平均流量(m³/s)', + filed: 'avq12', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + toFixed: 0, + url: '', + value: '547' + }, + { + key: '0B1B33B4C6E24C02B843AC3EBED456E3', + name: '实测最大流量(m³/s)', + filed: 'obmxq', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '4900' + }, + { + key: '68681C3323A6477888D53EF248A93E69', + name: '实测最小流量(m³/s)', + filed: 'obmnq', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '92' + }, + { + key: '9B17D694765240C5A4A92858B4D2B5CE', + name: '调查历史最大流量(m³/s)', + filed: 'hmxq', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '6300' + }, + { + key: 'A3EEB5D482B24B939744FFF9C2BDEB7B', + name: '设计入库洪水流量(m³/s)', + filed: 'dsnfqfrq', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '4250' + }, + { + key: 'c4a678e3da7f474f858d3f54dbf03d78', + name: '设计洪水重现期(年)', + filed: 'dsrcin', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'input', + url: '', + value: '1000', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'EEDCC9BB01CA4E689E6D568D214B8A02', + name: '校核入库洪水流量(m³/s)', + filed: 'ckfqfqr', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '6310' + }, + { + key: '3cb4538327ca4472815a4410a19b8bfb', + name: '校核洪水重现期(年)', + filed: 'chrcin', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'input', + url: '', + value: '5000', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '111D74CBAAC440AF8CC52F6F180EDB12', + name: '实测最大洪量(三天)(亿m³)', + filed: 'obmxw3', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '59' + }, + { + key: '6D75D094E0374FCC846624B04C4F53A1', + name: '设计洪量(三天)(亿m³)', + filed: 'dsw3', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '71' + }, + { + key: 'DF1CD1709E464C55B26531CD7A8E5034', + name: '校核洪量(三天)(亿m³)', + filed: 'ckw3', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '82' + }, + { + key: 'A86F9510EC804536A967A57747B57AA5', + name: '多年平均输沙量(万t)', + filed: 'avsd', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '102' + }, + { + key: 'C2C7C34AAEB945178EE10C241DFB311B', + name: '多年平均含沙量(kg/m³)', + filed: 'avs', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '0' + }, + { + key: '8784E8C676C04C19B456DFF4DE831C1D', + name: '实测最大含沙量(kg/m³)', + filed: 'obmxs', + visible: true, + ruleTips: '17bccbfa812362fa403c0bed06e58d0d', + type: 'number', + url: '', + value: '117' + }, + { + key: '1b2c05e5ad59d6dda928317fac64a490', + name: '水库', + filed: '1b2c05e5ad59d6dda928317fac64a490', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: 'E3FD7C1ACCC84EEBAB017EAF807EEDD5', + name: '校核洪水位(m)', + filed: 'ckflz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '2457.00' + }, + { + key: '6146A4A36B454DA4BFE4910739F69C93', + name: '设计洪水位(m)', + filed: 'dsflz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '2452.00' + }, + { + key: 'AA4EF70648BF44A3929FF64D3CFCFDE1', + name: '正常蓄水位(m)', + filed: 'normz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '2452.00', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '31E54152BE924B07B27A12FBE8D46C00', + name: '防洪高水位(m)', + filed: 'uzfc', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '2452.00' + }, + { + key: 'C7179D8F029546478C17A61E157823C1', + name: '防洪限制水位(m)', + filed: 'fsltdz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '-' + }, + { + key: '53D370FA41344467B3BAF95A6C69E263', + name: '年消落水位(m)', + filed: 'ydownz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '-' + }, + { + key: 'E550041810614850BB1DF15EA2711499', + name: '死水位(m)', + filed: 'ddz', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '2440.00', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'D682B174871D4B6D9484978E24E9C0BF', + name: '正常蓄水位水库面积(km²)', + filed: 'nrzar', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '13.00' + }, + { + key: 'A6F751FA185C4573851431CF9ADD00B1', + name: '回水长度(km)', + filed: 'bcklen', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '32.80' + }, + { + key: '766B432F01154EA1971FCFBB858DB4F8', + name: '总库容(亿m³)', + filed: 'ttcp', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + toFixed: 2, + url: '', + value: '10.79', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'C4BA9EA14F25470CA45EBBB57CBFCB26', + name: '正常蓄水位以下库容(亿m³)', + filed: 'nmzcp', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + url: '', + value: '10' + }, + { + key: 'F6178CC33A2F41579E15F7453484657A', + name: '防洪库容(亿m³)', + filed: 'fldcp', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + url: '', + value: '-' + }, + { + key: 'D3682105F25C4CEFA46AE657908F553B', + name: '调节库容(亿m³)', + filed: 'actcp', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + url: '', + value: '2', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '5F4E514E8BE94C83B83E0349110AB65C', + name: '死库容(亿m³)', + filed: 'ddcp', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + url: '', + value: '9' + }, + { + key: '6BD119F2EE554E3A97703E2AA7B2CFEE', + name: '库容系数(%)', + filed: 'cpsc', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'number', + url: '', + value: '1' + }, + { + key: '5144864F346A4429BF900CC356088BFD', + name: '调节性能', + filed: 'rgcpName', + visible: true, + ruleTips: '1b2c05e5ad59d6dda928317fac64a490', + type: 'select', + url: '', + value: '日调节', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'b06aaa1411e77fa50d181687829fcabf', + name: '下泄流量及相应下游水位', + filed: 'b06aaa1411e77fa50d181687829fcabf', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: '4C1681794D05410E80CCB6A5FA12C7F9', + name: '设计洪水位时最大下泄流量(m³/s)', + filed: 'dsflzmxq', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '4250' + }, + { + key: 'F7A1359F103B4B3690D85088548C4D79', + name: '设计洪水位时最大下泄流量相应下游水位(m)', + filed: 'dsflzxyz', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '2244' + }, + { + key: 'B4EB16357CCB4CD4A0CDBD3BE0049AAF', + name: '校核洪水位时最大下泄流量(m³/s)', + filed: 'ckflzmxq', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '6310' + }, + { + key: '857610E46FB440038101CD0C3412CDF2', + name: '校核洪水位时最大下泄流量相应下游水位(m)', + filed: 'ckflzxyz', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '2247' + }, + { + key: '6660B967FFFF4CE699E0B1253C80B7DA', + name: '枯水期调节流量(m³/s)', + filed: 'ksqadjq', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '-' + }, + { + key: '67016E170F27489EAAB3532C6621351D', + name: '枯水期调节流量相应下游水位(m)', + filed: 'ksqxyz', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '-' + }, + { + key: '44D7D057E84446B488CD96990DD5089A', + name: '发电最大引用流量(m³/s)', + filed: 'gemaxrq', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '-' + }, + { + key: '6BB95D0165684E9EB3E425268A45277E', + name: '发电最大引用流量相应下游水位(m)', + filed: 'mxgeqxyz', + visible: true, + ruleTips: 'b06aaa1411e77fa50d181687829fcabf', + type: 'number', + url: '', + value: '2240' + }, + { + key: '6f8386f3b948dbf3a3507611c2e2f777', + name: '工程效益指标', + filed: '6f8386f3b948dbf3a3507611c2e2f777', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: 'A3872CE4C88B46EF8F4D407F59E5CB98', + name: '装机容量(万kW)', + filed: 'ttpwr', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + toFixed: 2, + url: '', + unitConfig: ['Other', 'ZJRL'], + value: '420.00', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'A0C8FE7AB24747C383EECBBA0F1C4FD9', + name: '装机台数(台)', + filed: 'gncnt', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + url: '', + value: '6', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '575AAC99880C479B948ABE38EA0603DC', + name: '容量构成(台*MW)', + filed: 'gntp', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'input', + url: '', + value: '6*700' + }, + { + key: 'FE01484725814B89A4C2C155EFC2ED53', + name: '保证出力(MW)', + filed: 'grntpwr', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + toFixed: 2, + url: '', + value: '99.00' + }, + { + key: '08E626F3271745CD84ECB9CC2C9FE1D0', + name: '多年平均年发电量(亿kW·h)', + filed: 'yrge', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + url: '', + value: '102', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'ED9678BE10CD44E68F00D1497880FC0A', + name: '年利用小时数(h)', + filed: 'ushr', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + url: '', + value: '2430' + }, + { + key: '35DD75EACA0C4454B1FB11BEB0A6CB3C', + name: '机组综合出力系数', + filed: 'k', + visible: true, + ruleTips: '6f8386f3b948dbf3a3507611c2e2f777', + type: 'number', + url: '', + value: '9' + }, + { + name: '', + filed: '', + visible: true, + type: '' + }, + { + key: 'd085d8361a89374da7a301690c1be32f', + name: '大坝', + filed: 'd085d8361a89374da7a301690c1be32f', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: '8C39E0D195944439B85E18ABA5F1DB04', + name: '坝型', + filed: 'dmtp', + visible: true, + ruleTips: 'd085d8361a89374da7a301690c1be32f', + type: 'select', + url: '', + value: '对数螺旋双曲拱坝', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: 'A62C7BB814A345699D9AB29DFBE2509E', + name: '坝顶高程(m)', + filed: 'dmcrel', + visible: true, + ruleTips: 'd085d8361a89374da7a301690c1be32f', + type: 'number', + toFixed: 2, + url: '', + value: '2460.00' + }, + { + key: '5C8284B23C794F7CAD2D36363420B520', + name: '最大坝高(m)', + filed: 'mxdmhg', + visible: true, + ruleTips: 'd085d8361a89374da7a301690c1be32f', + type: 'number', + toFixed: 2, + url: '', + value: '250.00', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + }, + { + key: '5B14BAC64C094489A8F78F36A9301AC3', + name: '坝顶长度(m)', + filed: 'dmlen', + visible: true, + ruleTips: 'd085d8361a89374da7a301690c1be32f', + type: 'number', + toFixed: 2, + url: '', + value: '466.40' + }, + { + key: '0d98c74797e49d00bcc4c17c9d557a2b', + name: '其他', + filed: '0d98c74797e49d00bcc4c17c9d557a2b', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + key: '44A80DC39F6845AF837D0E707549E5E3', + name: '单独年发电量(亿kW·h)', + filed: 'sgyge', + visible: true, + ruleTips: '0d98c74797e49d00bcc4c17c9d557a2b', + type: 'number', + url: '', + value: '102' + }, + { + key: '3C242CDBD87440AD83BE9BC40BBEFE3F', + name: '联合年发电量(亿kW·h)', + filed: 'unyge', + visible: true, + ruleTips: '0d98c74797e49d00bcc4c17c9d557a2b', + type: 'number', + url: '', + value: '102' + }, + { + key: '6F02E38952364606BC231D5E912C3BB4', + name: '利用落差(m)', + filed: 'gap', + visible: true, + ruleTips: '0d98c74797e49d00bcc4c17c9d557a2b', + type: 'number', + url: '', + value: '205' + }, + { + key: '3CDF9BC2F53440BD8B75CD30C7E4D5F0', + name: '开发方式', + filed: 'dvtpName', + visible: true, + ruleTips: '0d98c74797e49d00bcc4c17c9d557a2b', + type: 'select', + url: '', + value: '堤坝式', + vlsr: '大中型电站图册、全国水雨情信息网(黄河中游水电基地)' + } +]; + +// 水温基础信息 + +const wtPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '测站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '测站类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '监测方式', + filed: 'mwayName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +//水质基础信息 +const FhWpPointColumns: Array = [ + { + name: '测站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '测站类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '类别', + filed: 'dtinTypeName', + visible: true, + type: 'select', + url: '' + }, + { + name: '水质要求', + filed: 'wwqtgName', + visible: true, + type: 'select', + url: '' + }, + { + name: '监测方式', + filed: 'mwayName', + visible: true, + type: 'select', + url: '' + } +]; +//栖息地基础信息 fh_point +const FhPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '栖息地名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '保护对象', + filed: 'protobj', + visible: true, + type: 'select', + url: '' + }, + { + name: '保护范围', + filed: 'qxdbhfw', + visible: true, + type: 'input', + url: '' + }, + { + name: '保护总长度(km)', + filed: 'qxdbhcd', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '保护核心长度(km)', + filed: 'qxdbhhxcd', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '保护外围长度(km)', + filed: 'qxdbhwwcd', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '保护面积(km²)', + filed: 'qxdbhmj', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '保护河流', + filed: 'bhhl', + visible: true, + type: 'select', + url: '' + }, + { + name: '保护河段', + filed: 'bhhd', + visible: true, + type: 'select', + url: '' + }, + { + name: '保护措施', + filed: 'bhcs', + visible: true, + type: 'select', + url: '' + }, + { + name: '保护方式', + filed: 'bhfs', + visible: true, + type: 'select', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + url: '', + toFixed: 3 + } +]; +//栖息地流量 基础信息 fh_zq_point +const FhZQPointColumns: Array = [ + { + name: '测站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '测站类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '监测方式', + filed: 'mwayName', + visible: true, + type: 'select', + url: '' + } +]; +//过鱼设施 基础信息 +const FPPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '集运鱼系统', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '上游码头位置', + filed: 'updcklc', + visible: true, + type: 'input', + url: '' + }, + { + name: '上游码头型式', + filed: 'updcktp', + visible: true, + type: 'select', + url: '' + }, + { + name: '下游码头位置', + filed: 'downdcklc', + visible: true, + type: 'input', + url: '' + }, + { + name: '下游码头型式', + filed: 'downdcktp', + visible: true, + type: 'select', + url: '' + }, + { + name: '集(诱)鱼方式', + filed: 'jyyjyfs', + visible: true, + type: 'select', + url: '' + }, + { + name: '运鱼设施方式', + filed: 'jyyyyfs', + visible: true, + type: 'select', + url: '' + }, + { + name: '过鱼对象', + filed: 'psfishtyp', + visible: true, + type: 'select', + url: '' + }, + { + name: '过鱼规模(kg/a)', + filed: 'psfishcnt', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '集运鱼时间', + filed: 'jyyjyytm', + visible: true, + type: 'input', + url: '' + }, + { + name: '建成时间', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '运行时间', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '主要过鱼月份(多个月份用,隔开)', + filed: 'fpssmnmon', + visible: true, + type: 'select', + url: '' + }, + { + name: '数据监测频次', + filed: 'dtfrqcy', + visible: true, + type: 'select', + url: '' + } +]; +const FPPointColumns1: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '鱼道', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '鱼道型式', + filed: 'ydxs', + visible: true, + type: 'input', + url: '' + }, + { + name: '位置', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '总长度(m)', + filed: 'ydzcd', + visible: true, + type: 'number', + url: '', + toFixed: 1 + }, + { + name: '进口运行设计水位(m)', + filed: 'ydjkz', + visible: true, + type: 'number', + url: '', + toFixed: 2 + }, + { + name: '进口数量(个)', + filed: 'ydjkcnt', + visible: true, + type: 'number', + url: '', + toFixed: 0 + }, + { + name: '进口底板高程(m)', + filed: 'ydjkhg', + visible: true, + type: 'number', + url: '', + toFixed: 2 + }, + { + name: '进口诱鱼型式', + filed: 'ydyyxs', + visible: true, + type: 'select', + url: '' + }, + { + name: '出口运行设计水位(m)', + filed: 'outdsgnz', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '出口数量(个)', + filed: 'outcnt', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '出口底板高程(m)', + filed: 'wschgc', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '池室设计流速(m/s)', + filed: 'ydcsv', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '每级池室长(m)', + filed: 'ydcscd', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '每级池室宽(m)', + filed: 'ydcskd', + visible: true, + type: 'select', + url: '' + }, + { + name: '池室坡度', + filed: 'ydcspd', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '池室数量(个)', + filed: 'ydcscnt', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '过鱼对象', + filed: 'psfishtyp', + visible: true, + type: 'select', + url: '' + }, + { + name: '过鱼规模(尾)', + filed: 'psfishcnt', + visible: true, + type: 'select', + url: '' + }, + { + name: '过鱼时间', + filed: 'psfishtm', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成时间', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + url: '' + }, + { + name: '休息池个数', + filed: 'restplcnt', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '诱鱼口流速(m/s)', + filed: 'ydcsv', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '主要过鱼月份(多个月份用,隔开)', + filed: 'fpssmnmon', + visible: true, + type: 'select', + url: '' + }, + { + name: '数据监测频次', + filed: 'dtfrqcy', + visible: true, + type: 'select', + url: '' + } +]; +const FPPointColumns2: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '仿自然通道', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '位置', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '通道断面形状', + filed: 'fzrdmxz', + visible: true, + type: 'select', + url: '' + }, + { + name: '通道长度*宽度(m)', + filed: 'fzrtdsz', + visible: true, + type: 'number', + url: '' + }, + { + name: '运行水深(m)', + filed: 'fzryxwdp', + visible: true, + type: 'number', + url: '' + }, + { + name: '坡降', + filed: 'fzrpj', + visible: true, + type: 'number', + url: '' + }, + { + name: '流速(m/s)', + filed: 'fzrv', + visible: true, + type: 'number', + url: '' + }, + { + name: '进口高程(m)', + filed: 'fzrjkhg', + visible: true, + type: 'number', + url: '' + }, + { + name: '出口高程(m)', + filed: 'outelev', + visible: true, + type: 'number', + url: '' + }, + { + name: '过鱼对象', + filed: 'psfishtyp', + visible: true, + type: 'input', + url: '' + }, + { + name: '过鱼规模(尾)', + filed: 'psfishcnt', + visible: true, + type: 'number', + url: '' + }, + { + name: '过鱼对象', + filed: 'psfishtyp', + visible: true, + type: 'input', + url: '' + }, + { + name: '过鱼规模(尾)', + filed: 'psfishcnt', + visible: true, + type: 'input', + url: '' + }, + { + name: '过鱼时间', + filed: 'psfishtm', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成时间', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + url: '' + }, + { + name: '运行时间', + filed: 'runtm', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '主要过鱼月份(多个月份用,隔开)', + filed: 'fpssmnmon', + visible: true, + type: 'select', + url: '' + }, + { + name: '数据监测频次', + filed: 'dtfrqcy', + visible: true, + type: 'select', + url: '' + } +]; +const FPPointColumns4: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '升鱼机', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '上游码头位置', + filed: 'updcklc', + visible: true, + type: 'input', + url: '' + }, + { + name: '上游码头型式', + filed: 'updcktp', + visible: true, + type: 'select', + url: '' + }, + { + name: '下游码头位置', + filed: 'downdcklc', + visible: true, + type: 'input', + url: '' + }, + { + name: '下游码头型式', + filed: 'downdcktp', + visible: true, + type: 'select', + url: '' + }, + { + name: '集鱼槽数量(个)', + filed: 'syjcnt', + visible: true, + type: 'number', + url: '' + }, + { + name: '集鱼槽进口高程(m)', + filed: 'syjhg', + visible: true, + type: 'number', + url: '' + }, + { + name: '集鱼槽流量(m³/s)', + filed: 'syjq', + visible: true, + type: 'number', + url: '' + }, + { + name: '断面尺寸(长*宽*高)(m)', + filed: 'syjsz', + visible: true, + type: 'number', + url: '' + }, + { + name: '集鱼槽水深(m)', + filed: 'syjwdp', + visible: true, + type: 'number', + url: '' + }, + { + name: '运鱼设施方式', + filed: 'jyyyyfs', + visible: true, + type: 'select', + url: '' + }, + { + name: '过鱼对象', + filed: 'psfishtyp', + visible: true, + type: 'input', + url: '' + }, + { + name: '过鱼规模(尾)', + filed: 'psfishcnt', + visible: true, + type: 'input', + url: '' + }, + { + name: '过鱼时间', + filed: 'psfishtm', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成时间', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + url: '' + }, + { + name: '运行时间', + filed: 'runtm', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '集诱鱼方式', + filed: 'syjjyyfs', + visible: true, + type: 'input', + url: '' + }, + { + name: '主要过鱼月份(多个月份用,隔开)', + filed: 'fpssmnmon', + visible: true, + type: 'select', + url: '' + }, + { + name: '数据监测频次', + filed: 'dtfrqcy', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +const FPPointColumns5: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + } +]; +//鱼类增殖站 基础信息 +const FBPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '增殖站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '地址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '鱼类增殖站', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '放流对象', + filed: 'zzfldxName', + visible: true, + type: 'select', + url: '' + }, + { + name: '建设地点', + filed: 'zzfljslc', + visible: true, + type: 'input', + url: '' + }, + { + name: '放流规模(尾)', + filed: 'zzflcnt', + visible: true, + type: 'number', + toFixed: 0, + url: '' + }, + { + name: '放流地点', + filed: 'zzflfllc', + visible: true, + type: 'select', + url: '' + }, + { + name: '放流时间', + filed: 'zzfltm', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '养殖模式', + filed: 'zzflyzms', + visible: true, + type: 'input', + url: '' + }, + { + name: '生产工艺', + filed: 'zzfkgy', + visible: true, + type: 'select', + url: '' + }, + { + name: '标记方式', + filed: 'zzflbjfs', + visible: true, + type: 'select', + url: '' + }, + { + name: '总占地面积(km²)', + filed: 'zzflar', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '工程等级', + filed: 'zzfllvl', + visible: true, + type: 'select', + url: '' + }, + { + name: '承担放流任务', + filed: 'zzflrw', + visible: true, + type: 'inout', + url: '' + } +]; +//动物救助站 +const VaPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '救助站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '陆生动物保护(救助站、珍稀动物园等)', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '保护对象', + filed: 'protobj', + visible: true, + type: 'input', + url: '' + }, + { + name: '保护方式', + filed: 'bhfs', + visible: true, + type: 'input', + url: '' + }, + { + name: '地点', + filed: 'lsdwlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '面积(km²)', + filed: 'area', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '保护原因', + filed: 'zzfllvl', + visible: true, + type: 'select', + url: '' + } +]; +//珍稀植物园 +const VPPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '植物园名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '保护对象', + filed: 'protobj', + visible: true, + type: 'input', + url: '' + }, + { + name: '保护方式', + filed: 'bhfs', + visible: true, + type: 'input', + url: '' + }, + { + name: '面积(km²)', + filed: 'area', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 4, + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +//水生生态调查断面 +const wePointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '断面名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'input', + url: '' + }, + { + name: '所在河段', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +//野生动物监测 +const waPointColumns: Array = [ + { + name: '测站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '测站类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '监测方式', + filed: 'mwayName', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +//AI视频监控站 +const StinfoAiVidoPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '监控点名', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '监控点类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '监控内容类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属行政区', + filed: 'addvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '监控点地址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + } +]; +//水电站告警情况 +// BasicColumns +//低温水减缓设施 +const DwPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'addvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '叠梁门式进水口', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '天然河流平均水温(℃)', + filed: 'nravwt', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '叠梁门式进水口的单节门叶高度(m)', + filed: 'dlmhg', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '叠梁门式进水口的门叶数量(扇)', + filed: 'dlmcnt', + visible: true, + type: 'number', + url: '' + }, + { + name: '天然河流最高温月份多年平均水温(℃)', + filed: 'nrmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '天然河流最低温月份多年平均水温(℃)', + filed: 'nrmnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下平均水温(℃)', + filed: 'dnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最高温月份多年平均水温(℃)', + filed: 'dnmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最低温月份多年平均水温(℃)', + filed: 'dnwnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '叠梁门顶部高程(m)', + filed: 'frntwllhg', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '叠梁门式进水口的最大淹没水深(m)', + filed: 'dlmmxwdp', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '叠梁门式进水口的投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +//前置挡墙 +const DwFivePointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '前置挡墙', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '天然河流平均水温(℃)', + filed: 'nravwt', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '前置挡墙的结构形式', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '前置挡墙的位置', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '前置挡墙的挡墙顶高程(m)', + filed: 'frntwllhg', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + + { + name: '天然河流最高温月份多年平均水温(℃)', + filed: 'nrmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '天然河流最低温月份多年平均水温(℃)', + filed: 'nrmnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下平均水温(℃)', + filed: 'dnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最高温月份多年平均水温(℃)', + filed: 'dnmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最低温月份多年平均水温(℃)', + filed: 'dnwnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + + { + name: '前置挡墙的投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + } +]; +//隔水幕墙 +const DwSixPointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '隔水幕墙', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '隔水幕墙的结构形式', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '隔水幕墙的位置', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '隔水幕墙的长度(m)', + filed: 'gsmqcd', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '隔水幕墙的宽度(m)', + filed: 'gsmqkd', + visible: true, + type: 'number', + url: '' + }, + { + name: '建成后坝下最高温月份多年平均水温(℃)', + filed: 'dnmxavwt', + visible: true, + type: 'number', + url: '' + }, + { + name: '建成后坝下最低温月份多年平均水温(℃)', + filed: 'dnwnavwt', + visible: true, + type: 'number', + url: '' + }, + + { + name: '前置挡墙的投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 4, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '隔水幕墙材料', + filed: 'gsmqcl', + visible: true, + type: 'select', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + } +]; +//DW +const DwPointColumnsyuan: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, +]; +//夹岩双层取水 +const DwOnePointColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '设施类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + }, + { + name: '夹岩双层取水', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '天然河流平均水温(℃)', + filed: 'nravwt', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + { + name: '天然河流最高温月份多年平均水温(℃)', + filed: 'nrmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '天然河流最低温月份多年平均水温(℃)', + filed: 'nrmnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下平均水温(℃)', + filed: 'dnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最高温月份多年平均水温(℃)', + filed: 'dnmxavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '建成后坝下最低温月份多年平均水温(℃)', + filed: 'dnmnavwt', + visible: true, + type: 'number', + toFixed: 1, + url: '' + }, + { + name: '多层式进水口的投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '多层式进水口的进水口高程每层取水口高程(m)', + filed: 'dcshg', + visible: true, + type: 'input', + url: '' + }, + { + name: '取水口个数(m)', + filed: 'dcsqskgs', + visible: true, + type: 'number', + toFixed: 2, + url: '' + }, + + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + url: '' + }, + { + name: '', + filed: '', + visible: true, + type: '', + url: '' + } +]; +const EQPointColumns2: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '生态放流闸', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '孔口尺寸(m)', + filed: 'flksz', + visible: true, + type: 'input', + url: '' + }, + { + name: '进水口底板高程(m)', + filed: 'jskgc', + visible: true, + type: 'input', + url: '' + }, + { + name: '出水口底板高程(m)', + filed: 'outflrelev', + visible: true, + type: 'input', + url: '' + }, + { + name: '死水位时保证流量(m³/s)', + filed: 'ddzgq', + visible: true, + type: 'input', + url: '' + }, + { + name: '最大泄放流量(m³/s)', + filed: 'flkq', + visible: true, + type: 'input', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '结构形式', + filed: 'frntwlltyp', + visible: true, + type: 'select', + url: '' + } +]; +const EQPointColumns5: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '基荷发电', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '基荷发电工况(MW)', + filed: 'jhfdgk', + visible: true, + type: 'input', + url: '' + }, + { + name: '发电流量(m³/s)', + filed: 'fdll', + visible: true, + type: 'input', + url: '' + }, + { + name: '进水口底板高程(m)', + filed: 'jskgc', + visible: true, + type: 'input', + url: '' + }, + { + name: '出水口底板高程(m)', + filed: 'outflrelev', + visible: true, + type: 'input', + url: '' + } +]; +const EQPointColumns3: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '生态放流洞', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '孔口尺寸(m)', + filed: 'flksz', + visible: true, + type: 'input', + url: '' + }, + { + name: '进水口底板高程(m)', + filed: 'jskgc', + visible: true, + type: 'input', + url: '' + }, + { + name: '出水口底板高程(m)', + filed: 'outflrelev', + visible: true, + type: 'input', + url: '' + }, + { + name: '死水位时保证流量(m³/s)', + filed: 'ddzgq', + visible: true, + type: 'input', + url: '' + }, + { + name: '最大泄放流量(m³/s)', + filed: 'flkq', + visible: true, + type: 'input', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '结构形式', + filed: 'frntwlltyp', + visible: true, + type: 'select', + url: '' + } +]; + +const EQPointColumns4: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '生态放流管', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '孔口尺寸(m)', + filed: 'flksz', + visible: true, + type: 'input', + url: '' + }, + { + name: '进水口底板高程(m)', + filed: 'jskgc', + visible: true, + type: 'input', + url: '' + }, + { + name: '出水口底板高程(m)', + filed: 'outflrelev', + visible: true, + type: 'input', + url: '' + }, + { + name: '死水位时保证流量(m³/s)', + filed: 'ddzgq', + visible: true, + type: 'input', + url: '' + }, + { + name: '最大泄放流量(m³/s)', + filed: 'flkq', + visible: true, + type: 'input', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '结构形式', + filed: 'frntwlltyp', + visible: true, + type: 'select', + url: '' + } +]; +const EQPointColumns1: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + }, + { + name: '生态放流孔', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '开工日期', + filed: 'ststdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, + { + name: '孔口尺寸(m)', + filed: 'flksz', + visible: true, + type: 'input', + url: '' + }, + { + name: '进水口底板高程(m)', + filed: 'jskgc', + visible: true, + type: 'input', + url: '' + }, + { + name: '出水口底板高程(m)', + filed: 'outflrelev', + visible: true, + type: 'input', + url: '' + }, + { + name: '死水位时保证流量(m³/s)', + filed: 'ddzgq', + visible: true, + type: 'input', + url: '' + }, + { + name: '最大泄放流量(m³/s)', + filed: 'flkq', + visible: true, + type: 'input', + url: '' + }, + { + name: '投资(亿元)', + filed: 'inv', + visible: true, + type: 'number', + toFixed: 6, + url: '' + }, + { + name: '投资是否计入工程主体', + filed: 'invinmn', + visible: true, + type: 'select', + url: '' + }, + { + name: '结构形式', + filed: 'frntwlltyp', + visible: true, + type: 'select', + url: '' + } +]; +const EQPointColumns7: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, + { + name: '设施名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '站址', + filed: 'stlc', + visible: true, + type: 'select', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + { + name: '所属电站', + filed: 'ennm', + visible: true, + type: 'select', + url: '' + } +]; +//阶段属性 +const basicFilterColumns: Array = [ + { + key: 'type', + title: '类别', + dataIndex: 'type', + + visible: true, + merge: true, + + ruleTips: '', + setting: {} + }, + { + key: 'keyName', + title: '属性', + dataIndex: 'keyName', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1001000', + title: '规划', + dataIndex: '1001000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1002000', + title: '预可研', + dataIndex: '1002000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1003000', + title: '环评', + dataIndex: '1003000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1004000|1005000', + title: '可研/核准', + dataIndex: '1004000|1005000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1009000', + title: '建设', + dataIndex: '1009000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1011000', + title: '竣工', + dataIndex: '1011000', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: '1013000', + title: '后评价', + dataIndex: '1013000', + + visible: true, + + ruleTips: '', + setting: {} + } +]; + +//实时视频 +//全景影像 + +//电站监测数据 - 电站过程运行线,elem [1,2,3,4,5] +const tabsWithTwoColumns: Array = [ + { + key: 'tm', + name: '时间', + filed: 'tm', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'rz', + name: '坝上水位(m)', + filed: 'rz', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'dz', + name: '坝下水位(m)', + filed: 'dz', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qec', + name: '生态流量(m³/s)', + filed: 'qec', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qi', + name: '入库流量(m³/s)', + filed: 'qi', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qo', + name: '出库流量(m³/s)', + filed: 'qo', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + } +]; + +//电站监测数据--左侧图表 +const tabs: any = { + total: 0, + heads: [ + { + key: 'tm', + name: '时间', + filed: 'tm', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'rz', + name: '坝上水位(m)', + filed: 'rz', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'dz', + name: '坝下水位(m)', + filed: 'dz', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qec', + name: '生态流量(m³/s)', + filed: 'qec', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qi', + name: '入库流量(m³/s)', + filed: 'qi', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + }, + { + key: 'qo', + name: '出库流量(m³/s)', + filed: 'qo', + + visible: true, + + ruleTips: '', + + type: '', + url: '' + } + ], + list: [], + options: [], + title: '', + showTitle: true, + remarks: [], + summarys: [], + footers: [], + returnDictData: false, + checkbox: false, + pages: true, + width: 102, + options_text: '', + options_type: '', + rowNums: [], + order: true, + unit: { + m: '水位', + 'm³/s': '流量' + }, + elem: [1, 2, 3, 4, 5], + split: [2], + stacking: [], + rowCheckRes: [], + warnList: [], + rows: [] +}; + +//预警提示 -设计参数变更提示 +const tableColumns1: Array = [ + { + key: 'stage', + title: '重大变动类型', + dataIndex: 'stage', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'contrastphase', + title: '依据阶段', + dataIndex: 'contrastphase', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'currentstage', + title: '有重大变动的阶段', + dataIndex: 'currentstage', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'phasevalue', + title: '依据阶段数据', + dataIndex: 'phasevalue', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'stagevalue', + title: '重大变动阶段数据', + dataIndex: 'stagevalue', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'messagename', + title: '预警描述', + dataIndex: 'messagename', + + visible: true, + + ruleTips: '', + setting: {} + } +]; + +//预警提示 -施工期环保措施落实预警 +const tableColumns2: Array = [ + { + key: 'stnm', + title: '措施名称', + dataIndex: 'stnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'addvnm', + title: '行政区', + dataIndex: 'addvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'rvnm', + title: '流域', + dataIndex: 'rvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'kyhzhb', + title: '可研(核准)', + dataIndex: 'kyhzhb', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'prdsgn', + title: '预可是否设计', + dataIndex: 'prdsgn', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'eiarqst', + title: '环评是否有要求', + dataIndex: 'eiarqst', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'zxsjhb', + title: '专项设计', + dataIndex: 'zxsjhb', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'isbuild', + title: '建设', + dataIndex: 'isbuild', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'file', + title: '证明材料', + dataIndex: 'file', + + visible: true, + + ruleTips: '', + setting: {}, + + notExport: true + } +]; + +//预警提示 -环保设施建设预警 +const tableColumns3: Array = [ + { + key: 'stnm', + title: '措施名称', + dataIndex: 'stnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'addvnm', + title: '行政区', + dataIndex: 'addvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'rvnm', + title: '流域', + dataIndex: 'rvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'kyhzhb', + title: '可研(核准)', + dataIndex: 'kyhzhb', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'prdsgn', + title: '预可是否设计', + dataIndex: 'prdsgn', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'eiarqst', + title: '环评是否有要求', + dataIndex: 'eiarqst', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'zxsjhb', + title: '专项设计', + dataIndex: 'zxsjhb', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'isbuild', + title: '建设', + dataIndex: 'isbuild', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'file', + title: '证明材料', + dataIndex: 'file', + + visible: true, + + ruleTips: '', + setting: {}, + + notExport: true + } +]; + +//预警提示 -环保设施运行预警 +const tableColumns4: Array = [ + { + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'addvnm', + title: '所属行政区域', + dataIndex: 'addvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'status', + title: '运行状态', + dataIndex: 'status', + + visible: true, + + ruleTips: '', + setting: {} + } +]; + +//预警提示 - 鱼类放流预警 +const tableColumns5: Array = [ + { + key: 'year', + title: '时间', + dataIndex: 'year', + + visible: true, + merge: true, + + ruleTips: '', + setting: {} + }, + { + key: 'ftp', + title: '鱼类', + dataIndex: 'ftp', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'fsz', + title: '放鱼规格(cm)', + dataIndex: 'fsz', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'fcnt', + title: '放鱼数量(尾)', + dataIndex: 'fcnt', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'stlc', + title: '放流地点', + dataIndex: 'stlc', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'rvnm', + title: '所在河流', + dataIndex: 'rvnm', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'fage', + title: '鱼龄(年)', + dataIndex: 'fage', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'bjtp', + title: '标记方式', + dataIndex: 'bjtp', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'bjftp', + title: '标记种类', + dataIndex: 'bjftp', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'bjfcnt', + title: '标记数量(尾)', + dataIndex: 'bjfcnt', + + visible: true, + + ruleTips: '', + setting: {} + }, + { + key: 'normal', + title: '运行状态', + dataIndex: 'normal', + + visible: true, + merge: true, + + ruleTips: '', + setting: {} + } +]; +//气象监测 +const MMColumns: Array = [ + { + name: '基本属性', + visible: false, + ruleTips: '', + type: '', + url: '' + }, { + name: '测站名称', + filed: 'stnm', + visible: true, + type: 'input', + url: '' + }, + { + name: '测站类型', + filed: 'sttpName', + visible: true, + type: 'select', + url: '' + }, + { + name: '站址', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '所属流域', + filed: 'hbrvcdName', + visible: true, + type: 'select', + url: '' + }, + { + name: '所在水系', + filed: 'addvcdName', + visible: true, + type: 'input', + url: '' + }, + { + name: '建成日期', + filed: 'jcdt', + visible: true, + type: 'date', + format: 'YYYY-MM-DD', + url: '' + }, +]; + +//生态流量 +const EcologicalFlowColumns: Array = []; + +//生态流量泄放设施 +const FlowDischargeColumns: Array = []; + +//水质 +const WaterQualityColumns: Array = []; + +//水温 +const WaterTemperatureColumns: Array = []; + +//流量 +const FlowMeasureColumns: Array = []; + +//垂向水温 +const VerticalWaterTemperatureColumns: Array = []; + +//自定义监测数据 +const NormalColumns: Array = []; + +export { + BasicColumns, + wtPointColumns, + FhWpPointColumns, + FhPointColumns, + FhZQPointColumns, + FPPointColumns, + FPPointColumns1, + FPPointColumns2, + FPPointColumns4, + FPPointColumns5, + FBPointColumns, + VaPointColumns, + VPPointColumns, + wePointColumns, + waPointColumns, + DwPointColumns, + DwFivePointColumns, + DwSixPointColumns, + DwOnePointColumns, + DwPointColumnsyuan, + EQPointColumns2, + EQPointColumns5, + EQPointColumns3, + EQPointColumns4, + EQPointColumns1, + EQPointColumns7, + StinfoAiVidoPointColumns, + basicFilterColumns, + tabsWithTwoColumns, + tableColumns1, + tableColumns2, + tableColumns3, + tableColumns4, + tableColumns5, + MMColumns +}; diff --git a/frontend-sjgl/src/components/MapModal/components/AIYXSB/AttachmentPreview.vue b/frontend-sjgl/src/components/MapModal/components/AIYXSB/AttachmentPreview.vue new file mode 100644 index 00000000..fe537a80 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/AIYXSB/AttachmentPreview.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/AIYXSB/MediaViewer.vue b/frontend-sjgl/src/components/MapModal/components/AIYXSB/MediaViewer.vue new file mode 100644 index 00000000..409433f4 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/AIYXSB/MediaViewer.vue @@ -0,0 +1,407 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/AIYXSB/index.vue b/frontend-sjgl/src/components/MapModal/components/AIYXSB/index.vue new file mode 100644 index 00000000..921b2525 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/AIYXSB/index.vue @@ -0,0 +1,1227 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/Attachment.vue b/frontend-sjgl/src/components/MapModal/components/Attachment.vue new file mode 100644 index 00000000..cca15174 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/Attachment.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/BasicInfo.vue b/frontend-sjgl/src/components/MapModal/components/BasicInfo.vue new file mode 100644 index 00000000..93b8a5bb --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/BasicInfo.vue @@ -0,0 +1,578 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/CommonAttachmentModal.vue b/frontend-sjgl/src/components/MapModal/components/CommonAttachmentModal.vue new file mode 100644 index 00000000..142beee2 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/CommonAttachmentModal.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/DZGJ.vue b/frontend-sjgl/src/components/MapModal/components/DZGJ.vue new file mode 100644 index 00000000..d31327e3 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/DZGJ.vue @@ -0,0 +1,306 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/EarlyWarningAlert.vue b/frontend-sjgl/src/components/MapModal/components/EarlyWarningAlert.vue new file mode 100644 index 00000000..7d7488da --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/EarlyWarningAlert.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/EcologicalFlow.vue b/frontend-sjgl/src/components/MapModal/components/EcologicalFlow.vue new file mode 100644 index 00000000..3393e6b1 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/EcologicalFlow.vue @@ -0,0 +1,625 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/Ecology.vue b/frontend-sjgl/src/components/MapModal/components/Ecology.vue new file mode 100644 index 00000000..14c32150 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/Ecology.vue @@ -0,0 +1,583 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FishFacilityBuildState.vue b/frontend-sjgl/src/components/MapModal/components/FishFacilityBuildState.vue new file mode 100644 index 00000000..df4c92f1 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FishFacilityBuildState.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FishFacilityMonitorData.vue b/frontend-sjgl/src/components/MapModal/components/FishFacilityMonitorData.vue new file mode 100644 index 00000000..a9e993cb --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FishFacilityMonitorData.vue @@ -0,0 +1,337 @@ + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FishFacilityRunState.vue b/frontend-sjgl/src/components/MapModal/components/FishFacilityRunState.vue new file mode 100644 index 00000000..f93afe69 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FishFacilityRunState.vue @@ -0,0 +1,374 @@ + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FishZHFX.vue b/frontend-sjgl/src/components/MapModal/components/FishZHFX.vue new file mode 100644 index 00000000..e4e9cec5 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FishZHFX.vue @@ -0,0 +1,584 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FlowDischarge.vue b/frontend-sjgl/src/components/MapModal/components/FlowDischarge.vue new file mode 100644 index 00000000..55ffb3c8 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FlowDischarge.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/FlowMeasure.vue b/frontend-sjgl/src/components/MapModal/components/FlowMeasure.vue new file mode 100644 index 00000000..b5d619ef --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/FlowMeasure.vue @@ -0,0 +1,634 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/MonitorInfo.vue b/frontend-sjgl/src/components/MapModal/components/MonitorInfo.vue new file mode 100644 index 00000000..cb84f74f --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/MonitorInfo.vue @@ -0,0 +1,605 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/NoLiveVideo.vue b/frontend-sjgl/src/components/MapModal/components/NoLiveVideo.vue new file mode 100644 index 00000000..2158f2f4 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NoLiveVideo.vue @@ -0,0 +1,480 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/Normal.vue b/frontend-sjgl/src/components/MapModal/components/Normal.vue new file mode 100644 index 00000000..003537d9 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/Normal.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/NormalAddedSituation.vue b/frontend-sjgl/src/components/MapModal/components/NormalAddedSituation.vue new file mode 100644 index 00000000..89747e55 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalAddedSituation.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/NormalDataMonitoring2.vue b/frontend-sjgl/src/components/MapModal/components/NormalDataMonitoring2.vue new file mode 100644 index 00000000..d7304cb6 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalDataMonitoring2.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/NormalOperationData/index.vue b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/index.vue new file mode 100644 index 00000000..e99ef6b4 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/index.vue @@ -0,0 +1,695 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/NormalOperationData/operationConfig.ts b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/operationConfig.ts new file mode 100644 index 00000000..8c111c29 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/operationConfig.ts @@ -0,0 +1,523 @@ +import { + miaoZhongJiLu, + miaoZhongPeiYu, + qinYuPeiYuFangShi, + qinYuPeiYuShuiWen, + qinYuPeiYuShuiZi, + qinYuPeiYuTouWei, + qinYuSiWanJiLu, + qinYuXinXi, + taoTaiQinYu, + yuBingFangZhi, + yuLeiRenGo, + yuLeiShouJin, + yuleifuhua +} from './proliferationColumns'; +import { getDictItemsByCode } from '@/api/dict'; + +export interface OperationFilterOption { + label: string; + value: string | number; + name?: string; + id?: string | number; +} + +export interface OperationFilterField { + type: 'select' | 'input'; + name: string; + label: string; + placeholder?: string; + width?: string | number; + key?: string | string[]; + url?: string; + method?: 'get' | 'post'; + params?: Record; + options?: OperationFilterOption[]; +} + +export interface OperationTableItem { + title: string; + key: string; + url: string; + columns: any[]; + filter: OperationFilterField[]; +} + +export interface OperationTextGroup { + ctitle: string; + key: string; + proTable: OperationTableItem[]; + disable?: boolean; +} + +export interface OperationStepItem { + title: string; + key: string; + typeIcon?: string; + arrowIcon?: string; + textList: OperationTextGroup[]; + stepIcon?: string; +} + +export const operationStepList: OperationStepItem[] = [ + { + title: '亲鱼选配与培育', + typeIcon: 'fishStation2', + arrowIcon: 'arrowDownLine2', + key: '1', + textList: [ + { + ctitle: '亲鱼选配', + key: '1-1', + proTable: [ + { + title: '亲鱼信息', + key: '1-1', + url: '/wmp-env-server/fb/bsmfr/qgc/GetKendoListCust', + columns: qinYuXinXi, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'sex', + label: '性别', + width: 120, + url: '', + options: [ + { label: '雄鱼', value: 1 }, + { label: '雌鱼', value: 2 } + ] + }, + { + type: 'input', + name: 'signnum', + label: '标记编号', + key: ['signnum', 'length'], + placeholder: '搜索标记编号、全长', + url: '', + options: [] + } + ] + }, + { + title: '亲鱼死亡记录', + key: '1-2', + url: '/wmp-env-server/fb/bsdeathr/qgc/GetKendoListCust', + columns: qinYuSiWanJiLu, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'input', + name: 'signnum', + label: '标记编号', + key: ['spod', 'deathd', 'length'], + placeholder: '搜索死亡症状、死亡诊断、全长', + url: '', + options: [] + } + ] + } + ], + disable: false + }, + { + ctitle: '亲鱼培育', + key: '1-2', + proTable: [ + { + title: '亲鱼培育方式', + key: '1-3', + url: '/wmp-env-server/fb/bsctmob/qgc/GetKendoListCust', + columns: qinYuPeiYuFangShi, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'ctmo', + label: '培育方式', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'CTMO' + } + }, + { + type: 'input', + name: 'fpnum', + label: '标记编号', + placeholder: '搜索鱼池名称、全长', + key: ['fpName', 'length'], + url: '', + options: [] + } + ] + }, + { + title: '亲鱼培育水温观测记录', + key: '1-4', + url: '/wmp-env-server/fb/fbbwtr/GetKendoListCust', + columns: qinYuPeiYuShuiWen, + filter: [ + { + type: 'input', + name: 'fpName', + label: '鱼池名称', + placeholder: '搜索鱼池名称', + url: '', + options: [] + } + ] + }, + { + title: '亲鱼培育水质监测记录', + key: '1-5', + url: '/wmp-env-server/fb/fbcwqr/GetKendoListCust', + columns: qinYuPeiYuShuiZi, + filter: [ + { + type: 'input', + name: 'fpName', + label: '鱼池名称', + placeholder: '搜索鱼池名称', + url: '', + options: [] + } + ] + }, + { + title: '亲鱼培育投喂记录', + key: '1-6', + url: '/wmp-env-server/fb/bsrfir/qgc/GetKendoListCust', + columns: qinYuPeiYuTouWei, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'ftype', + label: '饲料种类', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'FEEDTP' + } + }, + { + type: 'input', + name: 'fpName', + label: '鱼池名称', + placeholder: '搜索鱼池名称', + url: '', + options: [] + } + ] + } + ], + disable: false + }, + { + ctitle: '亲鱼补充与淘汰', + key: '1-3', + proTable: [ + { + title: '淘汰亲鱼信息', + key: '1-7', + url: '/wmp-env-server/fb/outfishr/qgc/GetKendoListCust', + columns: taoTaiQinYu, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'sex', + label: '性别', + width: 120, + url: '', + options: [ + { label: '雄鱼', value: 1 }, + { label: '雌鱼', value: 2 } + ] + }, + { + type: 'input', + name: 'length', + label: '全长', + placeholder: '搜索全长' + } + ] + } + ], + disable: false + } + ], + stepIcon: '' + }, + { + title: '人工繁殖', + key: '2', + typeIcon: 'fishStation2', + arrowIcon: 'arrowDownLine2', + textList: [ + { + ctitle: '亲本选择', + key: '2-1', + proTable: [], + disable: true + }, + { + ctitle: '人工催产', + key: '2-2', + proTable: [ + { + title: '鱼类人工催产记录', + key: '2-1', + url: '/wmp-env-server/fb/fishartinlr/qgc/GetKendoListCust', + columns: yuLeiRenGo, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'fpitocintype', + label: '催产剂种类', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'FPITOCINTYPE' + } + }, + { + type: 'select', + name: 'sex', + label: '性别', + width: 120, + url: '', + options: [ + { label: '雄鱼', value: 1 }, + { label: '雌鱼', value: 2 } + ] + } + ] + } + ], + disable: false + }, + { + ctitle: '人工授精', + key: '2-3', + proTable: [], + disable: true + }, + { + ctitle: '孵化', + key: '2-4', + proTable: [ + { + title: '鱼类受精卵孵化过程记录', + key: '2-2', + url: '/wmp-env-server/fb/fishhatchrecr/qgc/GetKendoListCust', + columns: yuLeiShouJin, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'fishsrc', + label: '亲鱼来源', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'BSSR' + } + } + ] + }, + { + title: '鱼类孵化过程巡查记录', + key: '2-3', + url: '/wmp-env-server/fb/fishhatchpror/qgc/GetKendoListCust', + columns: yuleifuhua, + filter: [ + { + type: 'input', + name: 'devno', + label: '孵化设施编号', + placeholder: '搜索孵化设施编号' + } + ] + } + ], + disable: false + } + ], + stepIcon: '' + }, + { + title: '鱼苗和鱼种的培育', + key: '3', + typeIcon: 'fishStation2', + arrowIcon: 'arrowDownLine2', + textList: [ + { + ctitle: '鱼苗和鱼种的培育', + key: '3-1', + proTable: [ + { + title: '苗种培育水环境监测记录', + key: '3-1', + url: '/wmp-env-server/fb/scwemr/GetKendoListCust', + columns: miaoZhongPeiYu, + filter: [ + { + type: 'input', + name: 'fpName', + label: '鱼池名称', + placeholder: '搜索鱼池名称' + } + ] + }, + { + title: '苗种培育记录', + key: '3-2', + url: '/wmp-env-server/fb/fishbreedr/qgc/GetKendoListCust', + columns: miaoZhongJiLu, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'ftype', + label: '饲料种类', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'FEEDTP' + } + }, + { + type: 'input', + name: 'farmno', + label: '鱼池编号', + placeholder: '搜索鱼池名称、摄食情况', + key: ['fpName', 'fin'] + } + ] + } + ], + disable: false + } + ], + stepIcon: '' + }, + { + title: '鱼病防治', + key: '4', + typeIcon: 'fishStation2', + arrowIcon: 'arrowDownLine2', + textList: [ + { + ctitle: '鱼病防治', + key: '4-1', + proTable: [ + { + title: '鱼病防治记录', + key: '4-1', + url: '/wmp-env-server/fb/fishdpacr/qgc/GetKendoListCust', + columns: yuBingFangZhi, + filter: [ + { + type: 'select', + name: 'ftp', + label: '鱼类', + url: '', + options: [] + }, + { + type: 'select', + name: 'method', + label: '用药方式', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'method' + } + }, + { + type: 'select', + name: 'treateffect', + label: '治疗效果', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'TREATEFFECT' + } + }, + { + type: 'select', + name: 'fishdrugtype', + label: '鱼药种类', + url: '/system/dictionary/getDictItemsByCode', + method: 'get', + params: { + dictCode: 'FISHDRUGTYPE' + } + }, + { + type: 'input', + name: 'fpName', + label: '鱼池名称', + placeholder: '搜索鱼池名称、发病症状', + key: ['fpName', 'symptoms'] + } + ] + } + ], + disable: false + } + ], + stepIcon: '' + } +]; diff --git a/frontend-sjgl/src/components/MapModal/components/NormalOperationData/proliferationColumns.ts b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/proliferationColumns.ts new file mode 100644 index 00000000..54b2c5b2 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalOperationData/proliferationColumns.ts @@ -0,0 +1,4372 @@ +//亲鱼信息 +export const qinYuXinXi = [ + { + dataIndexRaw: '', + key: 'tm', + title: '引进日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'bssr', + title: '亲鱼来源', + dataIndex: 'bssr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '生物学指标', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'length', + title: '全长(cm)', + dataIndex: 'length', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120 + }, + { + dataIndexRaw: '', + key: 'weight', + title: `体重(kg)`, + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120, + unitConfig: ['Other', 'TZ'] + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'age', + title: '鱼龄(a)', + dataIndex: 'age', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'sexName', + title: '性别', + dataIndex: 'sexName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'value', + title: '数量(尾)', + dataIndex: 'value', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'signnum', + title: '标记编号', + dataIndex: 'signnum', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//亲鱼死亡记录 +export const qinYuSiWanJiLu = [ + { + dataIndexRaw: '', + key: 'tm', + title: '死亡日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'signnum', + title: '标记编号', + dataIndex: 'signnum', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'length', + title: '全长(CM)', + dataIndex: 'length', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'weight', + title: '体重(G)', + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'value', + title: '数量', + dataIndex: 'value', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'spod', + title: '死亡症状', + dataIndex: 'spod', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'deathd', + title: '死亡诊断', + dataIndex: 'deathd', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; + +//亲鱼培育方式 +export const qinYuPeiYuFangShi = [ + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'value', + title: '数量(尾)', + dataIndex: 'value', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '平均规格', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'length', + title: '全长(CM)', + dataIndex: 'length', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'weight', + title: '体重(G)', + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ctmoStr', + title: '培育方式', + dataIndex: 'ctmoStr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'skds', + title: '放养密度', + dataIndex: 'skds', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } +]; +//亲鱼培育水温观测记录 +export const qinYuPeiYuShuiWen = [ + { + dataIndexRaw: '', + key: 'tm', + title: '观测日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '水温(℃)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: '', + title: '(建议20~30℃,与上一时段水温差≤2℃)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'wte', + title: '8:00', + dataIndex: 'wte', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'wtf', + title: '14:00', + dataIndex: 'wtf', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'wtt', + title: '20:00', + dataIndex: 'wtt', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//亲鱼培育水质监测记录 +export const qinYuPeiYuShuiZi = [ + { + dataIndexRaw: '', + key: 'tm', + title: '监测时段', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'iffitStr', + title: '*是否符合标准', + dataIndex: 'iffitStr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '水质指标', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: '', + title: '氨氮(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'nh3n', + title: '≤0.02mg/L', + dataIndex: 'nh3n', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 150 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '亚硝酸盐(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'no2', + title: '≤0.02mg/L', + dataIndex: 'no2', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 150 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '溶解氧(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'dox', + title: '≥3mg/L;连续24h内,16h以上>5mg/L', + dataIndex: 'dox', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 180 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: 'pH', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'ph', + title: '6.5~8.5', + dataIndex: 'ph', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//亲鱼培育投喂记录 +export const qinYuPeiYuTouWei = [ + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '投喂日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'ftypeName', + title: '饲料种类', + dataIndex: 'ftypeName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'cfe', + title: '投食量(g)', + dataIndex: 'cfe', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tbw', + title: '总体重(g)', + dataIndex: 'tbw', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '*日投喂率(%)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'dfr', + title: '0.5%~5%', + dataIndex: 'dfr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fdi', + title: '摄食情况', + dataIndex: 'fdi', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'warfre', + title: '水交换频次(次/d)', + width: 150, + dataIndex: 'warfre', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//淘汰亲鱼信息 +export const taoTaiQinYu = [ + { + dataIndexRaw: '', + key: 'signno', + title: '标记编号', + dataIndex: 'signno', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'src', + title: '亲鱼来源', + dataIndex: 'src', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'sexName', + title: '性别', + dataIndex: 'sexName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'age', + title: '鱼龄(a)', + dataIndex: 'age', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '生物学指标', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'length', + title: '全长(cm)', + dataIndex: 'length', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120 + }, + { + dataIndexRaw: '', + key: 'weight', + title: `体重(kg)`, + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120, + unitConfig: ['Other', 'TZ'] + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'agelmt', + title: '繁殖年限(a)', + dataIndex: 'agelmt', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'brecount', + title: '繁殖次数(次)', + dataIndex: 'brecount', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '淘汰日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'outrea', + title: '淘汰原因', + dataIndex: 'outrea', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'handStr', + title: '处置方式', + dataIndex: 'handStr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; + +//鱼类人工催产 +export const yuLeiRenGo = [ + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'sexName', + title: '性别', + dataIndex: 'sexName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '催产日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'ffisht', + title: '总数量(尾)', + dataIndex: 'ffisht', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fpitocintypeName', + title: '催产剂种类', + dataIndex: 'fpitocintypeName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fdose', + title: '总剂量', + dataIndex: 'fdose', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'finjmo', + title: '注射方式', + dataIndex: 'finjmo', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'air', + title: '气温(℃)', + dataIndex: 'air', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'wartem', + title: '水温(℃)', + dataIndex: 'wartem', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'dox', + title: '溶解氧(mg/L)', + dataIndex: 'dox', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; + +//鱼类受精卵孵化过程记录 +export const yuLeiShouJin = [ + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fishsrc', + title: '亲鱼来源', + dataIndex: 'fishsrc', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '孵化时间', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'eggcount', + title: '鱼卵数量(万粒)', + dataIndex: 'eggcount', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ferrate', + title: '受精率(%)', + dataIndex: 'ferrate', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'hatchrate', + title: '孵化率(%)', + dataIndex: 'hatchrate', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'outhour', + title: '出苗时间(h)', + dataIndex: 'outhour', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'outcount', + title: '出苗数量(万尾)', + dataIndex: 'outcount', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'outrate', + title: '出苗率(%)', + dataIndex: 'outrate', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; + +//鱼类孵化过程巡查记录 +export const yuleifuhua = [ + { + dataIndexRaw: '', + key: 'devno', + title: '孵化设施编号', + dataIndex: 'devno', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '巡查时间', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '水温(℃)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'wartem', + title: '20~30℃', + dataIndex: 'wartem', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '与上一时段水温差(℃)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'wtdiff', + title: '≤2℃', + dataIndex: 'wtdiff', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '溶解氧(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'dox', + title: '≥3mg/L;连续24h内,16h以上>5mg/L', + dataIndex: 'dox', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: 'pH', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'phList', + title: '6.5~8.5', + dataIndex: 'phList', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'empsta', + title: '胚胎发育时期', + dataIndex: 'empsta', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'warfre', + title: '水交换频次(次/d)', + width: 150, + dataIndex: 'warfre', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'iseven', + title: '孵化密度是否均匀', + dataIndex: 'iseven', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'spawntm', + title: '产卵时间', + dataIndex: 'spawntm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'remarks', + title: '备注', + dataIndex: 'remarks', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//苗种培育水环境监测记录 +export const miaoZhongPeiYu = [ + { + dataIndexRaw: '', + key: 'tm', + title: '监测日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '水温(℃)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'wartem', + title: '20~30℃', + dataIndex: 'wartem', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '*与上一时段水温差', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'wtdiff', + title: '≤2℃', + dataIndex: 'wtdiff', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 180 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '氨氮(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'nh3n', + title: '≤0.5mg/L', + dataIndex: 'nh3n', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '亚硝酸盐(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'no2', + title: '≤0.1mg/L', + dataIndex: 'no2', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 150 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '溶解氧(mg/L)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'dox', + title: '≥3mg/L;连续24h内,16h以上>5mg/L', + dataIndex: 'dox', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 180 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: 'pH', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'ph', + title: '6.5~8.5', + dataIndex: 'ph', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; +//苗种培育记录 +export const miaoZhongJiLu = [ + { + dataIndexRaw: '', + key: 'tm', + title: '培育日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpName', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'counts', + title: '数量(尾)', + dataIndex: 'counts', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '平均规格', + dataIndex: '', + width: 200, + children: [ + { + dataIndexRaw: '', + key: 'length', + title: '全长(CM)', + dataIndex: 'length', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 80 + }, + { + dataIndexRaw: '', + key: 'weight', + title: '体重(G)', + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 80 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftypeName', + title: '饲料种类', + dataIndex: 'ftypeName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'foodint', + title: '投食量(g)', + dataIndex: 'foodint', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: '', + title: '*日投喂率(%)', + dataIndex: '', + children: [ + { + dataIndexRaw: '', + key: 'dfr', + title: '0.5%~5%', + dataIndex: 'dfr', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + width: 120 + } + ], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fin', + title: '摄食情况', + dataIndex: 'fin', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; + +//鱼病防治记录 +export const yuBingFangZhi = [ + { + dataIndexRaw: '', + key: 'tm', + title: '日期', + dataIndex: 'tm', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + dataType: 'date', + dataFormat: 'yyyy-MM-DD' + }, + { + dataIndexRaw: '', + key: 'fpnum', + title: '鱼池名称', + dataIndex: 'fpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ftpName', + title: '鱼类', + dataIndex: 'ftpName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'weight', + title: '平均体重(kg)', + dataIndex: 'weight', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'symptoms', + title: '发病症状', + dataIndex: 'symptoms', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fishdrugtypeName', + title: '鱼药种类', + dataIndex: 'fishdrugtypeName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'methodName', + title: '用药方法', + dataIndex: 'methodName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'dose', + title: '用药剂量(mg/kg)', + dataIndex: 'dose', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'days', + title: '用药天数(d)', + dataIndex: 'days', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'treateffectName', + title: '治疗效果', + dataIndex: 'treateffectName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'recorderName', + title: '记录人', + dataIndex: 'recorderName', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'fid', + title: '证明材料', + dataIndex: 'fid', + children: [], + visible: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + notExport: true + } +]; diff --git a/frontend-sjgl/src/components/MapModal/components/NormalResearchSituation.vue b/frontend-sjgl/src/components/MapModal/components/NormalResearchSituation.vue new file mode 100644 index 00000000..de9bed47 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/NormalResearchSituation.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/PanoramaComponent.vue b/frontend-sjgl/src/components/MapModal/components/PanoramaComponent.vue new file mode 100644 index 00000000..afe0f43b --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/PanoramaComponent.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/MapModal/components/PanoramaInfo.vue b/frontend-sjgl/src/components/MapModal/components/PanoramaInfo.vue new file mode 100644 index 00000000..78d5e043 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/PanoramaInfo.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/PowerStationProgressLine.vue b/frontend-sjgl/src/components/MapModal/components/PowerStationProgressLine.vue new file mode 100644 index 00000000..e3dd0377 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/PowerStationProgressLine.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/MapModal/components/ProcessDiagram.vue b/frontend-sjgl/src/components/MapModal/components/ProcessDiagram.vue new file mode 100644 index 00000000..1ea9db18 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/ProcessDiagram.vue @@ -0,0 +1,710 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/SsspLayer.vue b/frontend-sjgl/src/components/MapModal/components/SsspLayer.vue new file mode 100644 index 00000000..8efeb435 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/SsspLayer.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/MapModal/components/TableInfoComponent.vue b/frontend-sjgl/src/components/MapModal/components/TableInfoComponent.vue new file mode 100644 index 00000000..624523bb --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/TableInfoComponent.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/MapModal/components/VerticalWaterTemperature.vue b/frontend-sjgl/src/components/MapModal/components/VerticalWaterTemperature.vue new file mode 100644 index 00000000..2d3c665e --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/VerticalWaterTemperature.vue @@ -0,0 +1,641 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/WarningPrompt.vue b/frontend-sjgl/src/components/MapModal/components/WarningPrompt.vue new file mode 100644 index 00000000..2b1cb3d1 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/WarningPrompt.vue @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/MapModal/components/WaterQuality.vue b/frontend-sjgl/src/components/MapModal/components/WaterQuality.vue new file mode 100644 index 00000000..766d401f --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/WaterQuality.vue @@ -0,0 +1,791 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/WaterTemperature.vue b/frontend-sjgl/src/components/MapModal/components/WaterTemperature.vue new file mode 100644 index 00000000..c2a00f2c --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/WaterTemperature.vue @@ -0,0 +1,1127 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/WaterTemperatureRep.vue b/frontend-sjgl/src/components/MapModal/components/WaterTemperatureRep.vue new file mode 100644 index 00000000..a7334bb2 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/WaterTemperatureRep.vue @@ -0,0 +1,775 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/columnList.ts b/frontend-sjgl/src/components/MapModal/components/columnList.ts new file mode 100644 index 00000000..abd2f8bd --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/columnList.ts @@ -0,0 +1,500 @@ +export const yyccg: any[] = [ + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '出港时间', + dataIndex: 'tm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, +] +export const Gysyx: any[] = [ + { + dataIndexRaw: '', + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '赶鱼栅运行时间', + dataIndex: 'tm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, +] +export const Syjyx: any[] = [ + { + dataIndexRaw: '', + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: window.__lyConfigs.baseId == '02' ? '升鱼斗运行时间' : '升鱼机运行时间', + dataIndex: 'tm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, +] +export const ZWyyh: any[] = [ + { + dataIndexRaw: '', + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '运行时间', + dataIndex: 'tm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, +] +export const Ycyd: any[] = [ + { + dataIndexRaw: '', + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '运行时间', + dataIndex: 'tm', + children: [], + visible: true, + sort: true, + fixed: '', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, +] + +export const dlmcolumns = [ + { + dataIndexRaw: '', + key: 'stnm', + title: '设施名称', + dataIndex: 'stnm', + children: [], + visible: true, + fixed: 'left', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'ennm', + title: '所属电站', + dataIndex: 'ennm', + children: [], + visible: true, + fixed: 'left', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + dataFormat: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'tm', + title: '操作时间', + dataIndex: 'tm', + dataFormat: 'YYYY-MM-DD', + dataType: 'date', + children: [], + visible: true, + sort: true, + fixed: 'left', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false + }, + { + dataIndexRaw: '', + key: 'aiVal', + title: '操作状态', + dataIndex: 'aiVal', + children: [], + visible: true, + sort: true, + fixed: 'left', + ellipsis: true, + wrap: false, + dictType: '', + dictCode: '', + dictDatas: {}, + fromType: '', + selectMode: '', + unit: '', + remark: '', + rules: '', + ruleTips: '', + setting: {}, + chartColor: '', + elementCode: '', + disabledDate: true, + multiLink: false, + render: (res: any) => ( + res == "open" ? "开启" : res == "close" ? "关闭" : '-' + ) + }, +] diff --git a/frontend-sjgl/src/components/MapModal/components/liveFootage.vue b/frontend-sjgl/src/components/MapModal/components/liveFootage.vue new file mode 100644 index 00000000..6cb90c37 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/liveFootage.vue @@ -0,0 +1,435 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/onSitePhoto.vue b/frontend-sjgl/src/components/MapModal/components/onSitePhoto.vue new file mode 100644 index 00000000..b4864362 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/onSitePhoto.vue @@ -0,0 +1,404 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/components/videoInfo.vue b/frontend-sjgl/src/components/MapModal/components/videoInfo.vue new file mode 100644 index 00000000..4fceb41e --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/components/videoInfo.vue @@ -0,0 +1,753 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/index.vue b/frontend-sjgl/src/components/MapModal/index.vue new file mode 100644 index 00000000..8773b3c1 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/index.vue @@ -0,0 +1,978 @@ + + + + + diff --git a/frontend-sjgl/src/components/MapModal/setting.config.ts b/frontend-sjgl/src/components/MapModal/setting.config.ts new file mode 100644 index 00000000..c65e6d85 --- /dev/null +++ b/frontend-sjgl/src/components/MapModal/setting.config.ts @@ -0,0 +1,1282 @@ +// import { +// NormalDatePickerFilter, +// NormalFishFilter, +// NormalFishFilter1, +// NormalSelectFilter, +// NormalStcdFilter, +// NormalWEFilter, +// NormalYearPickerFilter +// } from '@zebras/qgc-share/components/mapModal/index' +// import { Session } from '@zebras/qgc-share/service/Session' +// import getUrl from '@zebras/qgc-share/utils/isQGCrul' +// import { Utility } from '@zebras/qgc-share/utils/Utility' + +// // 水电站 √ +const ENGTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + // { + // name: '阶段属性', + // key: 'basicFilter', + // type: 'basicFilter', + // url: '/eng/engBasisInfo/getEngBaseInfo' + // }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + }, + { + name: '全景影像', + key: 'panoramaInfo', + type: 'panorama' + }, + { + name: '监测数据', + key: 'monitorInfo', + type: 'tabsWithTwo', + code: 'dzxq.tabs.jcsj' + }, + { + name: '预警提示', + key: 'tableTabs', + type: 'tableTabs', + code: 'dzxq-yjts', + tabs: [ + { + name: '设计参数变更提示', + key: 'DesignParameterChangePrompt', + type: 'table', + hiddenChart: true, + tableUrl: '/dec-lygk-base-server/base/engWarning/GetKendoList' + }, + { + name: '施工期环保措施落实预警', + key: 'ImplementEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/sgqhbss/GetKendoListCust' + }, + { + name: '环保设施建设预警', + key: 'ConstructionEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/hbssjs/GetKendoListCust' + }, + { + name: '环保设施运行预警', + key: 'RunEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/hbssyx/GetKendoListCust' + }, + { + name: '鱼类放流预警', + key: 'ReleaseEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: '/dec-lygk-base-server/base/engWarning/ylfl/GetKendoListCust' + } + ] + }, + { + name: '查看报告', + key: 'attachment', + type: 'attachment', + url: '/eq/fid/GetKendoListCust' + }, + { + name: '批复文件', + key: 'approval', + type: 'approval', + url: '/eng/base/eiaapproval/GetKendoList' + } + // { + // name: "特征曲线", + // key: "characteristicCurve", + // type: "characteristicCurve" + // } +].filter(Boolean); +// // 水电站生态流量 √ +const ENGEQTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + }, + { + name: '全景影像', + key: 'panoramaInfo', + type: 'panorama' + }, + { + name: '监测数据', + key: 'monitorInfo', + type: 'tabsWithTwo', + code: 'dzxq.tabs.jcsj' + }, + { + name: '预警提示', + key: 'tableTabs', + type: 'tableTabs', + code: 'dzxq-yjts', + tabs: [ + { + name: '设计参数变更提示', + key: 'DesignParameterChangePrompt', + type: 'table', + hiddenChart: true, + tableUrl: '/dec-lygk-base-server/base/engWarning/GetKendoList' + }, + { + name: '施工期环保措施落实预警', + key: 'ImplementEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/sgqhbss/GetKendoListCust' + }, + { + name: '环保设施建设预警', + key: 'ConstructionEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/hbssjs/GetKendoListCust' + }, + { + name: '环保设施运行预警', + key: 'RunEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: + '/dec-lygk-base-server/base/engWarning/hbssyx/GetKendoListCust' + }, + { + name: '鱼类放流预警', + key: 'ReleaseEarlyWarning', + type: 'table', + hiddenChart: true, + tableUrl: '/dec-lygk-base-server/base/engWarning/ylfl/GetKendoListCust' + } + ] + }, + { + name: '生态流量', + key: 'EcologicalFlow', + type: 'EcologicalFlow' + }, + { + name: '查看报告', + key: 'attachment', + type: 'attachment', + url: '/eq/fid/GetKendoListCust' + }, + { + name: '批复文件', + key: 'approval', + type: 'approval', + url: '/eng/base/eiaapproval/GetKendoList' + } +].filter(Boolean); + +// // 水电站生态流量 - 江局单独看 √ +const ENGEQTabsJuangJu: Array = [ + { + name: '生态流量', + key: 'EcologicalFlow', + type: 'EcologicalFlow', + default: true + } +].filter(Boolean); +// //生态流量泄放设施 √ +const EQTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + // { + // name: '实时视频', + // key: 'videoInfo', + // type: 'video', + // url: '/video/dataStcdFrame/getVideoMonitorList' + // }, + // { + // name: '全景影像', + // key: 'panoramaInfo', + // type: 'panorama' + // }, + { + name: '监测数据', + key: 'flowDischarge', + type: 'FlowDischarge' + } +]; +// 过鱼设施 √ +const FPTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + code: 'gyss.tabs.jcxx' + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList', + code: 'gyss.tabs.sssp' + }, + { + name: '在线监测数据', + key: 'FishFacilityMonitorData', //Normal + type: 'FishFacilityMonitorData', //Normal + code: 'gyss.tabs.jcsj', + tabs: [ + { + name: '', + type: 'table', + // tableUrl: getUrl('/wmp-env-server/env/fp/fpssTable/GetKendoListCust'),//getUrl + hiddenChart: true, + hiddenTabs: true + // filter: NormalDatePickerFilter // 没有 + } + ] + }, + { + name: '运行情况', + key: 'FishFacilityRunState', //Normal1 + type: 'FishFacilityRunState', //Normal + code: 'gyss.tabs.yxqk', + default: true, // 默认显示 + tabs: [ + { + name: '', + type: 'table', + // tableUrl: getUrl('/wmp-env-server/env/fp/run/secondRun/GetKendoListCust'), + hiddenChart: true, + hiddenTabs: true + // filter: NormalFishFilter // 没有 + } + ] + }, + { + name: '综合分析', + key: 'FishZHFX', + type: 'FishZHFX' + // tabs: [ 线上同步注释 + // { + // name: '', + // type: 'table', + // tableUrl: getUrl('/wmp-env-server/env/fp/run/secondRun/GetKendoListCust'), + // hiddenChart: true, + // hiddenTabs: true, + // filter: NormalFishFilter + // } + // ] + }, + { + name: 'AI运行识别', + key: 'AIYXSB', + type: 'AIYXSB' + } +]; + +// // 过鱼设施在建状态 +const FPTabs1: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + default: true, // 默认显示 + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + }, + { + name: '建设情况', + key: 'FishFacilityBuildState', //basicState + type: 'FishFacilityBuildState', //basicState + // url: "/env/fp/fpFacilities/getFpStcdConstructionInfo2", + url: '/wmp-env-server/env/fp/run/secondBuild/GetKendoListCust' + } +]; +//鱼类增殖站 √ +const FBTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '运行数据', + key: 'NormalOperationData', + type: 'NormalOperationData', + tabs: [ + { + name: '', + type: 'table', + // tableUrl: getUrl('/wmp-env-server/fb/bsmfr/GetKendoListCust'), + hiddenChart: true, + hiddenTabs: true, + // filter: NormalSelectFilter, + filterProps: { + params: {} + } + } + ] + }, + { + name: '过程图', + key: 'ProcessDiagram', + type: 'ProcessDiagram', + code: 'ylzzz.tabs.gct' + }, + { + name: '增殖放流情况', + key: 'NormalAddedSituation', //NormalAddedSituation + type: 'NormalAddedSituation', //NormalAddedSituation + default: true, // 默认显示 + tabs: [ + { + name: '', + type: 'table', + // tableUrl: getUrl('/wmp-env-server/fb/bsmfr/GetKendoListCust'), + hiddenChart: true, + hiddenTabs: true, + // filter: NormalFishFilter1, + filterProps: { + params: {} + } + } + ] + }, + + { + name: '科研情况', + key: 'NormalResearchSituation', // Normal2 + type: 'NormalResearchSituation', // Normal + code: 'ylzzz.tabs.kyqk', + tabs: [ + { + name: '', + type: 'table', + tableUrl: '/wmp-env-server/base/researchb/GetKendoList', + hiddenChart: true, + hiddenTabs: true, + // filter: NormalYearPickerFilter, + filterProps: { + params: {} + } + } + ] + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + } + // { + // name: "全景影像", + // key: "panoramaInfo", + // type: "panorama" + // }, +]; + +// const FBTabs1: Array = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// }, +// { +// name: '建设情况', +// key: 'FishFacilityBuildState', +// type: 'FishFacilityBuildState', +// url: '/wmp-env-server/env/fp/run/secondBuild/GetKendoListCust' +// }, +// { +// name: '实时视频', +// key: 'videoInfo', +// type: 'video', +// url: '/video/dataStcdFrame/getVideoMonitorList' +// }, +// { +// name: '全景影像', +// key: 'panoramaInfo', +// type: 'panorama' +// } +// ] +//鱼类栖息地 √ +const FHTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '水温监测', + key: 'WaterTemperature', + type: 'WaterTemperature', + code: 'qxd.tabs.jcsj' + }, + { + name: '水质监测', + key: 'WaterQuality', + type: 'WaterQuality', + code: 'qxd.tabs.szjc' + }, + { + name: '流量监测', + key: 'FlowMeasure', + type: 'FlowMeasure', + code: 'qxd.tabs.lcjs', + url: '/zq/river/GetKendoListCust' + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '' + } +]; +const ZQTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '流量监测', + key: 'FlowMeasure', + type: 'FlowMeasure', + url: '/zq/river/GetKendoListCust' + } +]; + +// //水质监测站 √ +const WQFBTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '监测数据', + key: 'WaterQuality', + type: 'WaterQuality', + default: true // 默认显示 + } + // { + // name: '实时视频', + // key: 'videoInfo', + // type: 'video', + // url: '/video/dataStcdFrame/getVideoMonitorList' + // } +]; +const WQTabs: Array = [ + ...WQFBTabs, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + } +]; +// const WQDTATabs: Array = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// }, +// { +// name: '劣化分析', +// key: 'trend', +// type: 'trend', +// tabs: [ +// { +// name: '', +// type: 'table', +// tableUrl: '/wmp-env-server/env/wq/trend/detail/GetKendoListCust', +// hiddenChart: true, +// hiddenTabs: true, +// filter: NormalDatePickerFilter +// } +// ] +// } +// ] + +//栖息地流量监测 +const FLOWTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '监测数据', + key: 'FlowMeasure', + type: 'FlowMeasure' + } +]; +// //水温监测站 √ +const WTTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '监测数据', + key: 'WaterTemperature', + type: 'WaterTemperature', + code: 'swjc.tabs.jcsj', + default: true // 默认显示 + }, + // { + // name: '出入库水温对比', + // key: 'WaterTemperatureContrast', + // type: 'WaterTemperatureContrast', + // code: 'swjc.tabs.crkswdb', + // }, + { + name: '鱼类繁殖适宜性分析', + key: 'WaterTemperatureRep', + type: 'WaterTemperatureRep', + code: 'swjc.tabs.ylfzsyxfx' + } +]; +//垂向水温 √ +const WTTabs1: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '监测数据', + key: 'VerticalWaterTemperature', + type: 'VerticalWaterTemperature', + code: 'cxsw.tabs.jcsj', + default: true // 默认显示 + } +]; + +// //低温水减缓设施 +const DWTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + default: true, // 默认显示 + url: '/eng/base/msstbprpt/getStcdInfo' + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + }, + { + name: '监测数据', + key: 'VerticalWaterTemperature', + type: 'VerticalWaterTemperature' + }, + { + name: '叠梁门运行AI识别', + key: 'AIYXSB', + type: 'AIYXSB' + } +]; +// //低温水减缓设施这是旧的 +// const DWTabs2: Array = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// }, +// { +// name: '实时视频', +// key: 'videoInfo', +// type: 'video', +// url: '/video/dataStcdFrame/getVideoMonitorList' +// }, +// { +// name: '监测数据', +// key: 'DWNormal', +// type: 'DWNormal', +// tabs: [ +// { +// name: '', +// type: 'DWNormal', +// tableUrl: '/env/dw/dwJcsjListGet', +// hiddenChart: true, +// hiddenTabs: true, +// filter: NormalDatePickerFilter, +// filterProps: { +// params: { +// // stcd: "0086601073SZ003524" +// } +// } +// } +// ] +// } +// ] +// //调查断面 +const WETabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '监测数据', + key: 'Ecology', + type: 'Ecology', + tabs: [ + { + name: '调查鱼类', + type: 'table', + key: 'weFish', + // tableUrl: getUrl('/wmp-env-server/env/we/fisht/GetKendoListCust'), + hiddenChart: true, + // filter: NormalWEFilter, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '水温(℃)', + type: 'table', + tableUrl: '/wmp-env-server/we/wewtr/GetKendoListCust', + key: 'weWaterTemp', + hiddenChart: true, + // filter: NormalWEFilter, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '水质', + type: 'table', + tableUrl: '/wmp-env-server/we/wewqr/GetKendoListCust', + key: 'weWaterQuality', + hiddenChart: true, + // filter: NormalWEFilter, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '流速(m/s)', + type: 'table', + key: 'weFlowVelocity', + tableUrl: '/wmp-env-server/env/we/fvR/GetKendoListCust', + hiddenChart: true, + // filter: NormalWEFilter, + filterProps: { + params: { ftype: 'WE' } + } + } + ] + } +]; +//鱼类调查装置 +const DEVICETABS: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + } +]; +// //电站告警 +const DZGJ: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '监测数据', + key: 'DZGJ', + type: 'DZGJ', + tabs: [ + { + name: '生态流量', + type: 'table', + key: 'STLL', + // filter: Session.getAppCode() == 'hbb' ? NormalYearPickerFilter : NormalDatePickerFilter, + tableUrl: '/wmp-env-server/env/warn/detail/GetKendoListCust', + hiddenChart: true, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '水位', + type: 'table', + key: 'SW', + // filter: Session.getAppCode() == 'hbb' ? NormalYearPickerFilter : NormalDatePickerFilter, + tableUrl: '/wmp-env-server/env/warn/detail/GetKendoListCust', + hiddenChart: true, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '水质', + type: 'table', + key: 'SZ', + // filter: Session.getAppCode() == 'hbb' ? NormalYearPickerFilter : NormalDatePickerFilter, + tableUrl: '/wmp-env-server/env/wqWar/GetKendoListCust', + hiddenChart: true, + filterProps: { + params: { ftype: 'WE' } + } + }, + { + name: '河道水温', + type: 'table', + key: 'HDSW', + // filter: Session.getAppCode() == 'hbb' ? NormalYearPickerFilter : NormalDatePickerFilter, + tableUrl: '/wmp-env-server/env/warn/detail/GetKendoListCust', + hiddenChart: true, + filterProps: { + params: { ftype: 'WE' } + } + } + ] + } +]; + +//珍稀植物园 +const VPTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + // { + // name: '实时视频', + // key: 'videoInfo', + // type: 'video', + // url: '/video/dataStcdFrame/getVideoMonitorList' + // }, + // { + // name: "全景影像", + // key: "panoramaInfo", + // type: "panorama", + // code: "zxzwy.tabs.qjyx" + // }, + { + name: '运行数据', + key: 'NormalDataMonitoring2', + type: 'NormalDataMonitoring2', + tabs: [ + { + name: '', + type: 'table', + tableUrl: '/evnInvestigation/getRareBotanicalGardenTable', + hiddenChart: true, + hiddenTabs: true, + // filter: NormalYearPickerFilter, + filterProps: { + params: {} + } + } + ] + } + // { + // name: "浇水养护", + // key: "FishSystemRunState", //Normal1 + // type: "FishSystemRunState", //Normal + // tabs: [] + // }, + // { + // name: "违规放牧", + // key: "FishSystemRunState", //Normal1 + // type: "FishSystemRunState", //Normal + // tabs: [] + // } +]; +// //视频站 +const videoTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '实时视频', + key: 'videoInfo', + type: 'video', + url: '/video/dataStcdFrame/getVideoMonitorList' + } +]; +// //视频站 +const noLiveVideoTabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '录像视频', + key: 'noLiveVideo', + type: 'noLiveVideo', + url: '/video/dataStcdFrame/getVideoMonitorList' + } +]; +// //动物救助站 +const VATabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + // { + // name: '实时视频', + // key: 'videoInfo', + // type: 'video', + // url: '/video/dataStcdFrame/getVideoMonitorList' + // }, + { + name: '监测数据', + key: 'Normal', + type: 'NormalDataMonitoring', + tabs: [ + { + name: '', + type: 'table', + tableUrl: '/engdbute/vaTable', + hiddenChart: true, + hiddenTabs: true, + // filter: NormalDatePickerFilter, + filterProps: { + params: {} + } + } + ] + } +]; + +// // //河道水情站 +// // const hdsqz: Array = [ +// // { +// // name: "基础信息", +// // key: "basicInfo", +// // type: "basic", +// // url: "/bbi/siteBipc/getSiteBasicInfo" +// // }, +// // { +// // name: "监测数据", +// // key: "monitorInfo", +// // type: "tabsWithTwo" +// // } +// // ] + +// // //视频监控站 +// // const spjkz: Array = [ +// // { +// // name: "基础信息", +// // key: "basicInfo", +// // type: "basic", +// // url: "/bbi/siteBipc/getSiteBasicInfo" +// // }, +// // { +// // name: "实时视频", +// // key: "videoInfo", +// // type: "video", +// // url: "/video/dataStcdFrame/getVideoMonitorList" +// // } +// // ] + +// 其他配置 +const CommonTabs: any = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/bbi/siteBipc/getSiteBasicInfo' + } +]; + +// 气象站 +const WeatherTabs: any = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '监测数据', + key: '', + type: '', + url: '' + } +]; + +// const WaterQualityMonitoring: any = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// }, +// { +// name: '告警数据', +// key: 'Monitoring', +// type: 'Monitoring', +// url: '/wmp-env-server/env/warn/stcd/detail/GetKendoListCust' +// } +// ] + +// const AIPrediction: any = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// }, +// { +// name: '监测数据', +// key: 'WaterQuality', +// type: 'WaterQuality' +// }, +// { +// name: 'AI预测', +// key: 'AI', +// type: 'AI' +// } +// ] +// const AIbasic: any = [ +// { +// name: '基础信息', +// key: 'basicInfo', +// type: 'basic', +// url: '/bbi/siteBipc/getSiteBasicInfo' +// } +// ] +//野生动物监测 +const WATabs: Array = [ + { + name: '基础信息', + key: 'basicInfo', + type: 'basic', + url: '/eng/base/msstbprpt/getStcdInfo', + default: true // 默认显示 + }, + { + name: '现场录像', + key: 'liveFootage', + type: 'liveFootage' + }, + { + name: '现场图片', + key: 'onSitePhoto', + type: 'onSitePhoto' + } +]; +// //mway : 1-是人工 , 2-是自动 dtinType: 0-自建 1-国家 2-人工 +const handleTabs = (modaldata: any) => { + if (!modaldata?.sttp) return; + const sttp = modaldata?.sttp ? modaldata?.sttp.toUpperCase() : ''; + console.log('sttp', sttp); + switch (sttp) { + case 'ENGJJ': + return ENGEQTabsJuangJu; + case 'ENG': + if (modaldata?.eqtp == 'QEC') { + return ENGEQTabs; + } else { + return ENGTabs; + } + case 'WT': // 水温 + case 'WTRV': // 垂向水温 + if (modaldata.enfc == '1') { + return WTTabs1; + } else { + return WTTabs; + } + case 'WQFB': + return WQFBTabs; + case 'WQ': + const _tabs = [...WQTabs]; + + if (modaldata?.dtinType == 2 || modaldata?.dtinType == 1) { + _tabs.splice(2, 1); //国家站 人工站把视频tab去除 + } + return _tabs; + case 'FH': + let arr = [...FHTabs]; + + if (modaldata?.bldstt == 2 || modaldata?.bldstt == 1) { + console.log('modaldata', modaldata); + arr = [arr[0]]; //国家站 人工站把视频tab去除 + } + return arr; + case 'FH_ZQ_POINT': + return FLOWTabs; + case 'FP_POINT': + return FPTabs; + case 'FB': + return FBTabs; + case 'VA': + return VATabs; + case 'VP': + return VPTabs; + case 'WE': + return WETabs; + case 'WVA': + return WATabs; + case 'VD_FBFM': + case 'VD': + case 'VD_FP': + return videoTabs; + case 'ENG_ALARM_POINT': + return DZGJ; + case 'FPRD': + return DEVICETABS; + // case 'DW_POINT': + // return DWTabs; + // case 'DW_5': + // return DEVICETABS; + // case 'DW_6': + // return DEVICETABS; + // case 'DW_1': + // return DEVICETABS; + // + if (modaldata?.eqtp == 'QEC') { + // const { page } = Utility.parseQueryString() + // if (page == 'shengTaiLiuLiangManZuQingKuangJiangJu') { + // return ENGEQTabsJuangJu + // } else { + return ENGEQTabs; + // } + } + // else { + // return Session.getAppCode() === 'hbb' ? ENGTabs.filter((e) => e.name !== '阶段属性') : ENGTabs + // } + case 'ENG_ALARM': + return DZGJ; + case 'EQ': + case 'EQ_1': + case 'EQ_2': + case 'EQ_3': + case 'EQ_4': + case 'EQ_5': + case 'EQ_6': + case 'EQ_7': + return EQTabs; + case 'DW': + case 'DW_1': + case 'DW_2': + case 'DW_3': + case 'DW_4': + case 'DW_5': + case 'DW_6': + return DWTabs; + case 'FP': //todo,后续再删除多余代码 + case 'FP_1': //todo,后续再删除多余代码 + // case "FP_2": //todo,后续再删除多余代码 + case 'FP_3': //todo,后续再删除多余代码 + case 'FP_4': //todo,后续再删除多余代码 + // case "FP_5": //todo,后续再删除多余代码 + + // mway为2的时侯显示在线监测数据 + if ( + modaldata.bldsttCcode == '1' || + modaldata.bldsttCcode == '0' || + modaldata.bldstt == '1' || + modaldata.bldstt == '0' + ) { + console.log(1); + return [ + ...FPTabs1 //建设情况 + ]; + } else { + console.log(2); + if (modaldata.mway != 2) { + console.log(3); + return FPTabs.filter(item => item.name !== '在线监测数据'); + } else { + console.log(4); + return [ + ...FPTabs //有监测数据 + ]; + } + } + + case 'FP_2': //todo,后续再删除多余代码 + case 'FP_5': //todo,后续再删除多余代码 + if ( + modaldata.bldsttCcode == '1' || + modaldata.bldsttCcode == '0' || + modaldata.bldstt == '1' || + modaldata.bldstt == '0' + ) { + return FPTabs1; + } else { + return FPTabs; + } + case 'ZQ': // 流量检测站 + return ZQTabs; + // case 'FB': + // if (modaldata.bldstt == '1' || modaldata.bldstt == '0') { + // return FBTabs1 + // } else { + // return FBTabs + // } + // case 'FH': + // return FHTabs + // case 'VD_FB': + // case 'VD_FP': + // case 'VD_SG': + // case 'VD_VP': + // case 'VD_EQ': + // case 'VD_DW': + // case 'VD_FH': + // case 'VD_OTWE': + // case 'VD_OTTE': + // case 'VD_FBP': + // case 'VD_FC': + // case 'VD_WQ': + // case 'VD_TE': + // case 'VD_WE': + // case 'VD_EQS': + // case 'VD_WT': + // case 'VD_FBFM': + // case 'VD_FBI': + // case 'VD_PR': + // case 'VD_FPB': + // case 'VD_GZFC': + // case 'VD_FPC': + // case 'VD_VA': + // case 'VD': + // return videoTabs + case 'VD_SN': + case 'VD_WVD': + return noLiveVideoTabs; + // case 'VP': + // return VPTabs + // case 'VA': + // return VATabs + + // case 'WQDTA': + // return WQDTATabs + // case 'LL': + // return FLOWTabs + // case 'WT': + // case 'WTRV': + // if (modaldata.enfc == '1') { + // return WTTabs1 + // } else { + // return WTTabs + // } + // case 'WE': + // return WETabs + case 'MM': + return WeatherTabs; + // case 'WARN': + // return WaterQualityMonitoring + // case 'AI': + // return AIPrediction + // case 'AI_Basic': + // return AIbasic + default: + return CommonTabs; + } +}; + +// const modalTabSetting = { +// footer: false, +// width: '90vw', +// bodyStyle: { minHeight: '600px', overflowX: 'auto' }, +// wrapClassName: 'no-padding custom-models', +// destroyOnClose: true, +// className: 'map-tabs' +// } + +// const modalTabSettingLy = { +// footer: false, +// // width: "90vw", +// // bodyStyle: { minHeight: "600px" }, +// wrapClassName: 'no-padding custom-models', +// destroyOnClose: true, +// className: 'map-tabs' +// } + +export { + ENGTabs, + // DWTabs, + // WQTabs, + // FLOWTabs, + // EQTabs, + // FBTabs, + // WETabs, + // FPTabs, + // VPTabs, + // FHTabs, + // WTTabs, + // VATabs, + // WTTabs1, + handleTabs + // modalTabSetting, + // modalTabSettingLy +}; diff --git a/frontend-sjgl/src/components/Pagination/index.vue b/frontend-sjgl/src/components/Pagination/index.vue new file mode 100644 index 00000000..7ae0c190 --- /dev/null +++ b/frontend-sjgl/src/components/Pagination/index.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/frontend-sjgl/src/components/Pagination/page.vue b/frontend-sjgl/src/components/Pagination/page.vue new file mode 100644 index 00000000..7e240ef3 --- /dev/null +++ b/frontend-sjgl/src/components/Pagination/page.vue @@ -0,0 +1,131 @@ + + + + + + \ No newline at end of file diff --git a/frontend-sjgl/src/components/SvgIcon/index.vue b/frontend-sjgl/src/components/SvgIcon/index.vue new file mode 100644 index 00000000..19d3cc96 --- /dev/null +++ b/frontend-sjgl/src/components/SvgIcon/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/frontend-sjgl/src/components/Upload/MultiUpload.vue b/frontend-sjgl/src/components/Upload/MultiUpload.vue new file mode 100644 index 00000000..5c342266 --- /dev/null +++ b/frontend-sjgl/src/components/Upload/MultiUpload.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/frontend-sjgl/src/components/Upload/SingleUpload.vue b/frontend-sjgl/src/components/Upload/SingleUpload.vue new file mode 100644 index 00000000..99375507 --- /dev/null +++ b/frontend-sjgl/src/components/Upload/SingleUpload.vue @@ -0,0 +1,97 @@ + + + + + + + diff --git a/frontend-sjgl/src/components/gis/GisView.vue b/frontend-sjgl/src/components/gis/GisView.vue new file mode 100644 index 00000000..57f2525f --- /dev/null +++ b/frontend-sjgl/src/components/gis/GisView.vue @@ -0,0 +1,195 @@ + + + + diff --git a/frontend-sjgl/src/components/gis/TjCascadeChart.vue b/frontend-sjgl/src/components/gis/TjCascadeChart.vue new file mode 100644 index 00000000..1d2d1c33 --- /dev/null +++ b/frontend-sjgl/src/components/gis/TjCascadeChart.vue @@ -0,0 +1,673 @@ + + + + + diff --git a/frontend-sjgl/src/components/gis/TjLayerModal.vue b/frontend-sjgl/src/components/gis/TjLayerModal.vue new file mode 100644 index 00000000..91d2e865 --- /dev/null +++ b/frontend-sjgl/src/components/gis/TjLayerModal.vue @@ -0,0 +1,537 @@ + + + + + diff --git a/frontend-sjgl/src/components/gis/gisUtils.ts b/frontend-sjgl/src/components/gis/gisUtils.ts new file mode 100644 index 00000000..2466a5fd --- /dev/null +++ b/frontend-sjgl/src/components/gis/gisUtils.ts @@ -0,0 +1,537 @@ +// import { Session } from '@zebras/qgc-share/service/Session' +import domtoimage from 'dom-to-image'; +import { + offset2, + drawDotImg2, + drawDotImg1, + offset1, + drawDotImg3, + offset3, + drawDotImg5, + offset5 +} from '@/utils/GisUrlList'; +declare global { + interface Window { + __lyConfigs?: { + theme?: string; + [key: string]: any; // 根据实际配置结构补充具体字段,或使用索引签名兼容其他属性 + }; + __mapMode?: string; // 建议同时声明代码中用到的其他全局变量 + } +} + +/** + * 根据镜头高度获取地图级别 + * @param {Number} height + */ +const A = 40487.57; +const B = 0.00007096758; +const C = 91610.74; +const D = -40467.74; + +/** + * 图例数据转对象 + * @param data 图例数据 + * @returns 以nameEn为下标的图例数据 + */ +export const legendData2Obj = (data: any[]) => { + const _tempData: any = {}; + const f = (_data: any[]) => { + _data.forEach(item => { + // childrenList有值表示这是一个分组 + if (item?.childrenList && item.childrenList?.length > 0) { + f(item.childrenList); + } else { + _tempData[item.nameEn] = item; + } + }); + }; + f(data); + return _tempData; +}; + +/** + * 添加标签偏移量等属性到item中 + * @param item - 待添加属性的item + * @param index - item的索引 + * @param labelType - 标签类型 + */ +export const appendOffsetPropties = (item: any, index: any, labelType = 2) => { + let drawDotImg = null; + let offset = null; + if (labelType == 2) { + drawDotImg = drawDotImg1; + offset = offset1; + addItemProperty(item, index, drawDotImg, offset); + } else if (labelType == 3) { + drawDotImg = drawDotImg2; + offset = offset2; + addItemProperty(item, index, drawDotImg, offset); + } else if (labelType == 4) { + drawDotImg = drawDotImg3; + offset = offset3; + addItemProperty2(item, index, drawDotImg, offset); + } else if (labelType == 5) { + drawDotImg = drawDotImg5; + offset = offset5; + addItemProperty2(item, index, drawDotImg, offset); + } +}; + +const addItemProperty2 = ( + item: any, + index: any, + drawDotImg: any, + offset: any +) => { + if (!drawDotImg || !offset) return; + item.icon_image = + index % 2 !== 0 + ? drawDotImg[item.anchoPointState]?.left || '' + : drawDotImg[item.anchoPointState]?.right || ''; + item.text_anchor = index % 2 !== 0 ? 'right' : 'left'; + item.text_offset = offset[item.icon_image]?.text_offset ?? [-10, -1.8]; + item.text_offset2 = offset[item.icon_image]?.text_offset2 ?? [-10, -1.8]; + item.icon_offset = [ + offset[item.icon_image]?.icon_x ?? -200, + offset[item.icon_image]?.icon_y ?? -50 + ]; + item.icon_offset2 = offset[item.icon_image]?.icon_offset2 ?? [-200, -50]; + item.billboard_offset = [ + offset[item.icon_image]?.billboard_x ?? -80, + offset[item.icon_image]?.billboard_y ?? -15 + ]; + item.label_offset = offset[item.icon_image]?.labelOffset ?? [100, 41]; +}; + +export const addItemProperty = ( + item: any, + index: any, + drawDotImg: any, + offset: any +) => { + if (!drawDotImg || !offset) return; + item.icon_image = + index % 2 !== 0 + ? drawDotImg[item.anchoPointState]?.left || '' + : drawDotImg[item.anchoPointState]?.right || ''; + item.text_offset = [ + offset[item.icon_image]?.text_x ?? -10, + offset[item.icon_image]?.text_y ?? -1.8 + ]; + item.icon_offset = [ + offset[item.icon_image]?.icon_x ?? -200, + offset[item.icon_image]?.icon_y ?? -50 + ]; + item.billboard_offset = [ + offset[item.icon_image]?.billboard_x ?? -80, + offset[item.icon_image]?.billboard_y ?? -15 + ]; + item.label_offset = offset[item.icon_image]?.labelOffset ?? [100, 41]; +}; + +/** + * 设置popName属性 + * @param item - 待设置popName的item + */ +export const setPopName = (item: any) => { + if (item.sttp === 'ENG') { + item.popName = item.ennm || item.titleName; + } else if (item.sttp === 'ylfb') { + if (item?.ftp?.length > 20) { + item.popName = item.ftp.slice(0, 20) + '...'; + } else { + item.popName = item?.ftp; + } + } else if (item.sttp === 'WE_FISH') { + item.popName = + item.fishList?.[0]?.fishName + `(${item.fishList?.[0]?.ptypeName})`; + item.popName1 = item.total + '尾'; + } else { + item.popName = item.stnm || item.titleName; + } +}; + +/** + * 获取图例配置中选中项的key + * @param data - 图例配置数据 + * @returns 选中项的key数组 + */ +export const getCheckedLayerConfigs = (data: any[]): any[] => { + const rs: any[] = []; + const f = (arr: any[] = []) => { + let count = 0; + arr.forEach((item: any) => { + if (item?.children && item.children.length > 0) { + const childrenCount = f(item.children); + if (childrenCount) { + rs.push(item.key); + } + } else if (item.checked) { + count++; + rs.push(item.key); // 对应图例的layerCode + } + }); + return count; + }; + f(data); + return rs; +}; + +// type mapType = "" | "pointMap" | "gisLayer" + +/** + * 将图层配置数据转换为一维数组 + * @param data - 图层配置数据 + * @returns 一维数组 + */ +export const layerConfig2Flat = (data: any): any[] => { + const rs: any[] = []; + const f = (arr: any[] = []) => { + arr.forEach((item: any) => { + const { type } = item; + if (type) { + if (type == 'GISMap') { + if (item?.children && item.children.length > 0) { + f(item.children); + } else { + rs.push(item); + } + } else if (type == 'pointMap') { + if ( + item.url || + item.title === '国家水文站' || + item.title === '自建水文站' + ) { + rs.push(item); + } else if (item.children.length > 0) { + f(item.children); + } + } + } else if (item.children.length > 0) { + f(item.children); + } + }); + }; + f(data); + return rs; +}; + +/** + * 替换图层配置中的 URL + * @param layerConfigsArr - 图层配置数组 + * @param urlList - URL 配置列表 + * @returns 更新后的图层配置数组 + */ +export const replaceUrl = (layerConfigsArr: any[], urlList: any[]): any[] => { + const bDict: Record = {}; + + // 构建 URL 映射字典 + for (let i = 0; i < urlList.length; i++) { + const key = urlList[i].url; + const title = urlList[i].title; + const keyType = urlList[i].keyType; + + if (!bDict[key]) bDict[key] = []; + if (!bDict[title]) bDict[title] = []; + if (!bDict[keyType]) bDict[keyType] = []; + + bDict[key].push(urlList[i]); + bDict[title].push(urlList[i]); + if (bDict[keyType]) { + bDict[keyType].push(urlList[i]); + } + } + + // 替换图层配置中的 URL + for (let i = 0; i < layerConfigsArr.length; i++) { + const obj = layerConfigsArr[i]; + const key = obj.url; + const title = obj.title; + const keyType = obj.key; + + const bObjList = bDict[keyType] || bDict[title] || bDict[key]; + + if (bObjList && bObjList.length > 0) { + const bObj = bObjList[0]; + obj.url = bObj.url; + obj.urlThd = bObj.url; + obj.params = bObj.params; + obj.orders = bObj.orders; + } else { + obj.url = ''; + } + } + + return layerConfigsArr; +}; + +/** + * 获取基础图层配置 + * @param config - 接口获取的配置数据 + * @returns 基础图层配置 + */ +export const getMapConfig = (config: any) => { + const r = { ...config }; + const baseUrlObj = import.meta.env.VITE_APP_MAP_URL; + if (baseUrlObj) { + r.url = baseUrlObj + r.url; // 'http://localhost:8088' + r.url_3d = baseUrlObj + r.url_3d; + // r.url = baseUrlObj.url + r.url //baseUrlObj.url + // r.url_3d = baseUrlObj.url + r.url_3d + if (r.geojson_url) { + r.geojson_url = baseUrlObj + r.geojson_url; + } + } + return r; +}; + +/** + * 重置地图元素位置 + */ +export const resetMapElPos = () => { + const legend = document.querySelector('#qgc-legendtl') as HTMLElement; // 图例 + // const filter = document.querySelector('#map-filter-container') as HTMLElement // 全局表单 + const controller = document.querySelector('#map-controller') as HTMLElement; // 地图工具栏 + const baselayer = document.querySelector('#map-baselayer') as HTMLElement; // 底图模式切换 + + if (legend) { + legend.style.left = '0'; + legend.style.bottom = '0'; + } + if (controller) { + controller.style.right = '480px'; + controller.style.bottom = '114px'; + } + if (baselayer) { + baselayer.style.right = '480px'; + baselayer.style.bottom = '20px'; + } +}; + +/** + * 根据位置获取布局数据列表 + * @param data - 布局数据 + * @param position - 位置 + * @returns 布局数据列表 + */ +const getListByPosition = (data: any, position: string) => + data?.data?.filter((el: any) => el.position === position && el.code); + +/** + * 设置地图组件位置 + * @param layoutType - 布局类型 + * @param data - 布局数据 + * @param offset - 偏移量 + */ +export const setMapLegendPos = ( + layoutType: string, + data: any, + offset = 456 +) => { + const menuStateString = localStorage.getItem('menuState'); //处理澜沧江左侧菜单状态 + const menuState = + menuStateString !== null ? JSON.parse(menuStateString) : true; + const _theme = localStorage.getItem('ly-theme') || window.__lyConfigs?.theme; + const leftEle = document.querySelector('#page-layout-left') as HTMLElement; + const rightEle = document.querySelector('#page-layout-right') as HTMLElement; + const bottomEle = document.querySelector( + '#page-layout-bottom' + ) as HTMLElement; + const legend = document.querySelector('#qgc-legendtl') as HTMLElement; // 图例 + const filter = document.querySelector('#map-filter-container') as HTMLElement; // 全局表单 + const compassControl = document.querySelector( + '#map-compassControl' + ) as HTMLElement; // 全局表单 + const controller = document.querySelector('#map-controller') as HTMLElement; // 地图工具栏 + const monitor = document.querySelector('#map-monitor') as HTMLElement; // 地图工具栏 + const baselayer = document.querySelector('#map-baselayer') as HTMLElement; // 底图模式切换 + // const vd = document.querySelector('#vd_operate') as HTMLElement // 底部视频 + const left = [ + 'layout1', + 'layout2', + 'layout3', + 'layout4', + 'layout6', + 'layout7', + 'layout8', + 'layout9', + 'layout10', + 'layout11', + 'layout14', + 'layout15', + 'layout16', + 'layout17' + ]; // 左侧布局 + const right = [ + 'layout1', + 'layout2', + 'layout3', + 'layout4', + 'layout5', + 'layout6', + 'layout8', + 'layout10', + 'layout11', + 'layout15', + 'layout16', + 'layout17' + ]; // 右侧布局 + const bottom1 = [ + 'layout1', + 'layout6', + 'layout8', + 'layout9', + 'layout10', + 'layout16' + ]; // 三行底部布局 + const bottom2 = ['layout2', 'layout15']; // 四行底部布局 + const w = `${offset}px`; + const l = `${_theme === 'ly-8' ? (menuState ? 643 : 510) : offset}px`; + let b = `0px`; + const le = ['layout17', 'layout10'].includes(layoutType) ? 0 : 1; + const leftList = getListByPosition(data, 'left'); + const rightList = getListByPosition(data, 'right'); + const bottomList = getListByPosition(data, 'bottom'); + let bottom = '0'; + + if (_theme === 'ly-8') { + if (window.__mapMode === '3D') { + b = `200px`; + } else { + b = `${menuState ? 200 : 50}px`; + } + } + + if (bottomList?.length > 0) { + if (bottom1.includes(layoutType)) { + bottom = 'calc((100% - 16px) / 3 + 8px)'; + } + if (bottom2.includes(layoutType)) { + bottom = 'calc((100% - 24px) / 4 + 8px)'; + } + } else { + // 没有底部布局时,底部高度为 + bottom = '28px'; + } + + const rle = ['layout6'].includes(layoutType) || bottom != '28px' ? 0 : 1; + + const leftHide = leftEle?.classList?.contains('hide'); + const rightHide = rightEle?.classList?.contains('hide'); + const bottomHide = bottomEle?.classList?.contains('hide'); + if (legend) { + legend.style.left = + !leftHide && left.includes(layoutType) && leftList?.length > le ? l : b; + legend.style.bottom = bottomHide + ? '0' + : bottomList?.length > 0 + ? bottom + : '12px'; + } + if (filter) { + if (layoutType === 'layout10') { + filter.style.left = + !leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b; + } else { + filter.style.left = + !leftHide && + left.includes(layoutType) && + leftList?.length > 0 && + layoutType !== 'layout17' + ? l + : b; + } + } + if (compassControl) { + if (layoutType === 'layout10') { + compassControl.style.left = + !leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b; + } else { + compassControl.style.left = + !leftHide && + left.includes(layoutType) && + leftList?.length > 0 && + layoutType !== 'layout17' + ? l + : b; + } + } + if (controller) { + controller.style.right = + !rightHide && right.includes(layoutType) && rightList?.length > rle + ? w + : '0'; + controller.style.bottom = bottomHide ? '0' : bottom; + } + if (monitor) { + monitor.style.right = + !rightHide && right.includes(layoutType) && rightList?.length > rle + ? w + : '0'; + // monitor.style.bottom = bottomHide ? '0' : bottom + } + if (baselayer) { + baselayer.style.right = + !rightHide && right.includes(layoutType) && rightList?.length > rle + ? `calc(${w} + 60px)` + : '60px'; + baselayer.style.bottom = bottomHide ? '0' : bottom; + } +}; + +export const altitudeToZoom = (height: number) => { + const lv = + Math.round(D + (A - D) / (1 + Math.pow(Number(height) / C, B))) + 1; + return lv > -1 ? lv : 0; +}; +/** + * 根据地图级别获取镜头高度 + * @param {Number} zoom + */ +export const zoomToAltitude = (zoom: number) => { + return Math.round(C * Math.pow((A - D) / (zoom - D) - 1, 1 / B)); +}; + +export const mapOutPut = (imageUrl: string) => { + const canvas = document.createElement('canvas'); + const downloadElement = document.createElement('a'); + const mapElem = document.getElementById('mapContainer'); + if (mapElem == null) { + return; + } + const context = canvas.getContext('2d')!; + canvas.width = mapElem.offsetWidth; + canvas.height = mapElem.offsetHeight; + const image = new Image(); + image.src = imageUrl; + image.onload = () => { + context.drawImage(image, 0, 0); + const elem: any = document.getElementById('qgc-legendtl'); + const l = elem?.style?.left === '' ? 0 : parseInt(elem?.style?.left); + if (elem) { + domtoimage + .toPng(elem, { + quality: 1.0, + width: elem.offsetWidth + (l + 24), + height: mapElem.offsetHeight - 20 + }) + .then((legendUrl: string) => { + const image = new Image(); + image.src = legendUrl; + image.width = elem.offsetWidth; + image.onload = () => { + context.drawImage(image, 0, 0); + downloadElement.href = canvas.toDataURL('image/png'); + downloadElement.download = '地图截图'; + downloadElement.click(); + }; + }) + .catch(() => {}); + } else { + downloadElement.href = canvas.toDataURL('image/png'); + downloadElement.download = 'download'; + downloadElement.click(); + } + }; +}; diff --git a/frontend-sjgl/src/components/gis/map.cesium.ts b/frontend-sjgl/src/components/gis/map.cesium.ts new file mode 100644 index 00000000..73ae8be7 --- /dev/null +++ b/frontend-sjgl/src/components/gis/map.cesium.ts @@ -0,0 +1,2809 @@ +import * as Cesium from 'cesium'; +import type { MDOptions } from './map.class'; +import type { MapInterface, layer } from './map.d'; +import { getIconPath } from '@/utils/index'; +import { + generatePopupHtml, + shouldPreferEng2Popup, + getNormalizedPopupSttpMap +} from '@/utils/popupHtmlGenerator'; +import { useModelStore } from '@/store/modules/model'; +import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules'; +import { + LoadOSGB, + removeQxsy, + osgbChangeClick, + osgbLocation, + type OSGBItem +} from './osgbUtils'; + +export class MapCesium implements MapInterface { + private viewer: Cesium.Viewer | null = null; + private _ready = false; + private _pendingOSGBItems: OSGBItem[] = []; + private clickEventHandler: Cesium.ScreenSpaceEventHandler | null = null; + private popupElement: HTMLElement | null = null; + private hoveredEntityId: string | null = null; + private hoverRafId: number | null = null; // requestAnimationFrame 节流 + private removePostRenderListener: (() => void) | null = null; + private removeCameraChangedListener: (() => void) | null = null; + private isBatchPopupMode = false; + private batchPopupContainer: HTMLDivElement | null = null; + private batchPopupItems: Array<{ + entity: Cesium.Entity; + element: HTMLDivElement; + popupWidth: number; + popupHeight: number; + }> = []; + private batchPostRenderRemover: (() => void) | null = null; + private containerId = ''; + private containerElement: HTMLElement | null = null; + private loadingOverlayElement: HTMLDivElement | null = null; + private loadingSpinnerAnimation: Animation | null = null; + private flightFallbackTimer: number | null = null; + private imageryBaseLayer: Cesium.ImageryLayer | null = null; + private baseLayerRegistry = new Map(); + private baseLayerAliasMap = new Map(); + private pointLayerRegistry = new Map(); + private hydropBaseConfig: any = null; + private BASEID = ''; + private currentClipGeoJson: any = null; + private clipRequestController: AbortController | null = null; + private maskPolygonEntities: Cesium.Entity[] = []; + private originalBgColor: Cesium.Color | null = null; + private skyBoxShown = true; + private skyAtmosphereShown = true; + private readonly IGNORED_BASE_LAYER_KEYS = new Set([ + 'powerBaseStation', + 's_hydropBase_wfs' + ]); + private readonly PRIMARY_BASE_LAYER_KEYS = new Set([ + 'customBaseLayer', + 's_province_boundaries', + 'BASEMAP-white', + 'BASEMAP-img' + ]); + + private readonly CHINA_CENTER = { lng: 104.5, lat: 36.5 }; + private readonly CHINA_BOOT_HEIGHT = 20000000; + private readonly CHINA_DEFAULT_HEIGHT = 9000000; + private readonly CHINA_VIEW_ORIENTATION = { + heading: Cesium.Math.toRadians(-6), + pitch: Cesium.Math.toRadians(-90), + roll: 0 + }; + private readonly CESIUM_ZOOM_FORMULA_A = 40487.57; + private readonly CESIUM_ZOOM_FORMULA_B = 0.00007096758; + private readonly CESIUM_ZOOM_FORMULA_C = 91610.74; + private readonly CESIUM_ZOOM_FORMULA_D = -40467.74; + private readonly HOVER_POPUP_MAX_HEIGHT = 9_000_000; // ~zoom 4.5,中国视角以上不触发 hover + private readonly BATCH_POPUP_MODE_ZOOM = 14.9; // zoom >= 14.9 进入批量固定模式(float 容差避免 15 刚好踩边界) + + // ==================== Step 6: 碰撞检测 ==================== + private collisionRefreshFrameId: number | null = null; + private labelVisibilityDebounceTimerId: number | null = null; + private readonly COLLISION_GRID_CELL_SIZE = 96; // 与 2D 一致 + private readonly DENSITY_ISOLATION_THRESHOLD = 56; // 孤立点 pixel 阈值 + private readonly COLLISION_LABEL_PADDING = 4; // 标签碰撞 padding + + // 图标缩放可调参数(只影响 3D Cesium,不参与 2D 计算) + // scale = base + (zoom - 4.5) * rate,钳位到 [min, max] + // zoom≈4.5 是中国全国视角,zoom≈15 是最大放大级别 + private readonly ICON_MIN_SCALE = 0.4; // 最小缩放 + private readonly ICON_MAX_SCALE = 1.2; // 最大缩放(限制放大后图标不超过 1.2x 基础值) + private readonly ICON_BASE_SCALE = 0.7; // zoom≈4.5 基准(中国视角图标 ≈ 原始尺寸) + private readonly ICON_SCALE_RATE = 0.035; // 每级 zoom 增长(放大 10 级才增加 ~0.35) + + // 标签文字可调参数 + // fontSize = clamp(base * scale, min, max),scale = 0.7 + (zoom-4.5)*0.08 + private readonly LABEL_FONT_MIN = 10; // 最小字号(px),改大 → 小缩放时文字更清晰 + private readonly LABEL_FONT_MAX = 20; // 最大字号(px) + private readonly LABEL_FONT_BASE = 16; // 基准乘数,改大 → 所有缩放级别文字都变大 + private readonly LABEL_OFFSET_SINGLE = 14; // 单行偏移系数,改大 → 文字离图标更远 + private readonly LABEL_OFFSET_MULTI = 30; // 多行偏移系数 + + // ==================== Step 1: 初始化 + 飞中国 ==================== + + async init(container: HTMLElement, _rectangle?: any): Promise { + try { + this.containerId = container.id; + this.containerElement = container; + this.showLoadingOverlay(container); + const token = 'bearer fa8aa37c-1e52-4631-a699-625b4147ace8'; + + this.viewer = new Cesium.Viewer(container, { + animation: false, + timeline: false, + baseLayerPicker: false, + fullscreenButton: false, + vrButton: false, + geocoder: false, + homeButton: false, + sceneModePicker: false, + navigationHelpButton: false, + infoBox: false, + selectionIndicator: false, + shouldAnimate: true, + requestRenderMode: false, + targetFrameRate: 30, + terrainProvider: new Cesium.EllipsoidTerrainProvider() // 默认不使用地形 + }); + this.viewer.cesiumWidget.creditContainer.style.display = 'none'; + const layers = this.viewer.imageryLayers; + layers.removeAll(); + const provider = new Cesium.UrlTemplateImageryProvider({ + url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + maximumLevel: 19, + credit: + 'Esri, DigitalGlobe, GeoEye, i-cubed, USDA FSA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community' + }); + const customTerrain = await Cesium.CesiumTerrainProvider.fromUrl( + import.meta.env.VITE_APP_MAP_URL + '/Terrain?token=' + token, // 指向包含 layer.json 的目录 + { + requestVertexNormals: true + } + ); + + // 应用地形到Viewer + this.viewer.terrainProvider = customTerrain; + + this.imageryBaseLayer = layers.addImageryProvider(provider); + this.imageryBaseLayer.show = true; + + this.viewer.scene.globe.depthTestAgainstTerrain = true; + this.viewer.scene.globe.show = true; + this.viewer.scene.fog.enabled = false; + this.viewer.scene.fxaa = false; + this.viewer.useBrowserRecommendedResolution = true; + + await this.flyToChina(); + + this.setupClickHandler(); + this.setupCameraPopupReset(); + + this._ready = true; + console.log('[Cesium] init complete, viewer ready'); + + // 初始化完成后等 5 秒再加载倾斜摄影,确保渲染管线稳定 + setTimeout(() => { + this.flushPendingOSGB(); + }, 5000); + + return this.viewer; + } catch (error) { + this.hideLoadingOverlay(); + console.error('Cesium Init Critical Error:', error); + throw error; + } + } + + private flyToChina(): Promise { + return new Promise(resolve => { + if (!this.viewer) { + this.hideLoadingOverlay(); + resolve(); + return; + } + + // Step 1: 瞬跳至高空俯视中国 + this.viewer.camera.cancelFlight(); + this.viewer.camera.setView({ + destination: Cesium.Cartesian3.fromDegrees( + this.CHINA_CENTER.lng, + this.CHINA_CENTER.lat, + this.CHINA_BOOT_HEIGHT + ), + orientation: this.CHINA_VIEW_ORIENTATION + }); + this.viewer.scene.requestRender(); + + // Step 2: 等一帧让 setView 生效后,飞入到默认视角 + requestAnimationFrame(() => { + const finish = () => { + this.clearFlightFallbackTimer(); + this.hideLoadingOverlay(); + resolve(); + }; + + this.clearFlightFallbackTimer(); + this.flightFallbackTimer = window.setTimeout(() => { + finish(); + }, 2600); + + this.viewer!.camera.flyTo({ + destination: Cesium.Cartesian3.fromDegrees( + this.CHINA_CENTER.lng, + this.CHINA_CENTER.lat, + this.CHINA_DEFAULT_HEIGHT + ), + orientation: this.CHINA_VIEW_ORIENTATION, + duration: 1.8, + complete: finish, + cancel: finish + }); + }); + }); + } + + private clearFlightFallbackTimer() { + if (this.flightFallbackTimer !== null) { + window.clearTimeout(this.flightFallbackTimer); + this.flightFallbackTimer = null; + } + } + + private showLoadingOverlay(container: HTMLElement) { + this.hideLoadingOverlay(); + + const overlay = document.createElement('div'); + overlay.setAttribute('data-map-cesium-loading', 'true'); + overlay.style.position = 'absolute'; + overlay.style.inset = '0'; + overlay.style.display = 'flex'; + overlay.style.flexDirection = 'column'; + overlay.style.alignItems = 'center'; + overlay.style.justifyContent = 'center'; + overlay.style.gap = '12px'; + overlay.style.background = + 'linear-gradient(180deg, rgba(7, 20, 36, 0.72) 0%, rgba(7, 20, 36, 0.46) 100%)'; + overlay.style.zIndex = '30'; + overlay.style.backdropFilter = 'blur(2px)'; + overlay.style.pointerEvents = 'auto'; + + const spinner = document.createElement('div'); + spinner.style.width = '36px'; + spinner.style.height = '36px'; + spinner.style.borderRadius = '50%'; + spinner.style.border = '3px solid rgba(255, 255, 255, 0.25)'; + spinner.style.borderTopColor = '#ffffff'; + this.loadingSpinnerAnimation = spinner.animate( + [{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }], + { duration: 900, iterations: Infinity, easing: 'linear' } + ); + + const label = document.createElement('div'); + label.textContent = '3D场景加载中...'; + label.style.color = '#ffffff'; + label.style.fontSize = '14px'; + label.style.lineHeight = '20px'; + label.style.letterSpacing = '0.5px'; + label.style.textShadow = '0 1px 2px rgba(0, 0, 0, 0.35)'; + + overlay.appendChild(spinner); + overlay.appendChild(label); + container.appendChild(overlay); + this.loadingOverlayElement = overlay; + } + + private hideLoadingOverlay() { + if (this.loadingSpinnerAnimation) { + this.loadingSpinnerAnimation.cancel(); + this.loadingSpinnerAnimation = null; + } + if (this.loadingOverlayElement?.parentNode) { + this.loadingOverlayElement.parentNode.removeChild( + this.loadingOverlayElement + ); + } + this.loadingOverlayElement = null; + } + + // ==================== Step 7: 点击锚点打开详情弹框 ==================== + + private setupClickHandler() { + if (!this.viewer) return; + if (this.clickEventHandler) { + this.clickEventHandler.destroy(); + } + + const modelStore = useModelStore(); + const canvas = this.viewer.scene.canvas; + this.clickEventHandler = new Cesium.ScreenSpaceEventHandler(canvas); + + // 默认箭头光标,与 2D 一致(不显示拖拽小手) + canvas.style.cursor = 'default'; + + // 鼠标移动:光标样式 + hover popup(rAF 节流,批量模式下只改光标) + let pendingMoveEvent: { endPosition: Cesium.Cartesian2 } | null = null; + + this.clickEventHandler.setInputAction( + (move: { endPosition: Cesium.Cartesian2 }) => { + pendingMoveEvent = move; + + if (this.hoverRafId !== null) return; // 已有待处理的帧,跳过 + this.hoverRafId = requestAnimationFrame(() => { + this.hoverRafId = null; + const evt = pendingMoveEvent; + pendingMoveEvent = null; + if (!evt) return; + + const scene = this.viewer?.scene; + if (!scene) return; + + const cameraHeight = this.getCurrentCameraHeight(); + // 缩放门槛:中国视角以上不触发 hover + if (cameraHeight > this.HOVER_POPUP_MAX_HEIGHT) { + canvas.style.cursor = 'default'; + this.hidePopup(); + return; + } + + const picked = scene.pick(evt.endPosition); + const entity = + Cesium.defined(picked) && picked.id instanceof Cesium.Entity + ? (picked.id as Cesium.Entity) + : null; + + // 检测是否命中可交互的锚点 + if (entity && this.isEntityInteractive(entity)) { + canvas.style.cursor = 'pointer'; + + // 批量模式下单点 hover 不触发 popup + if (this.isBatchPopupMode) return; + + // 同一个实体不重复刷新 + if (this.hoveredEntityId === entity.id) { + const position = entity.position?.getValue( + this.viewer!.clock.currentTime + ); + if (position) { + this.updatePopupPosition(position); + } + return; + } + + this.showPopupForEntity(entity); + return; + } + + canvas.style.cursor = 'default'; + // 批量模式下不隐藏批量 popup + if (!this.isBatchPopupMode) { + this.hidePopup(); + } + }); + }, + Cesium.ScreenSpaceEventType.MOUSE_MOVE + ); + + // 点击:打开详情弹框 + this.clickEventHandler.setInputAction( + (click: { position: Cesium.Cartesian2 }) => { + const scene = this.viewer?.scene; + if (!scene) return; + + const picked = scene.pick(click.position); + if (!Cesium.defined(picked) || !picked.id) return; + + const entity = picked.id as Cesium.Entity; + if (!this.isEntityInteractive(entity)) return; + + const rawData: Record = (entity as any)._rawData || {}; + + if (rawData.sttpMap === 'ylfb') { + modelStore.ylfbModalVisible = true; + modelStore.params = rawData; + } else { + modelStore.modalVisible = true; + modelStore.params = rawData; + modelStore.title = rawData.titleName || rawData.stnm; + } + }, + Cesium.ScreenSpaceEventType.LEFT_CLICK + ); + } + + // ==================== Step 5: hover popup + 批量 popup ==================== + + /** 监听相机移动结束:检测缩放阈值切换批量模式 */ + private setupCameraPopupReset() { + if (!this.viewer) return; + + if (this.removePostRenderListener) { + this.removePostRenderListener(); + this.removePostRenderListener = null; + } + if (this.removeCameraChangedListener) { + this.removeCameraChangedListener(); + this.removeCameraChangedListener = null; + } + + // camera.changed:相机运动中实时刷新碰撞检测(debounce 150ms) + this.removeCameraChangedListener = + this.viewer.camera.changed.addEventListener(() => { + this.requestRefreshPointLabelVisibility(false, 150); + }); + + this.removePostRenderListener = this.viewer.camera.moveEnd.addEventListener( + () => { + const zoom = this.getZoomLevelFromCameraHeight( + this.getCurrentCameraHeight() + ); + + if (zoom >= this.BATCH_POPUP_MODE_ZOOM) { + if (!this.isBatchPopupMode) { + this.enableBatchPopupMode(); + } else { + // 已处于批量模式:重建 popup(与 2D moveend 行为对齐) + // 拖拽/平移后视口内可能出现新的可见锚点,仅 postRender 重定位无法创建新 popup + // 同时修复 zoom 进出循环后 popup 消失的问题 + this.rebuildBatchPopupsIfNeeded(); + } + } else { + if (this.isBatchPopupMode) { + this.disableBatchPopupMode(); + } + // hover popup 重定位而非隐藏,避免缩放结束后闪烁 + if (this.hoveredEntityId) { + this.repositionHoverPopup(); + } + } + + // Step 6: 碰撞检测 — 相机停止移动后重新计算图标/标签可见性 + this.requestRefreshPointLabelVisibility(); + } + ); + } + + /** 根据 hoveredEntityId 重定位 popup(相机移动后调用,不重建内容) */ + private repositionHoverPopup(): void { + if (!this.viewer || !this.popupElement || !this.hoveredEntityId) return; + const entity = this.viewer.entities.getById(this.hoveredEntityId); + if (!entity || !entity.position) { + this.hidePopup(); + return; + } + const position = entity.position.getValue(this.viewer.clock.currentTime); + if (!position) { + this.hidePopup(); + return; + } + this.updatePopupPosition(position); + } + + /** 批量模式下每帧更新 popup 位置,实现流畅跟随拖拽 */ + private setupBatchPopupPostRenderSync() { + if (!this.viewer || this.batchPostRenderRemover) return; + this.batchPostRenderRemover = this.viewer.scene.postRender.addEventListener( + () => { + if (!this.isBatchPopupMode) return; + this.updateBatchPopupPositions(); + } + ); + } + + /** 停止每帧同步 */ + private clearBatchPopupPostRenderSync() { + if (this.batchPostRenderRemover) { + this.batchPostRenderRemover(); + this.batchPostRenderRemover = null; + } + } + + /** 获取当前相机高度(米) */ + private getCurrentCameraHeight(): number { + if (!this.viewer) return Number.POSITIVE_INFINITY; + const height = this.viewer.camera.positionCartographic.height; + if (!height || !isFinite(height) || height <= 0) { + return Number.POSITIVE_INFINITY; + } + return height; + } + + /** 将相机高度映射为近似 2D zoom 级别(与 getCurrentCesiumZoom 同公式) */ + private getZoomLevelFromCameraHeight(height: number): number { + const zoom = + this.CESIUM_ZOOM_FORMULA_D + + (this.CESIUM_ZOOM_FORMULA_A - this.CESIUM_ZOOM_FORMULA_D) / + (1 + + Math.pow( + height / this.CESIUM_ZOOM_FORMULA_C, + this.CESIUM_ZOOM_FORMULA_B + )) + + 1; + return zoom > -1 ? zoom : 0; + } + + /** 判断实体是否属于 ENG 类型(用于 popup 碰撞优先保留,与 isEntityEng 对齐) */ + private isEngEntity(entity: Cesium.Entity): boolean { + const e = entity as any; + // 优先从实体 properties._sttpMap 直接检查(与 Entity 创建时设置的 _sttpMap 一致) + const sttpFromProps = String(e._sttpMap || '').toUpperCase(); + if (sttpFromProps.startsWith('ENG')) return true; + // 其次从 _rawData 检查 + const rawData = e._rawData as Record | undefined; + if (!rawData) return false; + const sttpMap = getNormalizedPopupSttpMap(rawData).toUpperCase(); + return sttpMap.startsWith('ENG'); + } + + /** 判断实体当前是否可交互(图层可见 + 图例可见 + 区域可见) */ + private isEntityInteractive(entity: Cesium.Entity): boolean { + const e = entity as any; + if (e._layerVisible === false) return false; + if (e._legendVisible === false) return false; + if (e._regionVisible === false) return false; + if (entity.show === false) return false; + return true; + } + + /** 根据实体属性生成 popup HTML,复用 generatePopupHtml */ + private getPopupHtml(rawData: Record): string { + return rawData.popupHtml || generatePopupHtml(rawData) || ''; + } + + /** 关闭单个 hover popup */ + private hidePopup(): void { + this.hoveredEntityId = null; + if (!this.popupElement) return; + this.popupElement.style.display = 'none'; + this.popupElement.innerHTML = ''; + } + + /** 判断 3D 位置是否被地形遮挡(基于射线与 terrain 求交) */ + private isPositionBehindTerrain(position: Cesium.Cartesian3): boolean { + if (!this.viewer) return true; + const scene = this.viewer.scene; + + const windowCoord = Cesium.SceneTransforms.worldToWindowCoordinates( + scene, + position + ); + if (!windowCoord) return true; // 在地球背面 + + const ray = scene.camera.getPickRay(windowCoord); + if (!ray) return false; + + const terrainPos = scene.globe.pick(ray, scene); + if (!terrainPos) return false; // 该方向无地形 + + const cameraPos = scene.camera.positionWC; + const terrainDist = Cesium.Cartesian3.distance(cameraPos, terrainPos); + const entityDist = Cesium.Cartesian3.distance(cameraPos, position); + // 地形交点明显更近 → 实体被遮挡 + return terrainDist + 10 < entityDist; + } + + /** 根据实体世界坐标把 popup 定位到屏幕坐标 */ + private updatePopupPosition(position: Cesium.Cartesian3): void { + if (!this.viewer || !this.popupElement) return; + + // 被地形遮挡时隐藏 popup + if (this.isPositionBehindTerrain(position)) { + this.hidePopup(); + return; + } + + const canvasPosition = Cesium.SceneTransforms.worldToWindowCoordinates( + this.viewer.scene, + position + ); + + if (!canvasPosition) { + this.hidePopup(); + return; + } + + this.popupElement.style.left = `${canvasPosition.x}px`; + this.popupElement.style.top = `${canvasPosition.y}px`; + this.popupElement.style.display = 'block'; + } + + /** 读取实体原始数据并渲染 hover popup */ + private showPopupForEntity(entity: Cesium.Entity): void { + if (!this.viewer || !this.popupElement || !entity.position) return; + + const rawData: Record = { + ...((entity as any)._rawData || {}) + }; + if (!rawData.sttpMap) { + rawData.sttpMap = rawData._sttpMap || rawData.popupSttpMap || ''; + } + const popupHtml = this.getPopupHtml(rawData); + const position = entity.position.getValue(this.viewer.clock.currentTime); + + if (!popupHtml || !position) { + this.hidePopup(); + return; + } + + this.popupElement.innerHTML = popupHtml; + this.hoveredEntityId = entity.id; + this.updatePopupPosition(position); + } + + // ==================== 批量 popup ==================== + + /** 启用批量 popup:所有可见锚点固定显示 popup */ + private enableBatchPopupMode() { + console.log('[Cesium] enableBatchPopupMode'); + this.isBatchPopupMode = true; + this.clearBatchPopups(); + this.hidePopup(); // 清除可能残留的 hover popup + // 先同步执行碰撞检测,确保 _iconCollisionVisible 已正确计算, + // 避免重叠锚点的 popup 在 showBatchPopups 中被短暂创建 + this.refreshPointLabelVisibility(); + // 等所有 chunk 处理完再注册 postRender,避免用不完整列表做碰撞 + this.showBatchPopups().then(() => { + if (this.isBatchPopupMode) { + this.setupBatchPopupPostRenderSync(); + } + }); + } + + /** 退出批量 popup */ + private disableBatchPopupMode() { + console.log('[Cesium] disableBatchPopupMode'); + this.isBatchPopupMode = false; + this.clearBatchPopupPostRenderSync(); + this.clearBatchPopups(); + this.hidePopup(); + } + + /** 收集视口内可交互实体并按 X 坐标排序(ENG 优先) */ + private collectBatchPopupCandidates(): Array<{ + entity: Cesium.Entity; + x: number; + y: number; + popupHtml: string; + }> { + if (!this.viewer) return []; + + const canvas = this.viewer.scene.canvas; + const viewW = canvas.clientWidth; + const viewH = canvas.clientHeight; + const padding = 60; + + const candidates: Array<{ + entity: Cesium.Entity; + x: number; + y: number; + popupHtml: string; + }> = []; + + this.pointLayerRegistry.forEach(entities => { + entities.forEach(entity => { + if (!this.isEntityInteractive(entity)) return; + // 图标被碰撞/密度隐藏的锚点不展示 popup(没有可见图标,popup 无意义且干扰碰撞) + if ((entity as any)._iconCollisionVisible === false) return; + const position = entity.position?.getValue( + this.viewer!.clock.currentTime + ); + if (!position) return; + + const cp = Cesium.SceneTransforms.worldToWindowCoordinates( + this.viewer!.scene, + position + ); + if (!cp) return; + + if ( + cp.x < -padding || + cp.y < -padding || + cp.x > viewW + padding || + cp.y > viewH + padding + ) + return; + + // 被地形遮挡的不展示 popup + if (this.isPositionBehindTerrain(position)) return; + + const rawData: Record = { + ...((entity as any)._rawData || {}) + }; + if (!rawData.sttpMap) { + rawData.sttpMap = rawData._sttpMap || rawData.popupSttpMap || ''; + } + + let popupHtml = shouldPreferEng2Popup(rawData) + ? generatePopupHtml(rawData, { forceEng2: true }) || + rawData.popupHtml || + generatePopupHtml(rawData) + : this.getPopupHtml(rawData); + + if (!popupHtml) { + const title = rawData.titleName || rawData.stnm || rawData.ennm || ''; + if (!title) return; + popupHtml = `
${title}
`; + } + + candidates.push({ entity, x: cp.x, y: cp.y, popupHtml }); + }); + }); + + // 按 X 坐标排序,X 接近时(5px 容差,3D 投影浮点误差)ENG 优先 + candidates.sort((a, b) => { + const dx = a.x - b.x; + if (Math.abs(dx) > 5) return dx; + const aEng = this.isEngEntity(a.entity) ? 0 : 1; + const bEng = this.isEngEntity(b.entity) ? 0 : 1; + if (aEng !== bEng) return aEng - bEng; + return dx; + }); + + return candidates; + } + + /** 在指定容器中分帧构建 popup DOM(避免卡顿),完成后 resolve */ + private buildBatchPopupsInContainer( + container: HTMLDivElement, + candidates: Array<{ + entity: Cesium.Entity; + x: number; + y: number; + popupHtml: string; + }> + ): Promise { + return new Promise(resolve => { + let index = 0; + const CHUNK_SIZE = 80; + const placedPopups: Array<{ + left: number; + right: number; + top: number; + bottom: number; + entity: Cesium.Entity; + element: HTMLDivElement; + }> = []; + + const processChunk = () => { + if (!this.isBatchPopupMode) return; + + const end = Math.min(index + CHUNK_SIZE, candidates.length); + for (let i = index; i < end; i++) { + const { entity, x, y, popupHtml } = candidates[i]; + + const popupEl = document.createElement('div'); + popupEl.className = + this.popupElement?.className || 'map-popup-container'; + popupEl.innerHTML = popupHtml; + popupEl.style.position = 'absolute'; + popupEl.style.display = 'block'; + popupEl.style.transform = 'translate(-50%, calc(-100% - 10px))'; + popupEl.style.pointerEvents = 'none'; + + // 先隐藏测量尺寸 + popupEl.style.visibility = 'hidden'; + popupEl.style.left = `${x}px`; + popupEl.style.top = `${y}px`; + container.appendChild(popupEl); + + const rect = popupEl.getBoundingClientRect(); + const pw = rect.width || 120; + const ph = rect.height || 40; + + const popupRect = { + left: x - pw / 2, + right: x + pw / 2, + top: y - 10 - ph, + bottom: y - 10 + }; + + const isCurrentEng = this.isEngEntity(entity); + let collidedIdx = -1; + + for (let k = 0; k < placedPopups.length; k++) { + if (this.checkPopupCollision(popupRect, placedPopups[k])) { + collidedIdx = k; + break; + } + } + + if (collidedIdx === -1) { + // 无碰撞:正常放置 + popupEl.style.visibility = 'visible'; + popupEl.style.left = `${x}px`; + popupEl.style.top = `${y}px`; + this.batchPopupItems.push({ + entity, + element: popupEl, + popupWidth: pw, + popupHeight: ph + }); + placedPopups.push({ ...popupRect, entity, element: popupEl }); + } else { + const collided = placedPopups[collidedIdx]; + const isCollidedEng = this.isEngEntity(collided.entity); + + if (isCurrentEng && !isCollidedEng) { + // ENG 碰撞普通 popup:移除普通,展示 ENG + collided.element.remove(); + this.batchPopupItems = this.batchPopupItems.filter( + item => item.element !== collided.element + ); + popupEl.style.visibility = 'visible'; + popupEl.style.left = `${x}px`; + popupEl.style.top = `${y}px`; + this.batchPopupItems.push({ + entity, + element: popupEl, + popupWidth: pw, + popupHeight: ph + }); + placedPopups[collidedIdx] = { + ...popupRect, + entity, + element: popupEl + }; + } else if (!isCurrentEng && isCollidedEng) { + // 普通碰撞 ENG:隐藏当前普通 popup,保留 ENG + container.removeChild(popupEl); + } else { + // 同类型碰撞:后来的让路 + container.removeChild(popupEl); + } + } + } + + index = end; + if (index < candidates.length && this.isBatchPopupMode) { + requestAnimationFrame(processChunk); + } else { + resolve(); + } + }; + + requestAnimationFrame(processChunk); + }); + } + + /** 创建批量 popup 容器并构建所有可见 popup */ + private showBatchPopups(): Promise { + if (!this.viewer || !this.containerElement) return Promise.resolve(); + + const batchContainer = document.createElement('div'); + batchContainer.className = 'batch-popup-container'; + batchContainer.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 1000; + `; + batchContainer.id = 'batch-popup-container'; + this.batchPopupContainer = batchContainer; + this.containerElement.appendChild(batchContainer); + + const candidates = this.collectBatchPopupCandidates(); + return this.buildBatchPopupsInContainer(batchContainer, candidates); + } + + /** 每一帧都在更新,不需要持久化,但清理时一并重置 */ + private popupCollisionFrames = new WeakMap(); + + /** 每帧更新批量 popup 屏幕位置 + 碰撞检测(拖拽/缩放时流畅跟随) */ + private updateBatchPopupPositions() { + if (!this.viewer || !this.batchPopupContainer) return; + if (this.batchPopupItems.length === 0) return; + + const canvas = this.viewer.scene.canvas; + const viewW = canvas.clientWidth; + const viewH = canvas.clientHeight; + const padding = 48; + + // 第一遍:更新位置、收集可见项的屏幕矩形(用缓存宽高,不依赖 DOM 测量) + const visibleRects: { + item: (typeof this.batchPopupItems)[number]; + x: number; + y: number; + left: number; + right: number; + top: number; + bottom: number; + }[] = []; + + for (let i = 0; i < this.batchPopupItems.length; i++) { + const item = this.batchPopupItems[i]; + const { entity, element, popupWidth, popupHeight } = item; + + // 先恢复为 block,碰撞检测再做最终决定 + element.style.display = 'block'; + + if (!this.isEntityInteractive(entity)) { + element.style.display = 'none'; + continue; + } + + // 图标被碰撞隐藏的锚点不展示 popup + if ((entity as any)._iconCollisionVisible === false) { + element.style.display = 'none'; + continue; + } + + const position = entity.position?.getValue( + this.viewer!.clock.currentTime + ); + if (!position) { + element.style.display = 'none'; + continue; + } + + const cp = Cesium.SceneTransforms.worldToWindowCoordinates( + this.viewer!.scene, + position + ); + if (!cp) { + element.style.display = 'none'; + continue; + } + + if ( + cp.x < -padding || + cp.y < -padding || + cp.x > viewW + padding || + cp.y > viewH + padding + ) { + element.style.display = 'none'; + continue; + } + + const x = cp.x; + const y = cp.y; + element.style.left = `${x}px`; + element.style.top = `${y}px`; + + visibleRects.push({ + item, + x, + y, + left: x - popupWidth / 2, + right: x + popupWidth / 2, + top: y - 10 - popupHeight, + bottom: y - 10 + }); + } + + // 第二遍:碰撞检测 — 按 X 排序后右让左,X 接近时(5px 容差)ENG 优先 + visibleRects.sort((a, b) => { + const dx = a.x - b.x; + if (Math.abs(dx) > 5) return dx; + const aEng = this.isEngEntity(a.item.entity) ? 0 : 1; + const bEng = this.isEngEntity(b.item.entity) ? 0 : 1; + if (aEng !== bEng) return aEng - bEng; + return dx; + }); + + const collisionFlags = new Array(visibleRects.length).fill(false); + const instantFlags = new Array(visibleRects.length).fill(false); // ENG 碰撞立即隐藏 + for (let i = 1; i < visibleRects.length; i++) { + const a = visibleRects[i]; + for (let j = 0; j < i; j++) { + if (collisionFlags[j]) continue; + const b = visibleRects[j]; + + if (!this.checkPopupCollision(a, b)) continue; + + const aEng = this.isEngEntity(a.item.entity); + const bEng = this.isEngEntity(b.item.entity); + + if (aEng && !bEng) { + // ENG (a) 碰撞普通 (b):立即隐藏普通,ENG 继续检查是否碰撞其他已放置项 + collisionFlags[j] = true; + instantFlags[j] = true; + } else if (!aEng && bEng) { + // 普通 (a) 碰撞 ENG (b):立即隐藏普通 + collisionFlags[i] = true; + instantFlags[i] = true; + break; + } else { + // 同类型碰撞:后来的让路(经 2 帧滞后防闪烁) + collisionFlags[i] = true; + break; + } + } + } + + // 第三遍:应用显示状态,ENG 碰撞立即隐藏,同类型 2 帧滞后防闪烁 + for (let i = 0; i < visibleRects.length; i++) { + const { element } = visibleRects[i].item; + const hidden = collisionFlags[i]; + + if (hidden && instantFlags[i]) { + // ENG 碰撞:立即隐藏,不经过滞后 + element.style.display = 'none'; + this.popupCollisionFrames.delete(element); + continue; + } + + const prevFrames = this.popupCollisionFrames.get(element) || 0; + if (hidden) { + const count = prevFrames > 0 ? prevFrames + 1 : 1; + this.popupCollisionFrames.set(element, count); + if (count >= 2) { + element.style.display = 'none'; + } + } else { + const count = prevFrames < 0 ? prevFrames - 1 : -1; + this.popupCollisionFrames.set(element, count); + if (count <= -2) { + element.style.display = 'block'; + } + } + } + } + + /** 批量模式下双缓冲重建 popup(图层/图例变化、拖拽/缩放 moveEnd 时调用)。 + * 在新隐藏容器中构建 popup,构建完成后替换旧容器,避免 clear→rebuild 空白帧闪烁。 */ + private _rebuildGeneration = 0; + + private rebuildBatchPopupsIfNeeded() { + if (!this.isBatchPopupMode || !this.containerElement) return; + + console.log( + '[Cesium] rebuildBatchPopups gen=%d', + this._rebuildGeneration + 1 + ); + + // 停止旧容器的 postRender 同步(旧 popup 在新容器就绪前保持显示) + this.clearBatchPopupPostRenderSync(); + + const oldContainer = this.batchPopupContainer; + const generation = ++this._rebuildGeneration; + + // 在隐藏容器中构建新 popup(尚未插入 DOM) + const newContainer = document.createElement('div'); + newContainer.className = 'batch-popup-container'; + newContainer.style.cssText = + 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000;'; + newContainer.id = 'batch-popup-container'; + + this.batchPopupContainer = newContainer; + this.batchPopupItems = []; + this.popupCollisionFrames = new WeakMap(); + + const candidates = this.collectBatchPopupCandidates(); + this.buildBatchPopupsInContainer(newContainer, candidates).then(() => { + // 如果期间触发了新的重建,丢弃本次结果 + if (generation !== this._rebuildGeneration) { + newContainer.remove(); + return; + } + if (!this.isBatchPopupMode) { + newContainer.remove(); + return; + } + // 双缓冲替换:移除旧容器 → 插入新容器 → 注册 postRender + if (oldContainer) oldContainer.remove(); + this.containerElement!.appendChild(newContainer); + this.setupBatchPopupPostRenderSync(); + }); + } + + /** 清除所有批量 popup */ + private clearBatchPopups() { + this.batchPopupItems = []; + this.popupCollisionFrames = new WeakMap(); + if (this.batchPopupContainer) { + this.batchPopupContainer.remove(); + this.batchPopupContainer = null; + return; + } + const existing = document.getElementById('batch-popup-container'); + if (existing) { + existing.remove(); + } + } + + /** 简单碰撞检测(AABB + padding) */ + private checkPopupCollision( + a: { left: number; right: number; top: number; bottom: number }, + b: { left: number; right: number; top: number; bottom: number } + ): boolean { + const padding = 4; + return !( + a.right + padding < b.left || + a.left - padding > b.right || + a.bottom + padding < b.top || + a.top - padding > b.bottom + ); + } + + // ==================== destroy ==================== + + destroy(): void { + // 取消飞行超时和加载动画 + this.clearFlightFallbackTimer(); + this.hideLoadingOverlay(); + this._ready = false; + this._pendingOSGBItems = []; + + // 批量 popup 和 hover popup + this.isBatchPopupMode = false; + this.clearBatchPopupPostRenderSync(); + this.clearBatchPopups(); + this.hidePopup(); + + // hover 节流 requestAnimationFrame + if (this.hoverRafId !== null) { + cancelAnimationFrame(this.hoverRafId); + this.hoverRafId = null; + } + + // 相机事件监听 + if (this.removePostRenderListener) { + this.removePostRenderListener(); + this.removePostRenderListener = null; + } + if (this.removeCameraChangedListener) { + this.removeCameraChangedListener(); + this.removeCameraChangedListener = null; + } + + // 碰撞检测 rAF / 定时器 + if (this.collisionRefreshFrameId !== null) { + cancelAnimationFrame(this.collisionRefreshFrameId); + this.collisionRefreshFrameId = null; + } + if (this.labelVisibilityDebounceTimerId !== null) { + window.clearTimeout(this.labelVisibilityDebounceTimerId); + this.labelVisibilityDebounceTimerId = null; + } + + // 中止进行中的基地裁切请求 + if (this.clipRequestController) { + this.clipRequestController.abort(); + this.clipRequestController = null; + } + + // 清理遮罩多边形 Entity(需在 viewer.destroy 前清除) + if (this.viewer && !this.viewer.isDestroyed()) { + this.maskPolygonEntities.forEach(entity => { + this.viewer!.entities.remove(entity); + }); + } + this.maskPolygonEntities = []; + + // 清理锚点图层和底图注册表 + this.destroyAllPointLayers(); + this.pointLayerRegistry.clear(); + this.baseLayerRegistry.clear(); + this.baseLayerAliasMap.clear(); + this.imageryBaseLayer = null; + + // 清理 Cesium 事件处理器 + if (this.clickEventHandler) { + this.clickEventHandler.destroy(); + this.clickEventHandler = null; + } + this.popupElement = null; + + // 销毁 Cesium Viewer + if (this.viewer) { + this._rebuildGeneration++; // 中止进行中的双缓冲重建 + this.viewer.camera.cancelFlight(); + this.viewer.destroy(); + this.viewer = null; + } + this.containerElement = null; + + // 重置所有状态变量(确保下次 init 时是干净状态) + this.popupCollisionFrames = new WeakMap(); + this.currentClipGeoJson = null; + this.originalBgColor = null; + this.skyBoxShown = true; + this.skyAtmosphereShown = true; + this.hydropBaseConfig = null; + this.BASEID = ''; + this.hoveredEntityId = null; + + console.log('[Cesium] destroyed'); + } + + private requestRender() { + this.viewer?.scene.requestRender(); + } + + /** + * 标签文本格式化:与 2D formatPointLabelText 完全对齐 + * - 去除括号 ()() + * - 每行最多 12 个字符 + * - 13~24 字符 → 拆成两行 + * - 超过 24 字符 → 第二行末尾用 "..." 截断 + */ + private formatPointLabelText(text: string): string { + const normalizedText = String(text || '') + .replace(/[()()]/g, '') + .trim(); + if (!normalizedText) { + return ''; + } + + const maxLineLength = 12; + if (normalizedText.length <= maxLineLength) { + return normalizedText; + } + + const firstLine = normalizedText.slice(0, maxLineLength); + if (normalizedText.length <= maxLineLength * 2) { + return `${firstLine}\n${normalizedText.slice(maxLineLength)}`; + } + + const secondLine = `${normalizedText.slice( + maxLineLength, + maxLineLength + 9 + )}...`; + return `${firstLine}\n${secondLine}`; + } + + // ==================== Step 2: 基础底图 ==================== + + private getRegistryKeys(layerConfig: any): string[] { + const keys = [layerConfig?.key, layerConfig?.id].filter( + (key): key is string => typeof key === 'string' && key.length > 0 + ); + return Array.from(new Set(keys)); + } + + private resolvePrimaryBaseLayerKey(layerKey: string): string | undefined { + if (!layerKey) return undefined; + if (this.baseLayerRegistry.has(layerKey)) return layerKey; + return this.baseLayerAliasMap.get(layerKey); + } + + private unregisterBaseLayer(layerConfig: any) { + if (!this.viewer) return; + const registryKeys = this.getRegistryKeys(layerConfig); + const uniquePrimaryKeys = new Set(); + + registryKeys.forEach(key => { + const primaryKey = this.resolvePrimaryBaseLayerKey(key) || key; + uniquePrimaryKeys.add(primaryKey); + this.baseLayerAliasMap.delete(key); + }); + + uniquePrimaryKeys.forEach(primaryKey => { + const existingLayer = this.baseLayerRegistry.get(primaryKey); + if (existingLayer) { + this.viewer?.imageryLayers.remove(existingLayer, true); + this.baseLayerRegistry.delete(primaryKey); + } + }); + } + + private registerBaseLayer( + layerConfig: any, + imageryLayer: Cesium.ImageryLayer + ) { + const registryKeys = this.getRegistryKeys(layerConfig); + const primaryKey = layerConfig?.key || layerConfig?.id; + if (!primaryKey) return; + + this.baseLayerRegistry.set(primaryKey, imageryLayer); + registryKeys.forEach(key => { + this.baseLayerAliasMap.set(key, primaryKey); + }); + } + + private getLayerRequestUrl(layerConfig: any): string { + if (layerConfig?.key === 'customBaseLayer') { + return layerConfig?.url_3d; + } + return layerConfig?.url || layerConfig?.url_3d || ''; + } + + private createImageryLayer(layerConfig: any, visible: boolean) { + if (layerConfig?.key === 'hydropBase') return null; + if (!this.viewer) return null; + + const url = this.getLayerRequestUrl(layerConfig); + if (!url) return null; + + let imageryLayer: Cesium.ImageryLayer | null = null; + + // WMTS:与 2D addBaseDataLayer 对齐,从 URL 参数中提取 LAYER / TILEMATRIXSET + // 必须提供 tileMatrixLabels,否则 Cesium 默认用纯数字 tileMatrix 值, + // 而服务器期望的是 "TileMatrixSet:zoom" 格式(如 EPSG:3857_hbb_zrbhq_l13:4) + if (layerConfig?.type === 'wmts') { + const urlParts = url.split('?'); + const baseUrl = urlParts[0]; + const urlParams = new URLSearchParams(urlParts[1] || ''); + const wmtsLayer = urlParams.get('LAYER') || urlParams.get('layer') || ''; + const tileMatrixSetID = + urlParams.get('TILEMATRIXSET') || urlParams.get('TileMatrixSet') || ''; + const maxLevel = 19; + const tileMatrixLabels = Array.from( + { length: maxLevel + 1 }, + (_, i) => `${tileMatrixSetID}:${i}` + ); + + imageryLayer = this.viewer.imageryLayers.addImageryProvider( + new Cesium.WebMapTileServiceImageryProvider({ + url: baseUrl, + layer: wmtsLayer, + style: 'raster', + format: 'image/png', + tileMatrixSetID: tileMatrixSetID, + tileMatrixLabels: tileMatrixLabels, + maximumLevel: maxLevel + }) + ); + } else if ( + layerConfig?.type === 'raster-dem' || + /\{x\}|\{y\}|\{z\}/.test(url) + ) { + imageryLayer = this.viewer.imageryLayers.addImageryProvider( + new Cesium.UrlTemplateImageryProvider({ url }) + ); + } else if (url.includes('MapServer')) { + imageryLayer = this.viewer.imageryLayers.add( + Cesium.ImageryLayer.fromProviderAsync( + Cesium.ArcGisMapServerImageryProvider.fromUrl(url, { + enablePickFeatures: false, + maximumLevel: 19 + }) + ) + ); + } else { + const cleanUrl = url.split('?')[0]; + const wmsLayers = layerConfig?.layers || ''; + imageryLayer = this.viewer.imageryLayers.addImageryProvider( + new Cesium.WebMapServiceImageryProvider({ + url: cleanUrl, + layers: wmsLayers, + parameters: { + service: 'WMS', + transparent: 'true', + format: 'image/png' + } + }) + ); + } + + if (!imageryLayer) return null; + + imageryLayer.show = visible; + if (typeof layerConfig?.rasteropacity === 'number') { + imageryLayer.alpha = layerConfig.rasteropacity; + } + return imageryLayer; + } + + addBaseDataLayer(layerConfig: any, isShow = true): void { + if (!this.viewer || !layerConfig?.key) return; + + // 基地裁切配置存储(与 2D 对齐:layer.type === 'vector' && layer.key === 'hydropBase') + if (layerConfig.type === 'vector' && layerConfig.key === 'hydropBase') { + this.hydropBaseConfig = layerConfig; + return; + } + + if ( + this.IGNORED_BASE_LAYER_KEYS.has(layerConfig.key) || + this.IGNORED_BASE_LAYER_KEYS.has(layerConfig.id) + ) { + return; + } + + if (layerConfig.key === 'BASEMAP-img') { + if (this.imageryBaseLayer) { + this.imageryBaseLayer.show = !!isShow; + } + this.requestRender(); + return; + } + + const imageryLayer = this.createImageryLayer(layerConfig, !!isShow); + if (!imageryLayer) return; + + this.unregisterBaseLayer(layerConfig); + this.registerBaseLayer(layerConfig, imageryLayer); + this.requestRender(); + } + + controlBaseLayerTreeShowAndHidden( + layerType: string, + key: string, + checked: boolean + ): void { + const targetKey = key || layerType; + if (targetKey === 'BASEMAP-img') { + if (this.imageryBaseLayer) { + this.imageryBaseLayer.show = checked; + } + return; + } + + const primaryKey = this.resolvePrimaryBaseLayerKey(targetKey); + if (!primaryKey) return; + + const imageryLayer = this.baseLayerRegistry.get(primaryKey); + if (!imageryLayer) return; + + imageryLayer.show = checked; + this.requestRender(); + } + + hasBaseLayer(layerKey: string): boolean { + if (layerKey === 'BASEMAP-img') return !!this.imageryBaseLayer; + return !!this.resolvePrimaryBaseLayerKey(layerKey); + } + + // ==================== 其他公共方法 ==================== + + flyTopanto(position: number[], zoom: number): void { + if (!this.viewer || !position) return; + const [lng, lat] = position; + const height = 20000000 / Math.pow(2, zoom); + this.viewer.camera.cancelFlight(); + this.viewer.camera.flyTo({ + destination: Cesium.Cartesian3.fromDegrees( + lng, + lat, + height > 100 ? height : 1000 + ), + duration: 1.5 + }); + } + + getCurrentZoom(): number | undefined { + return this.getCurrentCesiumZoom(); + } + + private getCurrentCesiumZoom() { + if (!this.viewer) return undefined; + const height = this.viewer.camera.positionCartographic.height; + if (!height || !isFinite(height) || height <= 0) return undefined; + const zoom = + this.CESIUM_ZOOM_FORMULA_D + + (this.CESIUM_ZOOM_FORMULA_A - this.CESIUM_ZOOM_FORMULA_D) / + (1 + + Math.pow( + Number(height) / this.CESIUM_ZOOM_FORMULA_C, + this.CESIUM_ZOOM_FORMULA_B + )) + + 1; + return zoom > -1 ? zoom : 0; + } + + zoomToggle(type: 'out' | 'in'): void { + if (!this.viewer) return; + const factor = 1.5; + if (type === 'in') this.viewer.camera.zoomIn(factor); + else this.viewer.camera.zoomOut(factor); + } + + mapOutPut(fileName = '3D_截图.png'): void { + if (!this.viewer) { + console.warn('Viewer is not initialized.'); + return; + } + try { + const canvas = this.viewer.canvas; + this.viewer.render(); + const dataURL = canvas.toDataURL('image/png'); + if (dataURL.length < 100) { + console.warn( + 'Canvas data is too small, likely black or empty. Check CORS settings.' + ); + } + const link = document.createElement('a'); + link.href = dataURL; + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch (error) { + console.error('Failed to export map image:', error); + } + } + + initPopupOverlay(popupContainer: HTMLDivElement): void { + this.popupElement = popupContainer; + if (this.popupElement) { + // 清除可能残留的旧样式 + this.popupElement.style.removeProperty('position'); + this.popupElement.style.removeProperty('transform'); + this.popupElement.style.removeProperty('left'); + this.popupElement.style.removeProperty('top'); + this.popupElement.style.display = 'none'; + this.popupElement.style.position = 'absolute'; + this.popupElement.style.transform = 'translate(-50%, calc(-100% - 10px))'; + this.popupElement.style.setProperty( + 'pointer-events', + 'none', + 'important' + ); + } + } + + // ==================== Step 3: 锚点展示 ==================== + + addInitDataLayer( + pointData: any, + layerType: any, + _mdoptions?: MDOptions + ): void { + if (!this.viewer) return; + + let dataArray: any[] = []; + let targetLayerKey = layerType; + + // 与 2D PointLayerManager.addDataLayer 对齐的输入归一化 + if (Array.isArray(pointData)) { + dataArray = pointData; + } else { + dataArray = pointData?.data || []; + targetLayerKey = pointData?.key || layerType; + } + + if (!targetLayerKey) { + console.warn('[Cesium] 缺少图层 Key,无法加载锚点'); + return; + } + + // 先移除旧图层数据 + this.removePointLayer(targetLayerKey); + + const entities: Cesium.Entity[] = []; + + dataArray.forEach((item: any) => { + const { lgtd, lttd, stnm, iconCode, titleName, ennm } = item; + + if (lgtd == null || lttd == null) return; + + const lon = Number(lgtd); + const lat = Number(lttd); + if (isNaN(lon) || isNaN(lat) || !isFinite(lon) || !isFinite(lat)) return; + if (Math.abs(lon) > 180 || Math.abs(lat) > 90) return; + + // 图标:复用现有图标资源路径,与 2D 一致 + const iconUrl = iconCode + ? getIconPath(iconCode) + : getIconPath('default') || ''; + + // 标签文本:格式化(换行截断)+ ylfb 用 ftp,其他用 titleName > stnm > ennm + const rawLabelText = + item.sttpMap === 'ylfb' + ? item.ftp || '' + : titleName || stnm || ennm || ''; + const labelText = this.formatPointLabelText(rawLabelText); + // 行数决定纵向偏移量,与 2D getPointLabelRenderOffsetY 对齐 + const labelLineCount = labelText.includes('\n') ? 2 : labelText ? 1 : 0; + + // Entity ID:与 2D 对齐,使用 _id 优先(_id = sttpMap_stcd),确保同 stcd 不同 sttpMap 的点不互相覆盖 + const rawId = + item._id || item.stcd || `${lon.toFixed(6)},${lat.toFixed(6)}`; + const entityId = `${targetLayerKey}:${rawId}`; + + // 图标缩放:使用 CallbackProperty 动态响应相机缩放变化 + // 调参见顶部 ICON_ 常量 + const dynamicIconScale = new Cesium.CallbackProperty(() => { + const zoom = this.getCurrentCesiumZoom() || 4.5; + return Math.max( + this.ICON_MIN_SCALE, + Math.min( + this.ICON_MAX_SCALE, + this.ICON_BASE_SCALE + (zoom - 4.5) * this.ICON_SCALE_RATE + ) + ); + }, false); + + // 字体大小:与 2D getPointFontSize 对齐 → fontSize = clamp(base * scale, min, max) + // 调参见顶部 LABEL_FONT_ 常量 + const dynamicLabelFont = new Cesium.CallbackProperty(() => { + const zoom = this.getCurrentCesiumZoom() || 4.5; + const scale = Math.max(0.5, Math.min(3.0, 0.7 + (zoom - 4.5) * 0.08)); + const fontSize = Math.round( + Math.max( + this.LABEL_FONT_MIN, + Math.min(this.LABEL_FONT_MAX, this.LABEL_FONT_BASE * scale) + ) + ); + return `${fontSize}px sans-serif`; + }, false); + + // 标签纵向偏移:与 2D getPointLabelRenderOffsetY 对齐 + // 调参见顶部 LABEL_OFFSET_ 常量 + const dynamicLabelOffset = new Cesium.CallbackProperty(() => { + const zoom = this.getCurrentCesiumZoom() || 4.5; + const scale = Math.max(0.5, Math.min(3.0, 0.7 + (zoom - 4.5) * 0.08)); + const offsetY = + labelLineCount > 1 + ? -this.LABEL_OFFSET_MULTI * scale + : -this.LABEL_OFFSET_SINGLE * scale; + return new Cesium.Cartesian2(0, offsetY); + }, false); + + const entity = new Cesium.Entity({ + id: entityId, + position: Cesium.Cartesian3.fromDegrees(lon, lat, 0), + billboard: { + image: iconUrl || undefined, + scale: dynamicIconScale as any, + verticalOrigin: Cesium.VerticalOrigin.CENTER, + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.5, 2.0e7, 0.8), + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND + } as any, + label: { + text: labelText || undefined, + font: dynamicLabelFont as any, + fillColor: Cesium.Color.WHITE, + outlineColor: Cesium.Color.BLACK, + outlineWidth: 2, + style: Cesium.LabelStyle.FILL_AND_OUTLINE, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: dynamicLabelOffset as any, + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.2, 2.0e7, 0.8), + heightReference: Cesium.HeightReference.CLAMP_TO_GROUND + } as any, + properties: { + ...item, + _layerKey: targetLayerKey, + _iconUrl: iconUrl, + _labelText: labelText, + _legendVisible: true, + _regionVisible: true, + _sttpMap: item.sttpMap + } as any + }); + + this.viewer!.entities.add(entity); + // 存储原始业务数据引用,避免点击时遍历 Cesium Property + (entity as any)._rawData = item; + (entity as any)._labelText = labelText; + // 可见性控制标志(组合计算 entity.show) + (entity as any)._layerVisible = true; + (entity as any)._legendVisible = true; + (entity as any)._regionVisible = true; + // 碰撞检测可见性标志(初始均为可见,碰撞检测会按需更新) + (entity as any)._iconCollisionVisible = true; + (entity as any)._labelCollisionVisible = true; + // 初始应用可见性(确保 entity.show / entity.label.show 被显式设置) + this.applyEntityVisibility(entity); + entities.push(entity); + }); + + this.pointLayerRegistry.set(targetLayerKey, entities); + + // 如果当前有活跃的基地裁切,新图层也需要过滤 + if (this.currentClipGeoJson) { + this.filterPointsByRegionForLayer( + targetLayerKey, + this.extractPolygonCoords(this.currentClipGeoJson) + ); + } + + // 数据加载完成后触发首次碰撞检测(同步执行,避免异步 rAF 导致的首帧闪烁) + this.requestRefreshPointLabelVisibility(true); + } + + mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void { + const entities = this.pointLayerRegistry.get(layerType); + if (!entities) return; + + const visible = checked !== false; + entities.forEach(entity => { + (entity as any)._layerVisible = visible; + this.applyEntityVisibility(entity); + }); + + // 图层切换后立即重算碰撞(同步执行,避免闪烁) + this.requestRefreshPointLabelVisibility(true); + // 批量模式下同步重建 popup + this.rebuildBatchPopupsIfNeeded(); + } + + removePointLayer(layerKey: string): void { + if (!layerKey) return; + + const entities = this.pointLayerRegistry.get(layerKey); + if (!entities) return; + + entities.forEach(entity => { + if (this.viewer && !this.viewer.isDestroyed()) { + this.viewer.entities.remove(entity); + } + }); + this.pointLayerRegistry.delete(layerKey); + } + + hasLayer(layerKey: string): boolean { + return this.pointLayerRegistry.has(layerKey); + } + + private destroyAllPointLayers(): void { + this.pointLayerRegistry.forEach((entities, layerKey) => { + entities.forEach(entity => { + if (this.viewer && !this.viewer.isDestroyed()) { + this.viewer.entities.remove(entity); + } + }); + }); + this.pointLayerRegistry.clear(); + } + + // ==================== Stubs(后续步骤补齐) ==================== + + baseLayerSwitcher(_key: string): void {} + switchView(_type: '2D' | '3D'): void {} + fitBounds(_bounds: any): void {} + lengthCalculate(): void {} + areCalculate(): void {} + removeQueryLayer(): void {} + addTertiarybasinLayer( + _layer: layer, + _fillcolor: any, + _outlineColor: any, + _datas: any + ): void {} + hideTertiarybasinLayer(_layer: layer): void {} + async jdPanelControlShowAndHidden( + _regionId: string, + isAll: boolean + ): Promise { + if (!this.viewer || !this.hydropBaseConfig) { + console.warn('地图未初始化或 hydropBaseConfig 未配置'); + return; + } + + // 取消正在进行的裁切请求 + if (this.clipRequestController) { + this.clipRequestController.abort(); + this.clipRequestController = null; + } + + this.BASEID = _regionId; + + if (!isAll) { + // 取消裁切:清除遮罩多边形,恢复全部锚点可见,平滑飞回全国视图 + this.currentClipGeoJson = null; + this.clearMaskPolygon(); + this.setAllPointsRegionVisible(true); + this.viewer.camera.flyTo({ + destination: Cesium.Cartesian3.fromDegrees( + this.CHINA_CENTER.lng, + this.CHINA_CENTER.lat, + this.CHINA_DEFAULT_HEIGHT + ), + orientation: this.CHINA_VIEW_ORIENTATION, + duration: 1.0 + }); + return; + } + + // 用户从"全部"进入,锚点本来就全可见,无需 API 前先隐藏(避免全量遍历卡顿) + this.clipRequestController = new AbortController(); + const signal = this.clipRequestController.signal; + + try { + const url = + this.hydropBaseConfig.geojson_url + + `&cql_filter=BASEID='${this.BASEID}'`; + + const geoJsonData = await this.fetchGeoJson(url, signal); + + if (signal.aborted) return; + if (this.BASEID !== _regionId) return; + + this.currentClipGeoJson = geoJsonData; + const regionCoords = this.extractPolygonCoords(geoJsonData); + this.filterPointsByRegion(regionCoords); + this.fitViewToGeoJson(regionCoords); + this.createMaskPolygon(regionCoords); + } catch (error: any) { + if (error.name === 'AbortError') return; + this.currentClipGeoJson = null; + console.error('加载裁切数据失败:', error); + this.clearMaskPolygon(); + this.setAllPointsRegionVisible(true); + } finally { + if (this.clipRequestController?.signal === signal) { + this.clipRequestController = null; + } + } + } + mdLayerShowOrHidden( + _layerType: string, + _key?: string, + _baseid?: string, + _checked?: boolean, + _isAll?: boolean + ): void {} + setLegendPointVisible( + layerKey: string, + anchoPointState: string, + checked: boolean + ): void { + const entities = this.pointLayerRegistry.get(layerKey); + if (!entities) return; + + if (!anchoPointState) { + // 第一步:全部隐藏(配合 restoreLayerLegendVisibility 两步走:先全隐藏再按图例逐项恢复) + entities.forEach(entity => { + (entity as any)._legendVisible = false; + this.applyEntityVisibility(entity); + }); + this.requestRefreshPointLabelVisibility(true); + this.rebuildBatchPopupsIfNeeded(); + return; + } + + // 按 anchoPointState 字段匹配并设置可见性 + entities.forEach(entity => { + const rawData = (entity as any)._rawData; + if (rawData && rawData.anchoPointState === anchoPointState) { + (entity as any)._legendVisible = checked; + this.applyEntityVisibility(entity); + } + }); + + // 图例切换后立即重算碰撞(同步执行,避免闪烁) + this.requestRefreshPointLabelVisibility(true); + this.rebuildBatchPopupsIfNeeded(); + } + + // ==================== 基地裁切辅助方法 ==================== + + /** 获取 GeoJSON 数据 */ + private async fetchGeoJson(url: string, signal?: AbortSignal): Promise { + const response = await fetch(url, { signal }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return response.json(); + } + + /** 批量设置全部锚点的 _regionVisible 标志 */ + private setAllPointsRegionVisible(visible: boolean): void { + this.pointLayerRegistry.forEach(entities => { + entities.forEach(entity => { + (entity as any)._regionVisible = visible; + this.applyEntityVisibility(entity); + }); + }); + } + + /** 根据 GeoJSON 边界批量更新锚点的区域显隐状态(射线法) */ + private filterPointsByRegion(regionCoords: number[][][]): void { + if (!regionCoords.length) { + console.warn('无法解析区域边界,显示所有锚点'); + this.setAllPointsRegionVisible(true); + return; + } + + this.pointLayerRegistry.forEach((_entities, layerKey) => { + this.filterPointsByRegionForLayer(layerKey, regionCoords); + }); + } + + /** 对单个图层应用基地裁切过滤 */ + private filterPointsByRegionForLayer( + layerKey: string, + regionCoords: number[][][] + ): void { + const entities = this.pointLayerRegistry.get(layerKey); + if (!entities || !regionCoords.length) return; + + entities.forEach(entity => { + const rawData = (entity as any)._rawData; + if (!rawData) { + (entity as any)._regionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + const lon = Number(rawData.lgtd); + const lat = Number(rawData.lttd); + + if (!isFinite(lon) || !isFinite(lat)) { + (entity as any)._regionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + (entity as any)._regionVisible = this.isPointInPolygon( + lon, + lat, + regionCoords + ); + this.applyEntityVisibility(entity); + }); + } + + /** 根据多边形坐标飞行相机到基地边界 */ + private fitViewToGeoJson(regionCoords: number[][][]): void { + if (!this.viewer) return; + + try { + if (!regionCoords.length) return; + + // 计算所有坐标的经纬度范围 + let minLon = Infinity; + let maxLon = -Infinity; + let minLat = Infinity; + let maxLat = -Infinity; + + regionCoords.forEach(ring => { + ring.forEach(([lon, lat]) => { + if (lon < minLon) minLon = lon; + if (lon > maxLon) maxLon = lon; + if (lat < minLat) minLat = lat; + if (lat > maxLat) maxLat = lat; + }); + }); + + if (!isFinite(minLon)) return; + + const rectangle = Cesium.Rectangle.fromDegrees( + minLon, + minLat, + maxLon, + maxLat + ); + + this.viewer.camera.flyTo({ + destination: rectangle, + duration: 1.0, + complete: () => this.requestRender() + }); + } catch (error) { + console.error('调整3D视野失败:', error); + } + } + + /** 应用基地裁切:globe.clippingPolygons 直接裁切地球渲染 */ + private createMaskPolygon(regionCoords: number[][][]): void { + if (!this.viewer) return; + + // 仅清理旧边框(不重置 clipping/背景色/skyBox,避免 GPU 状态反复重建) + this.maskPolygonEntities.forEach(entity => { + if (!this.viewer!.isDestroyed()) { + this.viewer!.entities.remove(entity); + } + }); + this.maskPolygonEntities = []; + + if (!regionCoords.length) return; + + const cartesianRings = regionCoords.map(ring => + Cesium.Cartesian3.fromDegreesArray( + ring.flatMap(([lon, lat]) => [lon, lat]) + ) + ); + + // 首次进入裁切时保存原始状态 + if (!this.originalBgColor) { + this.originalBgColor = this.viewer.scene.backgroundColor.clone(); + this.skyBoxShown = this.viewer.scene.skyBox?.show ?? true; + this.skyAtmosphereShown = this.viewer.scene.skyAtmosphere?.show ?? true; + } + // 边界外设为白色 + if (this.viewer.scene.skyBox) this.viewer.scene.skyBox.show = false; + if (this.viewer.scene.skyAtmosphere) + this.viewer.scene.skyAtmosphere.show = false; + this.viewer.scene.backgroundColor = Cesium.Color.WHITE; + + // 直接设新裁切(不经过空集合,避免 GPU shader 重复编译) + this.viewer.scene.globe.clippingPolygons = + new Cesium.ClippingPolygonCollection({ + polygons: cartesianRings.map( + positions => new Cesium.ClippingPolygon({ positions }) + ), + inverse: true, + enabled: true + }); + + // 绘制基地边界线(双线视觉效果:紫色 + 浅紫色) + const borderStyles = [ + { width: 3, color: '#6D64DF' }, + { width: 1.5, color: '#CCC9F4' } + ]; + borderStyles.forEach(({ width, color }) => { + cartesianRings.forEach(positions => { + this.maskPolygonEntities.push( + this.viewer!.entities.add({ + polyline: { + positions, + width, + material: Cesium.Color.fromCssColorString(color), + clampToGround: true + } + }) + ); + }); + }); + + this.requestRender(); + this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 6_400_000; + } + + /** 清除遮罩多边形 */ + private clearMaskPolygon(): void { + if (!this.viewer) return; + + // 解除 globe 裁切 + this.viewer.scene.globe.clippingPolygons = + new Cesium.ClippingPolygonCollection(); + + // 恢复背景色、星空、大气层 + if (this.originalBgColor) { + this.viewer.scene.backgroundColor = this.originalBgColor; + this.originalBgColor = null; + } + if (this.viewer.scene.skyBox) { + this.viewer.scene.skyBox.show = this.skyBoxShown; + } + if (this.viewer.scene.skyAtmosphere) { + this.viewer.scene.skyAtmosphere.show = this.skyAtmosphereShown; + } + + this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = + Infinity; + + this.maskPolygonEntities.forEach(entity => { + if (!this.viewer!.isDestroyed()) { + this.viewer!.entities.remove(entity); + } + }); + this.maskPolygonEntities = []; + } + + /** 从 GeoJSON 中提取多边形环坐标 */ + private extractPolygonCoords(geoJson: any): number[][][] { + if (!geoJson?.features?.length) return []; + + const coords: number[][][] = []; + geoJson.features.forEach((feature: any) => { + const geometry = feature.geometry; + if (!geometry) return; + + if (geometry.type === 'Polygon') { + coords.push(...geometry.coordinates); + } else if (geometry.type === 'MultiPolygon') { + geometry.coordinates.forEach((polygon: number[][][]) => { + coords.push(...polygon); + }); + } + }); + + return coords; + } + + /** 射线法判断点是否在任意一个多边形环内 */ + private isPointInPolygon( + lon: number, + lat: number, + polygons: number[][][] + ): boolean { + for (const polygon of polygons) { + if (this.isPointInRing(lon, lat, polygon)) { + return true; + } + } + return false; + } + + /** 射线法判断点是否在单个闭合环内 */ + private isPointInRing(lon: number, lat: number, ring: number[][]): boolean { + let inside = false; + const n = ring.length; + + for (let i = 0, j = n - 1; i < n; j = i++) { + const xi = ring[i][0]; + const yi = ring[i][1]; + const xj = ring[j][0]; + const yj = ring[j][1]; + + const intersect = + yi > lat !== yj > lat && + lon < ((xj - xi) * (lat - yi)) / (yj - yi) + xi; + + if (intersect) inside = !inside; + } + + return inside; + } + + /** + * 组合计算可见性(3D 解耦模型): + * - entity.show = 基础可见(layer && legend && region),保持 entity 始终"在作用域内" + * - entity.billboard.show = 基础可见 && 图标碰撞通过 + * - entity.label.show = 基础可见 && 标签碰撞通过(图标碰撞不影响标签) + */ + private applyEntityVisibility(entity: Cesium.Entity): void { + const e = entity as any; + const baseVisible = e._layerVisible && e._legendVisible && e._regionVisible; + // entity 整体始终基于 layer/legend/region(不受碰撞影响,保证 popup/click 等交互不受碰撞干扰) + entity.show = baseVisible; + // 图标单独受碰撞控制 + if (entity.billboard) { + (entity.billboard as any).show = + baseVisible && e._iconCollisionVisible !== false; + } + // 标签单独受碰撞控制(不与图标碰撞联动) + if (entity.label) { + (entity.label as any).show = + baseVisible && e._labelCollisionVisible !== false; + } + } + + // ==================== Step 6: 碰撞检测 ==================== + + /** + * 触发碰撞检测刷新(带 rAF 节流,与 2D requestRefreshPointLabelVisibility 对齐) + */ + private requestRefreshPointLabelVisibility( + immediate = false, + debounceMs = 0 + ) { + if (this.labelVisibilityDebounceTimerId !== null) { + window.clearTimeout(this.labelVisibilityDebounceTimerId); + this.labelVisibilityDebounceTimerId = null; + } + + if (immediate) { + if (this.collisionRefreshFrameId !== null) { + cancelAnimationFrame(this.collisionRefreshFrameId); + this.collisionRefreshFrameId = null; + } + this.refreshPointLabelVisibility(); + return; + } + + if (debounceMs > 0) { + this.labelVisibilityDebounceTimerId = window.setTimeout(() => { + this.labelVisibilityDebounceTimerId = null; + this.requestRefreshPointLabelVisibility(); + }, debounceMs); + return; + } + + if (this.collisionRefreshFrameId !== null) return; + + this.collisionRefreshFrameId = window.requestAnimationFrame(() => { + this.collisionRefreshFrameId = null; + this.refreshPointLabelVisibility(); + }); + } + + /** + * 主碰撞检测:密度门控 → 图标碰撞 → 标签碰撞 + * 与 2D refreshPointLabelVisibility 核心算法完全对齐 + */ + private refreshPointLabelVisibility(): void { + if (!this.viewer) return; + + const currentZoom = this.getCurrentCesiumZoom(); + if (currentZoom === undefined || currentZoom === null) return; + + console.log( + `[Cesium Collision] zoom=${currentZoom?.toFixed(2)} layers=${ + this.pointLayerRegistry.size + }` + ); + + // ===== 阶段0:收集视口内所有基础可见实体 ===== + type CollisionCandidate = { + entity: Cesium.Entity; + iconLeft: number; + iconRight: number; + iconTop: number; + iconBottom: number; + hasLabel: boolean; + labelLeft: number; + labelRight: number; + labelTop: number; + labelBottom: number; + engPriority: number; + nearbyPriority: number; + densityPriority: number; + pixelX: number; + pixelY: number; + id: string; + }; + + const candidates: CollisionCandidate[] = []; + const canvas = this.viewer.scene.canvas; + const viewPadding = 120; // 视口外的宽容范围 + + // 孤立点密度网格:用于 shouldBypassDensityGate + const densityPixelGrid = new Map< + string, + Array<{ + entity: Cesium.Entity; + layerKey: string; + pixelX: number; + pixelY: number; + }> + >(); + + const dynamicScale = Math.max( + 0.5, + Math.min(3.0, 0.7 + (currentZoom - 4.5) * 0.08) + ); + const fontSize = Math.max(10, Math.min(24, 12 * dynamicScale)); + + // 第一遍:密度门控 + 构建候选 + this.pointLayerRegistry.forEach((entities, layerKey) => { + entities.forEach(entity => { + const e = entity as any; + + // 基础可见性检查(layer/legend/region) + if ( + e._layerVisible === false || + e._legendVisible === false || + e._regionVisible === false + ) { + e._iconCollisionVisible = false; + e._labelCollisionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + const position = entity.position?.getValue( + this.viewer!.clock.currentTime + ); + if (!position) { + e._iconCollisionVisible = false; + e._labelCollisionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + const screenPos = Cesium.SceneTransforms.worldToWindowCoordinates( + this.viewer!.scene, + position + ); + if (!screenPos) { + e._iconCollisionVisible = false; + e._labelCollisionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + const pixelX = screenPos.x; + const pixelY = screenPos.y; + + // 视口裁剪:太远的实体不参与碰撞,但保留其当前碰撞状态(不重置) + if ( + pixelX < -viewPadding || + pixelY < -viewPadding || + pixelX > canvas.clientWidth + viewPadding || + pixelY > canvas.clientHeight + viewPadding + ) { + return; + } + + // 密度 gating(与 2D getFeatureDensityMinZoom / shouldRenderFeatureByDensity 对齐) + const densityMinZoom = this.getEntityDensityMinZoom(entity); + const bypassDensity = + currentZoom < densityMinZoom && + this.shouldBypassDensityGateForIsolatedEntity( + entity, + pixelX, + pixelY, + layerKey, + densityPixelGrid + ); + const densityVisible = currentZoom >= densityMinZoom || bypassDensity; + + if (!densityVisible) { + e._iconCollisionVisible = false; + e._labelCollisionVisible = false; + this.applyEntityVisibility(entity); + return; + } + + // 构建图标碰撞盒(与 2D 一致:Math.max(14, 24 * dynamicScale)) + const iconCollisionSize = Math.max(14, 24 * dynamicScale); + const iconLeft = pixelX - iconCollisionSize / 2; + const iconRight = pixelX + iconCollisionSize / 2; + const iconTop = pixelY - iconCollisionSize / 2; + const iconBottom = pixelY + iconCollisionSize / 2; + + // 构建标签碰撞盒 + const labelText: string = e._labelText || ''; + const hasLabel = !!labelText; + let labelLeft = 0; + let labelRight = 0; + let labelTop = 0; + let labelBottom = 0; + + if (hasLabel) { + const lines = labelText.split('\n'); + const maxLineLength = Math.max( + ...lines.map((l: string) => l.length), + 1 + ); + const labelLineCount = lines.length; + // 标签碰撞偏移与 2D getPointLabelCollisionOffsetY 对齐 + const labelOffsetY = + labelLineCount > 1 ? -36 * dynamicScale : -28 * dynamicScale; + const estimatedWidth = maxLineLength * fontSize * 0.6 + 16; + const estimatedHeight = labelLineCount * (fontSize + 4) + 8; + const centerY = pixelY + labelOffsetY; + labelLeft = pixelX - estimatedWidth / 2; + labelRight = pixelX + estimatedWidth / 2; + labelTop = centerY - estimatedHeight / 2; + labelBottom = centerY + estimatedHeight / 2; + } + + const entityId = String(entity.id || ''); + const rawData: Record = e._rawData || {}; + + candidates.push({ + entity, + iconLeft, + iconRight, + iconTop, + iconBottom, + hasLabel, + labelLeft, + labelRight, + labelTop, + labelBottom, + engPriority: this.getEntityEngRenderPriority(entity), + nearbyPriority: Number(rawData._nearbyPriority || 9999), + densityPriority: this.getEntityDensityPriority(entity), + pixelX, + pixelY, + id: entityId + }); + }); + }); + + if (candidates.length === 0) return; + + // ===== 阶段1:排序(eng优先级 > 近邻点优先级 > 密度优先级 > Y轴 > ID) ===== + candidates.sort((left, right) => { + if (left.engPriority !== right.engPriority) { + return right.engPriority - left.engPriority; + } + if (left.nearbyPriority !== right.nearbyPriority) { + return left.nearbyPriority - right.nearbyPriority; + } + if (left.densityPriority !== right.densityPriority) { + return left.densityPriority - right.densityPriority; + } + if (left.pixelY !== right.pixelY) { + return left.pixelY - right.pixelY; + } + return left.id.localeCompare(right.id); + }); + + // ===== 阶段2:图标碰撞(AABB + 空间网格加速) ===== + const iconPlacedGrid = new Map< + string, + Array<{ + left: number; + right: number; + top: number; + bottom: number; + }> + >(); + + candidates.forEach(candidate => { + const iconRect = { + left: candidate.iconLeft, + right: candidate.iconRight, + top: candidate.iconTop, + bottom: candidate.iconBottom + }; + + const hasCollision = this.findCollidingRectInGrid( + iconRect, + iconPlacedGrid, + this.COLLISION_GRID_CELL_SIZE, + placed => this.checkIconsAabbCollision(placed, iconRect) + ); + + const iconVisible = !hasCollision; + (candidate.entity as any)._iconCollisionVisible = iconVisible; + + if (iconVisible) { + this.addRectToCollisionGrid( + iconRect, + iconPlacedGrid, + this.COLLISION_GRID_CELL_SIZE + ); + } + }); + + // ===== 阶段3:标签碰撞(先避让图标,再避让标签) ===== + const labelCandidates = [...candidates].sort((left, right) => { + if (left.engPriority !== right.engPriority) + return right.engPriority - left.engPriority; + if (left.nearbyPriority !== right.nearbyPriority) + return left.nearbyPriority - right.nearbyPriority; + if (left.pixelY !== right.pixelY) return left.pixelY - right.pixelY; + if (left.pixelX !== right.pixelX) return left.pixelX - right.pixelX; + return left.id.localeCompare(right.id); + }); + + const labelPlacedGrid = new Map< + string, + Array<{ + left: number; + right: number; + top: number; + bottom: number; + }> + >(); + + labelCandidates.forEach(candidate => { + const e = candidate.entity as any; + + if (!candidate.hasLabel) { + e._labelCollisionVisible = false; + return; + } + + // 3D 解耦:图标被碰撞隐藏不影响标签显示 + // 标签仍会避让已放置的图标(见下方 iconPlacedGrid 检查) + + const labelRect = { + left: candidate.labelLeft, + right: candidate.labelRight, + top: candidate.labelTop, + bottom: candidate.labelBottom + }; + + // 先避让已放置的图标(缩小保护区4px,允许边缘擦过) + const hasIconCollision = this.findCollidingRectInGrid( + labelRect, + iconPlacedGrid, + this.COLLISION_GRID_CELL_SIZE, + iconRect => { + const inset = 4; + const narrowed = { + left: iconRect.left + inset, + right: iconRect.right - inset, + top: iconRect.top + inset, + bottom: iconRect.bottom - inset + }; + return !( + narrowed.right <= labelRect.left || + narrowed.left >= labelRect.right || + narrowed.bottom <= labelRect.top || + narrowed.top >= labelRect.bottom + ); + } + ); + + if (hasIconCollision) { + e._labelCollisionVisible = false; + return; + } + + // 再避让已放置的标签 + const hasLabelCollision = this.findCollidingRectInGrid( + labelRect, + labelPlacedGrid, + this.COLLISION_GRID_CELL_SIZE, + placed => this.checkLabelAabbCollision(placed, labelRect) + ); + + const labelVisible = !hasLabelCollision; + e._labelCollisionVisible = labelVisible; + + if (labelVisible) { + this.addRectToCollisionGrid( + labelRect, + labelPlacedGrid, + this.COLLISION_GRID_CELL_SIZE + ); + } + }); + + // ===== 阶段4:统一应用可见性变化 ===== + let iconVisibleCount = 0; + let labelVisibleCount = 0; + candidates.forEach(candidate => { + const e = candidate.entity as any; + if (e._iconCollisionVisible) iconVisibleCount++; + if (e._labelCollisionVisible) labelVisibleCount++; + this.applyEntityVisibility(candidate.entity); + }); + + console.log( + `[Cesium Collision] 候选=${candidates.length} 图标可见=${iconVisibleCount} 标签可见=${labelVisibleCount}` + ); + } + + // ==================== 碰撞检测辅助:密度门控 ==================== + + /** 从实体原始数据中提取 density 字段(密度分档值,非物理距离) */ + private getEntityDensityValue(entity: Cesium.Entity): number | null { + const rawData = (entity as any)._rawData; + if (!rawData) return null; + const rawDistance = rawData.distance; + if ( + rawDistance === undefined || + rawDistance === null || + rawDistance === '' + ) { + return null; + } + const densityValue = Number(rawDistance); + return Number.isFinite(densityValue) ? densityValue : null; + } + + /** 密度优先级(档位越低越优先,与 2D getFeatureDensityPriority 对齐) */ + private getEntityDensityPriority(entity: Cesium.Entity): number { + const densityValue = this.getEntityDensityValue(entity); + const densityDisplayRules = getNearbyPointDensityDisplayRules(); + if (densityValue === null) { + return densityDisplayRules.length; + } + const matchedRuleIndex = densityDisplayRules.findIndex(rule => { + return densityValue >= rule.minDensityValue; + }); + return matchedRuleIndex >= 0 + ? matchedRuleIndex + : densityDisplayRules.length; + } + + /** 根据密度值获取最低显示缩放级别(与 2D getFeatureDensityMinZoom 对齐) */ + private getEntityDensityMinZoom(entity: Cesium.Entity): number { + const densityValue = this.getEntityDensityValue(entity); + if (densityValue === null) return 0; + const densityDisplayRules = getNearbyPointDensityDisplayRules(); + const matchedRule = densityDisplayRules.find(rule => { + return densityValue >= rule.minDensityValue; + }); + if (matchedRule) return matchedRule.minZoom; + return densityDisplayRules.at(-1)?.minZoom ?? 0; + } + + /** + * 孤立点密度豁免:如果当前视口内 56px 范围内没有其他同图层可见点, + * 则跳过密度门控直接显示(与 2D shouldBypassDensityGateForIsolatedFeature 对齐) + */ + private shouldBypassDensityGateForIsolatedEntity( + entity: Cesium.Entity, + pixelX: number, + pixelY: number, + layerKey: string, + densityPixelGrid: Map< + string, + Array<{ + entity: Cesium.Entity; + layerKey: string; + pixelX: number; + pixelY: number; + }> + > + ): boolean { + // 先登记当前实体到密度网格 + const gridKey = `${layerKey}:${Math.floor( + pixelX / this.DENSITY_ISOLATION_THRESHOLD + )}:${Math.floor(pixelY / this.DENSITY_ISOLATION_THRESHOLD)}`; + const bucket = densityPixelGrid.get(gridKey) || []; + bucket.push({ entity, layerKey, pixelX, pixelY }); + densityPixelGrid.set(gridKey, bucket); + + // 检查周围 3x3 网格单元 + const checkedKeys = new Set(); + for (let dx = -1; dx <= 1; dx++) { + for (let dy = -1; dy <= 1; dy++) { + const neighborKey = `${layerKey}:${ + Math.floor(pixelX / this.DENSITY_ISOLATION_THRESHOLD) + dx + }:${Math.floor(pixelY / this.DENSITY_ISOLATION_THRESHOLD) + dy}`; + if (checkedKeys.has(neighborKey)) continue; + checkedKeys.add(neighborKey); + + const neighborBucket = densityPixelGrid.get(neighborKey); + if (!neighborBucket?.length) continue; + + for (const neighbor of neighborBucket) { + if (neighbor.entity === entity) continue; + const dist = Math.hypot( + neighbor.pixelX - pixelX, + neighbor.pixelY - pixelY + ); + if (dist <= this.DENSITY_ISOLATION_THRESHOLD) { + return false; // 有近邻点,不豁免 + } + } + } + } + + return true; // 孤立点,豁免密度门控 + } + + // ==================== 碰撞检测辅助:eng 优先级 ==================== + + /** 判断是否为 eng 点(与 2D isFeatureEng 对齐) */ + private isEntityEng(entity: Cesium.Entity): boolean { + const e = entity as any; + const rawData: Record = e._rawData || {}; + const layerKey = String(e._layerKey || '').toLowerCase(); + const sttpMap = String( + rawData.sttpMap || rawData._sttpMap || '' + ).toUpperCase(); + const sttpCode = String( + rawData.sttpCode || rawData.sttp || '' + ).toUpperCase(); + + return ( + layerKey.includes('eng_point') || + sttpMap === 'ENG' || + sttpMap === 'ENG2' || + sttpCode === 'ENG' + ); + } + + /** 判断是否为 eng 告警点(与 2D isFeatureEngAlarm 对齐) */ + private isEntityEngAlarm(entity: Cesium.Entity): boolean { + const e = entity as any; + const rawData: Record = e._rawData || {}; + const layerKey = String(e._layerKey || '').toLowerCase(); + const legendState = String(rawData.anchoPointState || '') + .trim() + .toLowerCase(); + + return ( + layerKey.includes('eng_alarm_point') || + layerKey.includes('alarm_range') || + legendState.startsWith('alarm_range_') || + legendState.startsWith('large_eng_built_alarm_range_') || + legendState.startsWith('mid_eng_built_alarm_range_') + ); + } + + /** 获取 eng 渲染优先级:告警=300, eng=200, 普通=100(与 2D 完全一致) */ + private getEntityEngRenderPriority(entity: Cesium.Entity): number { + if (this.isEntityEngAlarm(entity)) return 300; + return this.isEntityEng(entity) ? 200 : 100; + } + + // ==================== 碰撞检测辅助:空间网格与 AABB ==================== + + /** 计算矩形覆盖的碰撞网格 cell keys */ + private getCollisionGridKeys( + rect: { + left: number; + right: number; + top: number; + bottom: number; + }, + cellSize: number + ): string[] { + const startX = Math.floor(rect.left / cellSize); + const endX = Math.floor(rect.right / cellSize); + const startY = Math.floor(rect.top / cellSize); + const endY = Math.floor(rect.bottom / cellSize); + const keys: string[] = []; + + for (let x = startX; x <= endX; x += 1) { + for (let y = startY; y <= endY; y += 1) { + keys.push(`${x}:${y}`); + } + } + + return keys; + } + + /** 将矩形注册到碰撞网格 */ + private addRectToCollisionGrid< + T extends { + left: number; + right: number; + top: number; + bottom: number; + } + >(rect: T, grid: Map, cellSize: number) { + this.getCollisionGridKeys(rect, cellSize).forEach(key => { + const bucket = grid.get(key) || []; + bucket.push(rect); + grid.set(key, bucket); + }); + } + + /** 在碰撞网格中查找与给定矩形碰撞的矩形 */ + private findCollidingRectInGrid< + T extends { + left: number; + right: number; + top: number; + bottom: number; + } + >( + rect: { + left: number; + right: number; + top: number; + bottom: number; + }, + grid: Map, + cellSize: number, + isCollision: (candidate: T) => boolean + ): T | undefined { + for (const key of this.getCollisionGridKeys(rect, cellSize)) { + const bucket = grid.get(key); + if (!bucket?.length) continue; + + for (const candidate of bucket) { + if (isCollision(candidate)) { + return candidate; + } + } + } + + return undefined; + } + + /** 图标碰撞检测:AABB 重叠判定(padding=0,与 2D 图标碰撞一致) */ + private checkIconsAabbCollision( + left: { left: number; right: number; top: number; bottom: number }, + right: { left: number; right: number; top: number; bottom: number } + ): boolean { + return !( + left.right < right.left || + left.left > right.right || + left.bottom < right.top || + left.top > right.bottom + ); + } + + /** 标签碰撞检测:AABB 重叠 + padding=4(与 2D checkLabelCollision 对齐) */ + private checkLabelAabbCollision( + left: { left: number; right: number; top: number; bottom: number }, + right: { left: number; right: number; top: number; bottom: number } + ): boolean { + const padding = this.COLLISION_LABEL_PADDING; + return !( + left.right + padding < right.left || + left.left - padding > right.right || + left.bottom + padding < right.top || + left.top - padding > right.bottom + ); + } + + // ==================== 倾斜摄影(OSGB) ==================== + + /** + * 加载倾斜摄影 3D Tileset 模型 + * 如果 viewer 尚未就绪,暂存到队列中,等 5 秒后批量加载 + */ + addQxsyLayer(item: OSGBItem): void { + if (!this.viewer || !this._ready) { + // 未就绪:放入等待队列 + if (!this._pendingOSGBItems.includes(item)) { + this._pendingOSGBItems.push(item); + } + return; + } + LoadOSGB(this.viewer, item); + } + + /** + * 批量加载所有等待中的倾斜摄影 + */ + private flushPendingOSGB(): void { + if (!this.viewer || this.viewer.isDestroyed()) return; + const items = this._pendingOSGBItems.splice(0); + console.log(`[Cesium] 开始加载 ${items.length} 个待加载的倾斜摄影模型`); + items.forEach(item => LoadOSGB(this.viewer!, item)); + } + + /** + * 移除倾斜摄影模型 + */ + removeQxsyLayer(item: OSGBItem): void { + if (!this.viewer) return; + // 从待加载队列中移除,防止已被移除的模型在 flushPendingOSGB 时又被加载 + this._pendingOSGBItems = this._pendingOSGBItems.filter(i => i !== item); + removeQxsy(this.viewer, item); + } + + /** + * 倾斜摄影显隐切换 + */ + qxsyChangeClick(item: OSGBItem, checked: boolean): void { + if (!this.viewer) return; + osgbChangeClick(this.viewer, item, checked); + } + + /** + * 飞行定位到倾斜摄影模型 + */ + qxsyToPosition(item: OSGBItem): void { + if (!this.viewer) return; + osgbLocation(this.viewer, item); + } +} diff --git a/frontend-sjgl/src/components/gis/map.class.ts b/frontend-sjgl/src/components/gis/map.class.ts new file mode 100644 index 00000000..ea1e450d --- /dev/null +++ b/frontend-sjgl/src/components/gis/map.class.ts @@ -0,0 +1,297 @@ +import type { layer, MapInterface } from './map.d'; +// import { MapLeaflet } from "./map.leaflet"; +import { MapOl } from './map.ol'; +import { MapCesium } from './map.cesium'; + +interface MapClassInterface extends MapInterface { + layers: Map; + view: any; +} + +//描点参数 +export type MDOptions = { + isAllowOverlap?: boolean; // 是否允许重叠 + labelType?: number; // 标签类型 + labelminZoom?: number; // 标签最小缩放级别 + labelAltitude?: object; // 标签海拔 + isRemove?: boolean; // 是否移除标签 +}; + +export const mapServerBaseUrl = + localStorage.getItem('gisurl') || 'http://210.72.227.199:18084/'; + +export class MapClass implements MapClassInterface { + layers: Map; + view: any; + private static instance: MapClass; + private service: MapInterface; + + constructor() { + this.layers = new Map(); + this.view = null; + // this.service = new MapLeaflet(); + this.service = new MapOl(); + } + static getInstance(): MapClass { + if (!this.instance) { + this.instance = new MapClass(); + } + return this.instance; + } + // 地图初始化 + init(container: HTMLElement, rectangle?: any): Promise { + return this.service.init(container, rectangle).then(map => { + this.view = map; + return map; + }); + } + // 基地面板控制 + jdPanelControlShowAndHidden(baseid: string, isAll: boolean): void { + this.service.jdPanelControlShowAndHidden(baseid, isAll); + } + + mdLayerShowOrHidden( + layerType: string, + key?: string, + baseid: string, + checked?: boolean, + isAll?: boolean + ): void { + this.service.mdLayerShowOrHidden(layerType, key, baseid, checked, isAll); + } + // 添加基础数据图层 + addBaseDataLayer(layer: any, isShow: boolean): void { + return this.service.addBaseDataLayer(layer, isShow); + } + // 基础图层显示影隐藏方法 + controlBaseLayerTreeShowAndHidden( + layerType: string, + key: string, + checked: boolean + ) { + this.service.controlBaseLayerTreeShowAndHidden(layerType, key, checked); + } + // 图层树控制描点数据显示隐藏方法 + mdLayerTreeShowOrHidden(layerType: string, checked?: boolean) { + this.service.mdLayerTreeShowOrHidden(layerType, checked); + } + // 根据图例控制锚点显示隐藏 + setLegendPointVisible( + layerKey: string, + anchoPointState: string, + checked: boolean + ): void { + this.service.setLegendPointVisible(layerKey, anchoPointState, checked); + } + // 初始化加载描点数据 + addInitDataLayer = (pointData: any[], layerType: any, mdoptions?: any) => { + return this.service.addInitDataLayer(pointData, layerType, mdoptions); + }; + //切换底图 + baseLayerSwitcher(key: string, checked: boolean): void { + this.service.baseLayerSwitcher(key, checked); + } + + // 添加梯级流域图 + addTertiarybasinLayer( + layer: layer, + fillcolor: any, + outlineColor: any, + datas: any + ): void { + this.service.addTertiarybasinLayer(layer, fillcolor, outlineColor, datas); + } + // 移除梯级流域图 + hideTertiarybasinLayer(layer: layer): void { + this.service.hideTertiarybasinLayer?.(layer); + } + // 缩放 + zoomToggle(type: 'out' | 'in') { + this.service.zoomToggle(type); + } + /** + * 长度量算 + */ + lengthCalculate(): void { + this.service.lengthCalculate(); + } + /** + * 面积量算 + */ + areCalculate(): void { + this.service.areCalculate(); + } + /** + * 移除量算结果 + */ + removeQueryLayer(): void { + this.service.removeQueryLayer(); + } + // 地图打印 + mapOutPut() { + this.service.mapOutPut(); + } + // 检查图层是否存在 + hasLayer(layerKey: string): boolean { + return this.service.hasLayer(layerKey); + } + // 检查 GIS/底图图层是否存在 + hasBaseLayer(layerKey: string): boolean { + return this.service.hasBaseLayer(layerKey); + } + // 删除描点图层 + removePointLayer(layerKey: string): void { + this.service.removePointLayer?.(layerKey); + } + // 销毁地图 + destroy(): void { + this.service.destroy(); + } + // 初始化弹窗 + initPopupOverlay(popupContainer: HTMLDivElement): void { + this.service.initPopupOverlay(popupContainer); + } + // 切换地图视图 + switchView(type: '2D' | '3D'): Promise { + // this.service.switchView(type); + return new Promise((resolve, reject) => { + const container = document.getElementById('mapContainer'); + if (!container) { + reject(new Error('Map container not found')); + return; + } + try { + // 1. 销毁当前地图服务 + if (this.service) { + try { + this.service.destroy(); + } catch (e) { + console.warn('Error destroying previous service:', e); + } + this.service = null; + } + this.view = null; + + // 2. 根据类型初始化新的地图服务 + if (type === '2D') { + this.service = new MapOl(); + + this.service + .init(container) + .then(map => { + this.view = map; + resolve(map); + }) + .catch(err => reject(err)); + } else if (type === '3D') { + this.service = new MapCesium(); + + this.service + .init(container) + .then(viewer => { + this.view = viewer; + resolve(viewer); + }) + .catch(err => reject(err)); + } + // const container = this.view._container; + // if (type === '3D' && this.view) { + // if (type === '2D') { + // const rectangle = this.view.camera.computeViewRectangle() + // const heading = this.view.camera.heading + // const height = this.view.camera.positionCartographic.height + // const zoom = altitudeToZoom(height) > 11 ? 11 : altitudeToZoom(height) + // const center = this.service?.getCenterPosition() + // const west = this.transformRadian(rectangle.west) + // const north = this.transformRadian(rectangle.north) + // const east = this.transformRadian(rectangle.east) + // const south = this.transformRadian(rectangle.south) + // const bearing = this.transformRadian(heading) + + // this.service = new MapOl(); + // this.init(document.getElementById('mapContainer')); + // // this.service + // .init(document.getElementById('mapContainer')) + // .then(map => { + // this.view = map; + // resolve(map); + // }); + // } else if (type === '3D') { + // const data: { + // _southWest: { lat: number; lng: number } + // _northEast: { lat: number; lng: number } + // } = this.view.getBounds() + // const bearing = this.view.getBearing() + // const heading = this.transformAngle(bearing) + // //获取相机高度 + // const altitude = zoomToAltitude(this.view.getZoom()) + // //获取地图中心点 + // let lng = 0.5 * (data._ne.lng + data._sw.lng) + // let lat = 0.5 * (data._ne.lat + data._sw.lat) + // let center = { lng, lat } + // this.destroy(); + + // this.service = null; + // this.view = null; + // this.service = new MapCesium() + // this.service.init(container, data, center, altitude, heading).then((viewer) => { + // this.view = viewer + // let removeCallback = viewer.scene.globe.tileLoadProgressEvent.addEventListener((e) => { + // if (e == 0) { + // removeCallback() + // removeCallback = null + // if (viewer && !viewer.isDestroyed()) { + // resolve(viewer) + // } + // } + // }) + // //容错机制,放置地图服务挂掉或者响应非常慢 + // setTimeout(() => { + // if (removeCallback) { + // removeCallback() + // removeCallback = null + // if (viewer && !viewer.isDestroyed()) { + // resolve(viewer) + // } + // } + // }, 5000) + // }) + // } + } catch { + reject(); + } + }); + } + + // 飞行到指定的点 + fitBounds(): void { + // this.service.fitBounds(bounds) + } + + // 飞行到指定的点 + flyTopanto(position: number[], zoom: number): void { + this.service.flyTopanto(position, zoom); + } + + getCurrentZoom(): number | undefined { + return this.service.getCurrentZoom(); + } + + // ==================== 倾斜摄影 ==================== + + addQxsyLayer(item: any): void { + this.service.addQxsyLayer?.(item); + } + + removeQxsyLayer(item: any): void { + this.service.removeQxsyLayer?.(item); + } + + qxsyChangeClick(item: any, checked: boolean): void { + this.service.qxsyChangeClick?.(item, checked); + } + + qxsyToPosition(item: any): void { + this.service.qxsyToPosition?.(item); + } +} diff --git a/frontend-sjgl/src/components/gis/map.d.ts b/frontend-sjgl/src/components/gis/map.d.ts new file mode 100644 index 00000000..9d04a2dd --- /dev/null +++ b/frontend-sjgl/src/components/gis/map.d.ts @@ -0,0 +1,245 @@ +import { MDOptions } from './map.class'; +export type layerType = + | 'markers' + | 'tiledMap' + | 'tiledMapQuery' + | 'geoJson' + | 'arcgisFeature' + | 'dynamicMapLayer' + | 'arcgisMap' + | 'label' + | 'vector'; +export type layerOption = { + opacity?: number; + data?: Array; + zIndex?: number; + clickEvent?: Function; + hoverEvent?: Function; + legendImages?: Array | null | undefined; + geoJsonLegend?: Array | null | undefined; + tiledMapType?: undefined | 'superMap'; +}; + +export interface layer { + id: string; + key: string; + _layer?: any; + type?: layerType; + url?: string; + url_3d?: string; + geojson_url: string; + label?: string; + thumbnail?: string; + visible?: boolean; + option?: layerOption; + tempobj?: any; + layers?: any; + rasteropacity?: any; + imgUrl?: any; + minZoom?: any; + maxZoom?: any; + minHeight?: number; + maxHeight?: number; + /** layer 类型 */ + layerType?: string; + matrixIds_index?: string[]; + tileMatrixSetID?: string; + urlType: string; +} + +export interface MapInterface { + /** + * 地图初始化 + * @param container DOM容器 + * @return any 地图视图 + */ + init( + container: HTMLElement, + rectangle?: any, + center?: any, + altitude?: number, + bearing?: number + ): Promise; + + /** + * 初始化加载描点数据 + * @param pointData + * @param layerType + */ + addInitDataLayer( + pointData: any[], + layerType: any, + mdoptions: MDOptions + ): void; + + /** + * 初始化弹窗 + * @param popupContainer + */ + initPopupOverlay(popupContainer: HTMLDivElement): void; + + /** + * 初始化加载基础图层 + * @param layer + */ + addBaseDataLayer(layer: any, isShow: boolean): void; + + /** + * 切换底图 + * @param layer + */ + baseLayerSwitcher(key: string, checked: boolean): void; + + /** + * 切换2D或者3D视图 + * @param type '2D' | '3D' + */ + switchView(type: '2D' | '3D'): any | null; + + /** + * 缩放 + * out 缩小 + * in 放大 + */ + zoomToggle(type: 'out' | 'in'): void; + + /** + * 检查图层是否存在 + * @param layerKey 图层 key + * @returns 是否存在 + */ + hasLayer(layerKey: string): boolean; + /** + * 检查 GIS/底图图层是否存在 + * @param layerKey 图层 key + * @returns 是否存在 + */ + hasBaseLayer(layerKey: string): boolean; + /** + * 地图输出打印 + */ + mapOutPut(): void; + + //飞行到指定的点 + fitBounds(bbox, bearing): void; + + flyTopanto(positon, zoom): void; + + /** + * 获取当前地图缩放级别语义 + * 2D 直接返回原生 zoom,3D 由相机高度换算后返回 + */ + getCurrentZoom(): number | undefined; + + /** + * 加载倾斜摄影数据 + */ + addQxsyLayer(item: any): void; + + /** + * 移除倾斜摄影数据 + */ + removeQxsyLayer(item: any): void; + + /** + * 倾斜摄影显隐切换 + */ + qxsyChangeClick(item: any, checked: boolean): void; + + /** + * 倾斜摄影定位 + */ + qxsyToPosition(item: any): void; + + /** + * 基地面板控制 + * @param baseid + * @param isAll + */ + jdPanelControlShowAndHidden(baseid: string, isAll: boolean): void; + /** + * 图例和基地面板控制描点数据显示隐藏方法 + * @param layerType + * @param key + * @param checked + * @param isAll + */ + mdLayerShowOrHidden( + layerType: string, + key?: string, + baseid: string, + checked?: boolean, + isAll?: boolean + ): void; + + /** + * 基础图层显示影隐藏方法 + * @param layerType + * @param checked + */ + controlBaseLayerTreeShowAndHidden( + layerType: string, + key: string, + checked: boolean + ): void; + + /** + * 图层树控制描点数据显示隐藏方法 + * @param layerType + * @param checked + */ + mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void; + + /** + * 删除描点图层 + * @param layerKey 图层 key + */ + removePointLayer(layerKey: string): void; + + /** + * 根据 anchoPointState 控制单个图例的锚点显示隐藏 + * @param layerKey 图层 key + * @param anchoPointState 锚点状态(对应图例的 nameEn) + * @param checked 是否显示 + */ + setLegendPointVisible( + layerKey: string, + anchoPointState: string, + checked: boolean + ): void; + + /** + * 长度量算 + */ + lengthCalculate(): void; + /** + * 面积量算 + */ + areCalculate(): void; + + /** + * 移除量算结果 + */ + removeQueryLayer(): void; + /** + * 添加梯级流域图 + * @param layer + * @param fillcolor + */ + addTertiarybasinLayer( + layer: layer, + fillcolor: any, + outlineColor: any, + datas: any + ): void; + + /** + * 移除梯级流域图 + * @param layer + */ + hideTertiarybasinLayer(layer: layer): void; + /** + * 移除地图对象 + */ + destroy(): void; +} diff --git a/frontend-sjgl/src/components/gis/map.leaflet.ts b/frontend-sjgl/src/components/gis/map.leaflet.ts new file mode 100644 index 00000000..e7da68d0 --- /dev/null +++ b/frontend-sjgl/src/components/gis/map.leaflet.ts @@ -0,0 +1,440 @@ +// import { MapInterface } from './map'; +// import * as L from 'leaflet'; +// import * as esriLeaflet from 'esri-leaflet'; +// import '@/utils/leaflet/leaflet-tilelayer-wmts-src.js'; +// import { mapServerBaseUrl } from './map.class'; +// import '@/utils/leaflet/leaflet.inflatable-markers-group.js'; +// import {MDOptions} from './map.class'; +// import { getIconPath } from "@/utils/index"; +// // @ts-ignore +// import axios from 'axios'; +// // import "@/components/thematicMap/leaflet/leaflet.inflatable-markers-group.js" + +// const tiledMapGroup = L.layerGroup(); +// const chartMapGroup = L.layerGroup(); +// const overlayGroup = L.layerGroup(); +// const CENTER_positionCN: any = [38, 114.17112499999996]; //中心纬经度 中国 +// const basinCenter = { +// DA_HHGLSX: [103.343357, 35.931812], +// FA_CJGLSX: [111.001911, 30.821327] +// }; +// let boundCavansLayer: any = null; +// let ganliulist: any = []; +// export class MapLeaflet implements MapInterface { +// map: any = null; +// htmlMakerLayer: any = []; +// defaultScale = 10; +// minimumZoom = 7; +// setDrawPlug: any = null; +// layermarkers: any = []; +// rainlayerslist: any = []; +// private layerRegistry: Map = new Map(); // ✅ 新增:存储 key -> layer 实例 + +// private currentBaseLayerKey: string | null = null; // ✅ 新增:记录当前激活的底图 Key + +// temperatureMapObj: any = []; +// //地图初始化 +// init(container: HTMLElement, rectangle?: any): Promise { +// try { +// console.log('init初始化container', container); +// var corner1 = L.latLng(55.35715491537772, 140.7821677051657); +// var corner2 = L.latLng(0.975580441812298, 67.56008229483018); +// var bounds = L.latLngBounds(corner2, corner1); +// const map = L.map(container as any, { +// preferCanvas: true, +// zoom: 4.5, +// minZoom: 4.23, +// maxZoom: 22, // 【修改点1】增大最大缩放级别,允许用户继续滚轮放大 +// maxNativeZoom: 12, +// zoomSnap: 0.1, // 【修改点2】让缩放更平滑,不强制对齐整数 +// zoomDelta: 0.5, +// center: CENTER_positionCN, +// attributionControl: false, +// zoomControl: false, +// trackResize: true, +// maxBounds: bounds, +// maxBoundsViscosity: 1.0, +// wheelPxPerZoomLevel: 180, +// }); +// // ✅ 新增:可视化显示 maxBounds 范围 +// // L.rectangle(bounds, {color: "#ff7800", weight: 3, opacity: 0.8, fillOpacity: 0.1}) +// // .addTo(map) +// // .bindPopup("这是 maxBounds 的范围"); +// this.map = map; +// this.map.on('zoomend', (e: any) => { +// console.log('当前缩放级别', e.target.getZoom()); +// }); +// return Promise.resolve(map); +// } catch (e) { +// console.log('测试', e); +// return Promise.reject({}); +// } +// } +// addBaseDataLayer(layer: any): any { +// // The WMTS URL +// console.log(layer); +// switch (layer.type) { +// case 'wmts': +// if (layer.url) { +// console.log('https://211.99.26.225:18085' + layer.url); +// if (layer) { +// var ignLayer = L.tileLayer +// .wmts('https://211.99.26.225:18085/geoserver/gwc/service/wmts', { +// tileMatrixSet: 'EPSG:3857_qgc_qsj_arcgistiles_l13', +// tileSize: 256, //切片大小 +// maxZoom: 13, +// noWrap: true, +// opacity: 0.99, +// minZoom: 4, +// styles:{ +// abc:123 +// }, +// layer: 'qgc_qsj_arcgistiles_l13' +// }) +// .addTo(this.map) +// .bringToBack(); +// const registryKey = layer.key || layer.title; +// if (registryKey) { +// this.layerRegistry.set(registryKey, ignLayer); +// } +// layer._layer = ignLayer; +// layer._layer.layerGroup = overlayGroup; +// } +// } +// return layer; + +// case 'markers': +// this.getRain(layer); +// break; +// default: { +// return; +// } +// } +// } + +// baseLayerSwitcher(key: string) { +// if (!this.map) return; + +// console.log('切换底图 key:', key); + +// // 1. 如果当前已有底图且不是同一个,先移除 +// if (this.currentBaseLayerKey && this.currentBaseLayerKey !== key) { +// const oldLayer = this.layerRegistry.get(this.currentBaseLayerKey); +// if (oldLayer && this.map.hasLayer(oldLayer)) { +// this.map.removeLayer(oldLayer); +// console.log(`已移除旧底图: ${this.currentBaseLayerKey}`); +// } +// } + +// // 2. 检查新底图是否已存在 registry 中 +// let newLayer = this.layerRegistry.get(key); + +// // 3. 如果不存在,则创建并添加到地图和 registry +// if (!newLayer) { +// newLayer = this.createBaseLayerByKey(key); +// if (newLayer) { +// this.layerRegistry.set(key, newLayer); +// newLayer.addTo(this.map); +// // 确保底图在最底层 +// newLayer.bringToBack(); +// } +// } else { +// // 4. 如果已存在,直接添加(如果未添加) +// if (!this.map.hasLayer(newLayer)) { +// newLayer.addTo(this.map); +// newLayer.bringToBack(); +// } +// } + +// // 5. 更新当前激活的 Key +// if (newLayer) { +// this.currentBaseLayerKey = key; +// } +// } + +// /** +// * 根据 Key 创建具体的 Leaflet 图层实例 +// */ +// createBaseLayerByKey(key: string): L.Layer | null { +// console.log(key) +// const tdtToken = 'e90d56e5a09d1767899ad45846b0cefd' //企业版密钥,勿换e650f138c4481cca888cd13094bb9026 +// const mapType = 'w' //c:天地图经纬度底图;w:天地图墨卡托底图 +// const URL_TerTDT = `https://t0.tianditu.gov.cn/ter_${mapType}/wmts?tk=${tdtToken}` //terMap +// switch (key) { +// case 's_province_boundaries': +// // 假设这是之前的 WMTS 矢量图层 +// // 注意:原代码中硬编码了 URL 和 layer 名称,这里需要确保与实际服务对应 +// return L.tileLayer.wmts('https://211.99.26.225:18085/geoserver/gwc/service/wmts', { +// tileMatrixSet: 'EPSG:3857_qgc_qsj_arcgistiles_l13', +// tileSize: 256, +// // maxZoom: 13, +// noWrap: true, +// opacity: 1, +// minZoom: 4, +// zIndex: 1, +// layer: 'qgc_qsj_arcgistiles_l13', // 请确认此 layer 名称是否对应“矢量” +// format: 'image/png' +// }); + +// case 'BASEMAP-white': +// // 地形图示例 (使用 OpenStreetMap 或其他地形服务作为占位,请替换为实际地址) +// return L.tileLayer(`${URL_TerTDT}&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=${mapType}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=tiles`, { +// // maxZoom: 17, +// format: "image/png", +// zIndex: 12, +// attribution: 'Map data: © OpenStreetMap contributors, SRTM | Map style: © OpenTopoMap (CC-BY-SA)' +// }); + +// case 'BASEMAP-img': +// // 影像图示例 (使用 Esri World Imagery 作为占位,请替换为实际地址) +// return L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', { +// attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community' +// }); + +// default: +// console.warn(`未知的底图 Key: ${key}`); +// return null; +// } +// } + +// controlBaseLayerTreeShowAndHidden(layerType: String, key: String, checked: boolean) { +// // 优先使用 key 查找,如果没有 key 则尝试用 layerType +// // console.log(this.getAllLayers()) +// console.log(key) +// console.log(this.layerRegistry) +// const registryKey:any = key || layerType; +// const layerInstance = this.layerRegistry.get(registryKey); +// if (layerInstance) { +// if (checked) { +// // 显示:如果不在地图上,则添加 +// if (!this.map.hasLayer(layerInstance)) { +// layerInstance.addTo(this.map); +// } +// } else { +// // 隐藏:如果在地图上,则移除 +// if (this.map.hasLayer(layerInstance)) { +// this.map.removeLayer(layerInstance); +// } +// } +// } else { +// console.warn(`未找到标识为 ${registryKey} 的图层实例`); +// } +// } + +// /** +// * 添加初始化数据图层 +// * @param pointLayerObj 图层配置对象 (包含 data, key, checked 等属性) +// * @param layerType 图层类型/Key (如果 pointLayerObj 中有 key,则优先使用 obj.key) +// * @param mdoptions 描点选项配置 +// * @param legendArray 图例映射数据 (用于根据 anchoPointState 匹配图标) +// */ +// addInitDataLayer = (pointLayerObj: any, layerType?: any, mdoptions?: MDOptions, legendArray?: any) => { +// // 1. 参数校验与数据提取 +// if (!this.map || !pointLayerObj) { +// return; +// } + +// let dataArray: any[] = []; +// let targetLayerKey: string = layerType; + +// if (Array.isArray(pointLayerObj)) { +// dataArray = pointLayerObj; +// } else { +// dataArray = pointLayerObj.data || []; +// targetLayerKey = pointLayerObj.key || layerType; +// } + +// if (!targetLayerKey) { +// console.warn('缺少图层 Key,无法加载描点'); +// return; +// } + +// if (dataArray.length === 0) { +// const existingGroup = this.layerRegistry.get(targetLayerKey); +// if (existingGroup && existingGroup instanceof L.LayerGroup) { +// existingGroup.clearLayers(); +// } +// return; +// } + +// console.log(`开始加载图层 [${targetLayerKey}] 的描点,数量: ${dataArray.length}`); + +// // 2. 获取或创建该图层的 LayerGroup +// let layerGroup = this.layerRegistry.get(targetLayerKey); + +// const shouldClear = mdoptions?.isRemove !== false; + +// if (!layerGroup || !(layerGroup instanceof L.LayerGroup)) { +// if (layerGroup && this.map.hasLayer(layerGroup)) { +// this.map.removeLayer(layerGroup); +// } +// layerGroup = L.layerGroup(); +// this.layerRegistry.set(targetLayerKey, layerGroup); +// layerGroup.addTo(this.map); +// } else { +// if (shouldClear) { +// layerGroup.clearLayers(); +// } +// } + +// // 3. 遍历数据生成 Marker +// dataArray.forEach((item: any) => { +// const { lgtd, lttd, stcd, stnm, iconCode, anchoPointState, _id, titleName, ennm } = item; + +// if (lgtd == null || lttd == null) { +// return; +// } + +// // 4. 确定图标样式和文字 +// let iconUrl = ''; +// let iconSize = [15, 15]; + +// // 获取图标 URL +// if (iconCode) { +// iconUrl = getIconPath(iconCode); +// } else if (anchoPointState && legendArray) { +// const legendItem = legendArray[anchoPointState]; +// if (legendItem && legendItem.icon) { +// iconUrl = getIconPath(legendItem.icon); +// if (legendItem.width && legendItem.height) { +// iconSize = [legendItem.width, legendItem.height]; +// } +// } +// } + +// // 如果没有找到图标,使用默认或跳过 +// if (!iconUrl) { +// // 可以选择使用默认图标或者继续 +// iconUrl = getIconPath('default'); // 假设有一个默认图标 +// if(!iconUrl) return; +// } + +// // 5. 创建带文字的 DivIcon +// // 显示的文字优先使用 titleName,其次 ennm,最后 stnm +// const labelText = titleName || ennm || stnm || ''; + +// // 构建 HTML 结构:一个容器包含图片和文字 +// // 注意:这里使用内联样式简单演示,建议在实际项目中提取到 CSS 类中 +// const iconHtml = ` +//
+//
+// ${labelText} +//
+// +//
`; + +// const customIcon = L.divIcon({ +// html: iconHtml, +// className: '', // 重要:设置为空字符串以避免 Leaflet 默认样式干扰 +// iconSize: [iconSize[0], iconSize[1] + 20], // 高度增加以容纳文字 (假设文字高约20px) +// iconAnchor: [iconSize[0] / 2, iconSize[1] + 10], // 锚点设在图片底部中心 +// popupAnchor: [0, -(iconSize[1] + 20)] // 弹窗锚点设在整体顶部 +// }); + +// // 6. 创建 Marker +// const marker = L.marker([lttd, lgtd], { +// icon: customIcon, +// // @ts-ignore +// options: { +// ...item, +// layerKey: targetLayerKey, +// originalEvent: item +// } +// }); + +// // 7. 绑定点击事件 (如果需要) +// marker.on('click', (e: any) => { +// // 触发全局事件,例如: +// // GlobalEvents.get('map_dataLayer_click').set(item); +// console.log('Marker clicked:', item); +// }); + +// // 8. 将 Marker 添加到 LayerGroup +// layerGroup.addLayer(marker); +// }); + +// console.log(`图层 [${targetLayerKey}] 描点加载完成`); +// } +// getRain(data: any) { +// if (data?.geojson) { +// this.removeRainLayer(); +// this.removeLayermarkers(); +// const renderColor = (item: any, colRules: any) => { +// let color = 'rgba(0,0,0,0)'; +// colRules.map((rule: any, index: number) => { +// if ( +// item.properties.hvalue >= rule?.sv && +// item.properties.hvalue < rule?.ev +// ) { +// color = rule.colors; +// } +// if (index === colRules.length - 1) { +// if (item.properties.hvalue >= rule?.ev) { +// color = rule.colors; +// } +// } +// }); +// return color; +// }; + +// data.geojson.features.map((item: any, index: number) => { +// let pushlist = L.geoJSON(item, { +// style: { +// color: renderColor(item, data.colRules), +// weight: 2, +// opacity: 0.8, +// fillOpacity: 0.7 +// // fillColor: "#1D91C0", +// } +// }).addTo(this.map); +// this.layermarkers.push(pushlist); +// }); +// } +// } +// removeLayermarkers = () => { +// // console.log('layermarkers',layermarkers); + +// try { +// if (this.layermarkers.length > 0) { +// if (this.map.hasLayer(this.layermarkers)) { +// this.map.removeLayer(this.layermarkers); +// } else { +// console.log('移除图层失败,应已经移除'); +// } +// } +// // removeAllGeojson(map); +// } catch (e) { +// // message.info('移除图层失败') +// console.log('移除图层失败,是否应移除'); +// } +// }; + +// removeRainLayer(): void { +// console.log('test!删除Layer'); +// const _this = this; +// if (this.rainlayerslist.length > 0) { +// this.rainlayerslist.map((item: any) => { +// _this.map.removeLayer(item); +// }); +// this.rainlayerslist = []; +// } +// } // 缩放 +// zoomToggle(type: 'out' | 'in') { +// if (this.map) { +// if (type === 'out') { +// this.map && this.map.zoomOut(); +// } else { +// this.map && this.map.zoomIn(); +// } +// } +// } +// } diff --git a/frontend-sjgl/src/components/gis/map.ol.ts b/frontend-sjgl/src/components/gis/map.ol.ts new file mode 100644 index 00000000..61b66db6 --- /dev/null +++ b/frontend-sjgl/src/components/gis/map.ol.ts @@ -0,0 +1,2616 @@ +import { MapInterface } from './map'; +import OlMap from 'ol/Map'; +import View from 'ol/View'; +import Overlay from 'ol/Overlay'; +import TileLayer from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import VectorSource from 'ol/source/Vector'; +import GeoJSON from 'ol/format/GeoJSON'; +import Style from 'ol/style/Style'; +import Fill from 'ol/style/Fill'; +import Stroke from 'ol/style/Stroke'; +import Icon from 'ol/style/Icon'; +import Text from 'ol/style/Text'; +import Circle from 'ol/style/Circle'; +import WMTS from 'ol/source/WMTS'; +import WMTSTileGrid from 'ol/tilegrid/WMTS'; +import { get as getProjection, fromLonLat } from 'ol/proj'; +import { + defaults as defaultInteractions, + Draw, + DoubleClickZoom, + DragPan +} from 'ol/interaction'; +import { getTopLeft, getWidth } from 'ol/extent'; +import MouseWheelZoom from 'ol/interaction/MouseWheelZoom'; +import { servers } from './mapurlManage'; +import { XYZ } from 'ol/source'; +import Feature from 'ol/Feature'; +import LineString from 'ol/geom/LineString'; +import Point from 'ol/geom/Point'; +import { + getLength as getSphericalLength, + getArea as getSphericalArea +} from 'ol/sphere'; +import { unByKey } from 'ol/Observable'; +import { MDOptions } from './map.class'; +import { useModelStore } from '@/store/modules/model'; +import { PointLayerManager } from './ol/point-layer-manager'; +import { PopupManager } from './ol/popup-manager'; +import { RegionMaskManager } from './ol/region-mask-manager'; +import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules'; +import router from '@/router'; + +const modelStore = useModelStore(); +const VITE_APP_MAP_URL = import.meta.env.VITE_APP_MAP_URL; + +// 定义与 leaflet 中相同的常量 +const CENTER_positionCN = [114.17112499999996, 38]; // OpenLayers 使用 [lon, lat] +const MIN_ZOOM = 4.23; +const MAX_ZOOM = 22; +const INITIAL_ZOOM = 4.5; +const BATCH_POPUP_MODE_ZOOM = 15; +const FULL_DISPLAY_NO_COLLISION_ZOOM = Number.POSITIVE_INFINITY; + +// 定义边界 [minX, minY, maxX, maxY] (Web Mercator 坐标) +const BOUNDS_SW = [26.5, -9.99999999999929]; +const BOUNDS_NE = [180.00000000000074, 60.06349386538693]; + +export class MapOl implements MapInterface { + map: OlMap | null = null; + view: View | null = null; + private layerRegistry: Map = new Map(); + private iconLoadState = new Map(); + private pointStyleCache = new Map(); + private baseLayerConfig: any | null = null; + private hydropBaseConfig: any | null = null; + private REGISTRY_KEY = 'customBaseLayer'; + private activeBaseLayerKey = 's_province_boundaries'; + private readonly rasterBaseLayerKeys = ['BASEMAP-white', 'BASEMAP-img']; + private drawInteraction: any = null; + private measureLayer: VectorLayer | null = null; + private measureSource: VectorSource | null = null; + private pointLayerManager: PointLayerManager; + geoJsonData: any = null; + geoJsonData1: any = null; + private BASEID = ''; + private currentClipGeoJson: any | null = null; + private clipRequestController: AbortController | null = null; + private hoveredFeatureId: string | number | null = null; + private popupManager: PopupManager; + private regionMaskManager: RegionMaskManager; + private isBatchPopupMode = false; + private batchPopupRefreshFrameId: number | null = null; + private batchPopupPendingRebuild = false; + private batchPopupPostRenderListenerKey: any = null; + private pointLayerStyleRefreshFrameId: number | null = null; + private labelVisibilityRefreshFrameId: number | null = null; + private labelVisibilityDebounceTimerId: number | null = null; + constructor() { + this.pointLayerManager = new PointLayerManager({ + map: null, + createStyle: feature => this.createPointStyle(feature) + }); + this.popupManager = new PopupManager({ + map: null, + getPointLayers: () => this.pointLayerManager.getLayers() + }); + this.regionMaskManager = new RegionMaskManager({ + map: null, + view: null, + pointLayerManager: this.pointLayerManager, + defaultCenter: CENTER_positionCN as [number, number], + defaultZoom: INITIAL_ZOOM + }); + } + private async loadGeoJsonData(url, signal?: AbortSignal): Promise { + try { + const response = await fetch(url, { signal }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + return data; + } catch (error: any) { + if (error.name !== 'AbortError') { + console.error('配置加载失败:', error); + } + } + } + //地图初始化 + init(container: HTMLElement): Promise { + try { + const minCoordinate = fromLonLat(BOUNDS_SW); + const maxCoordinate = fromLonLat(BOUNDS_NE); + const extent = [ + minCoordinate[0], + minCoordinate[1], + maxCoordinate[0], + maxCoordinate[1] + ]; + + this.view = new View({ + center: fromLonLat(CENTER_positionCN), // 设置中心点 + zoom: INITIAL_ZOOM, + minZoom: MIN_ZOOM, + maxZoom: MAX_ZOOM, + constrainOnlyCenter: false, // 允许部分视图超出边界,但中心点受限(类似 Leaflet 默认行为) + extent: extent, // 限制视图范围 + smoothExtentConstraint: false // 平滑边界约束 + }); + + const mouseWheelInteraction = new MouseWheelZoom({ + duration: 100, // 缩放动画持续时间 (ms),Leaflet 默认也有动画 + maxDelta: 2, + constrainResolution: false // ✅ 关键:false 允许缩放到非整数级别 (如 4.5, 4.6),实现平滑缩放 + }); + + this.map = new OlMap({ + target: container, + layers: [], + view: this.view, + controls: [], // 对应 Leaflet 的 attributionControl: false, zoomControl: false + interactions: defaultInteractions({ + doubleClickZoom: true, + dragPan: false, + + pinchRotate: false // 通常禁用旋转,除非需要 + }).extend([ + new DragPan({ + kinetic: undefined + }), + mouseWheelInteraction + ]) + }); + this.pointLayerManager.setMap(this.map); + this.popupManager.setMap(this.map); + this.regionMaskManager.setContext(this.map, this.view); + + this.view.on('change:resolution', () => { + this.handleZoomChange(); + }); + this.map.on('click', evt => { + if ( + router.currentRoute.value.path.includes( + 'shengTaiLiuLiangManZuQingKuangJiangJu' + ) + ) { + return; + } + this.popupManager.showPopup(undefined, undefined); + this.popupManager.handleMapClick(evt.pixel, detectedFeature => { + if (detectedFeature.values_.sttpMap == 'ylfb') { + modelStore.ylfbModalVisible = true; + modelStore.params = detectedFeature.values_; + } else { + modelStore.modalVisible = true; + modelStore.params = detectedFeature.values_; + modelStore.title = + detectedFeature.values_.titleName || + detectedFeature.values_.stnm + ' 详情信息'; + } + }); + }); + + this.map.on('pointermove', evt => { + this.popupManager.handlePointerMove(evt.pixel, payload => { + this.hoveredFeatureId = payload.hoveredId; + + const targetElement = this.map?.getTargetElement() as HTMLElement; + if (targetElement) { + targetElement.style.cursor = payload.hoveredId ? 'pointer' : ''; + } + + // 批量 popup 模式下不触发 hover popup + if (!this.isBatchPopupMode) { + this.showPopup(payload.detectedFeature, payload.coordinate); + } + }); + }); + + this.map.on('pointerdrag', () => { + if (this.isBatchPopupMode) { + this.ensureBatchPopupPostRenderSync(); + } + }); + this.map.on('moveend', () => { + this.clearBatchPopupPostRenderSync(); + this.requestRefreshPointLabelVisibility(false, 60); + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(false, true); + } + }); + + return Promise.resolve(this.map); + } catch (e) { + console.error('OL Init Error', e); + return Promise.reject(e); + } + } + + /** + * 初始化加载描点数据 + * @param pointData 图层配置对象或数据数组 + * @param layerType 图层类型/Key + * @param mdoptions 描点选项配置 + */ + addInitDataLayer( + pointData: any, + layerType: any, + _mdoptions?: MDOptions + ): void { + this.pointLayerManager.addDataLayer(pointData, layerType); + + if (this.currentClipGeoJson) { + this.regionMaskManager.filterPointsByRegion(this.currentClipGeoJson); + } + + const currentZoom = this.view ? this.view.getZoom() : INITIAL_ZOOM; + this.pointLayerManager.updateNearbyFeatureLayout(currentZoom); + this.requestRefreshPointLabelVisibility(false, 80); + } + /** + * 初始化 Popup Overlay + * @param container 父组件传入的 DOM 容器 + */ + initPopupOverlay(container: HTMLElement) { + this.popupManager.initPopupOverlay(container); + } + /** + * 在指定像素位置检测要素(共享方法) + * @param pixel 像素坐标 + * @returns 检测到的要素和是否命中图标区域 + */ + private detectFeatureAtPixel(pixel: number[]): { + detectedFeature: Feature | undefined; + isHitIcon: boolean; + coordinate?: number[]; + } { + return this.popupManager.detectFeatureAtPixel(pixel); + } + + /** + * 在 pointermove 中调用此方法显示/隐藏 Popup + * @param feature 当前悬停的要素 + * @param coordinate 地理坐标 + */ + showPopup(feature: Feature | undefined, coordinate: number[] | undefined) { + this.popupManager.showPopup(feature, coordinate); + } + + /** + * 监听缩放层级变化,到达指定层级时自动显示可视区域内所有锚点的 popup + */ + private handleZoomChange() { + if (!this.view) return; + + const zoom = this.view.getZoom(); + if (zoom === undefined) return; + + this.pointLayerManager.updateNearbyFeatureLayout(zoom); + this.requestRefreshPointLabelVisibility(); + + if (zoom >= BATCH_POPUP_MODE_ZOOM) { + this.enableBatchPopupMode(); + } else { + this.disableBatchPopupMode(); + } + } + + /** + * 启用批量 popup 模式:自动显示可视区域内所有锚点的 popup + */ + private enableBatchPopupMode() { + this.isBatchPopupMode = true; + this.clearBatchPopupPostRenderSync(); + this.popupManager.clearBatchPopups(); + this.requestUpdateBatchPopups(true, true); + } + + /** + * 禁用批量 popup 模式:恢复鼠标悬停显示 popup + */ + private disableBatchPopupMode() { + this.isBatchPopupMode = false; + this.batchPopupPendingRebuild = false; + this.clearBatchPopupPostRenderSync(); + if (this.batchPopupRefreshFrameId !== null) { + cancelAnimationFrame(this.batchPopupRefreshFrameId); + this.batchPopupRefreshFrameId = null; + } + this.popupManager.clearBatchPopups(); + this.popupManager.showPopup(undefined, undefined); + } + + /** + * 更新批量显示的 popups(拖动地图后调用) + */ + private updateBatchPopups() { + const features = this.pointLayerManager.getFeaturesInViewport(); + // 传入样式检查器,过滤掉 declutter/距离过滤等隐藏的锚点 + this.popupManager.showPopupsForFeatures( + features, + feature => { + const style = this.createPointStyle(feature); + return style !== null; + }, + { + rebuild: this.batchPopupPendingRebuild + } + ); + } + + private ensureBatchPopupPostRenderSync() { + if (!this.map || this.batchPopupPostRenderListenerKey) { + return; + } + + this.batchPopupPostRenderListenerKey = this.map.on('postrender', () => { + if (!this.isBatchPopupMode) { + return; + } + this.popupManager.updateBatchPopupPositions(feature => { + const style = this.createPointStyle(feature); + return style !== null; + }); + }); + } + + private clearBatchPopupPostRenderSync() { + if (this.batchPopupPostRenderListenerKey) { + unByKey(this.batchPopupPostRenderListenerKey); + this.batchPopupPostRenderListenerKey = null; + } + } + /** + * 创建点样式 (模拟 Leaflet 的 DivIcon 效果,支持随缩放动态调整大小) + */ + private createPointStyle(feature: Feature): Style[] | null { + const iconUrl = feature.get('_iconUrl') as string; + const labelText = feature.get('_labelText') as string; + const legendVisible = feature.get('_legendVisible'); + const regionVisible = feature.get('_regionVisible'); + + if (!iconUrl) { + return null; + } + + if (!this.ensureIconReady(iconUrl)) { + return null; + } + + const currentZoom: any = this.view ? this.view.getZoom() : 4.5; + const cachedDensityVisible = feature.get('_densityVisible'); + const densityVisible = + typeof cachedDensityVisible === 'boolean' + ? cachedDensityVisible + : currentZoom >= this.getFeatureDensityMinZoom(feature); + const iconTargetVisible = + legendVisible !== false && + regionVisible !== false && + densityVisible && + this.shouldRenderNearbyFeature(); + + const dynamicScale = this.getDynamicPointScale(currentZoom); + const fontSize = this.getPointFontSize(dynamicScale); + const engPriority = this.getFeatureEngRenderPriority(feature); + const formattedLabelText = this.formatPointLabelText(labelText); + const labelLineCount = formattedLabelText + ? formattedLabelText.split('\n').length + : 1; + const labelOffsetY = this.getPointLabelRenderOffsetY( + dynamicScale, + labelLineCount + ); + const iconCollisionVisible = feature.get('_iconCollisionVisible') !== false; + const labelCollisionVisible = + feature.get('_labelCollisionVisible') === true; + const finalIconVisible = iconTargetVisible && iconCollisionVisible; + const labelTargetVisible = + !this.isBatchPopupMode && + finalIconVisible && + !!formattedLabelText && + labelCollisionVisible; + + if (!finalIconVisible) { + return null; + } + + const styleCacheKey = [ + iconUrl, + dynamicScale.toFixed(2), + fontSize, + engPriority, + labelOffsetY, + labelTargetVisible ? formattedLabelText : '', + labelTargetVisible ? 1 : 0 + ].join('|'); + const cachedStyles = this.pointStyleCache.get(styleCacheKey); + if (cachedStyles) { + return cachedStyles; + } + + const styles: Style[] = [ + new Style({ + zIndex: engPriority, + image: new Icon({ + src: iconUrl, + scale: dynamicScale, + anchor: [0.5, 0.5], + crossOrigin: 'anonymous', + declutterMode: 'none' + }) + }) + ]; + + if (formattedLabelText && labelTargetVisible) { + styles.push( + new Style({ + zIndex: engPriority + 1, + text: new Text({ + text: formattedLabelText, + offsetY: labelOffsetY, + font: `${fontSize}px sans-serif`, + fill: new Fill({ color: '#fff' }), + stroke: new Stroke({ + color: 'rgba(0, 0, 0, 0.9)', + width: 2 + }), + textAlign: 'center', + declutterMode: 'none' + }) + }) + ); + } + + this.pointStyleCache.set(styleCacheKey, styles); + return styles; + } + + private markFeatureVisibilityDirty( + feature: Feature, + key: '_densityVisible' | '_iconCollisionVisible' | '_labelCollisionVisible', + visible: boolean, + dirtyLayerKeys?: Set + ) { + if (feature.get(key) === visible) { + return; + } + + feature.set(key, visible, true); + const layerKey = feature.get('_layerKey'); + if (dirtyLayerKeys && layerKey) { + dirtyLayerKeys.add(String(layerKey)); + } + } + + private flushDirtyPointLayers(dirtyLayerKeys: Set) { + dirtyLayerKeys.forEach(layerKey => { + const layer = this.pointLayerManager.getLayer(layerKey); + layer?.changed(); + }); + } + + private syncFeatureDensityVisible( + feature: Feature, + visible: boolean, + dirtyLayerKeys?: Set + ) { + this.markFeatureVisibilityDirty( + feature, + '_densityVisible', + visible, + dirtyLayerKeys + ); + } + + private getFeaturePixelGridKey( + layerKey: string, + pixelX: number, + pixelY: number, + cellSize: number + ) { + return `${layerKey}:${Math.floor(pixelX / cellSize)}:${Math.floor( + pixelY / cellSize + )}`; + } + + private hasNearbyViewportFeature( + target: { + feature: Feature; + layerKey: string; + pixelX: number; + pixelY: number; + }, + pixelGrid: Map< + string, + Array<{ + feature: Feature; + layerKey: string; + pixelX: number; + pixelY: number; + }> + >, + threshold: number + ): boolean { + const cellX = Math.floor(target.pixelX / threshold); + const cellY = Math.floor(target.pixelY / threshold); + + for (let offsetX = -1; offsetX <= 1; offsetX += 1) { + for (let offsetY = -1; offsetY <= 1; offsetY += 1) { + const bucket = pixelGrid.get( + `${target.layerKey}:${cellX + offsetX}:${cellY + offsetY}` + ); + if (!bucket?.length) { + continue; + } + + for (const candidate of bucket) { + if (candidate.feature === target.feature) { + continue; + } + if ( + Math.hypot( + candidate.pixelX - target.pixelX, + candidate.pixelY - target.pixelY + ) <= threshold + ) { + return true; + } + } + } + } + + return false; + } + + private getCollisionGridKeys( + rect: { left: number; right: number; top: number; bottom: number }, + cellSize: number + ): string[] { + const startX = Math.floor(rect.left / cellSize); + const endX = Math.floor(rect.right / cellSize); + const startY = Math.floor(rect.top / cellSize); + const endY = Math.floor(rect.bottom / cellSize); + const keys: string[] = []; + + for (let x = startX; x <= endX; x += 1) { + for (let y = startY; y <= endY; y += 1) { + keys.push(`${x}:${y}`); + } + } + + return keys; + } + + private addRectToCollisionGrid< + T extends { + left: number; + right: number; + top: number; + bottom: number; + } + >(rect: T, grid: Map, cellSize: number) { + this.getCollisionGridKeys(rect, cellSize).forEach(key => { + const bucket = grid.get(key) || []; + bucket.push(rect); + grid.set(key, bucket); + }); + } + + private findCollidingRectInGrid< + T extends { + left: number; + right: number; + top: number; + bottom: number; + } + >( + rect: { left: number; right: number; top: number; bottom: number }, + grid: Map, + cellSize: number, + isCollision: (candidate: T) => boolean + ): T | undefined { + for (const key of this.getCollisionGridKeys(rect, cellSize)) { + const bucket = grid.get(key); + if (!bucket?.length) { + continue; + } + + for (const candidate of bucket) { + if (isCollision(candidate)) { + return candidate; + } + } + } + + return undefined; + } + + private refreshPointLabelVisibility() { + if (!this.map || !this.view) return; + + const currentZoom = this.view.getZoom(); + if (currentZoom === undefined) return; + + const candidateMap = new Map< + string, + { + feature: Feature; + iconLeft: number; + iconRight: number; + iconTop: number; + iconBottom: number; + hasLabel: boolean; + left: number; + right: number; + top: number; + bottom: number; + priority: number; + engPriority: number; + densityPriority: number; + id: string; + pixelX: number; + pixelY: number; + } + >(); + const candidates: Array<{ + feature: Feature; + iconLeft: number; + iconRight: number; + iconTop: number; + iconBottom: number; + hasLabel: boolean; + left: number; + right: number; + top: number; + bottom: number; + priority: number; + engPriority: number; + densityPriority: number; + id: string; + pixelX: number; + pixelY: number; + }> = []; + + const viewportFeatures = this.pointLayerManager.getFeaturesInViewport(); + const dirtyLayerKeys = new Set(); + const densityIsolationThreshold = 56; + const densityPixelGrid = new Map< + string, + Array<{ + feature: Feature; + layerKey: string; + pixelX: number; + pixelY: number; + }> + >(); + const viewportEntries: Array<{ + feature: Feature; + layerKey: string; + iconUrl: string; + legendVisible: boolean; + regionVisible: boolean; + densityPriority: number; + nearbyVisible: boolean; + labelText: string; + pixelX?: number; + pixelY?: number; + }> = []; + + viewportFeatures.forEach(feature => { + const geometry = feature.getGeometry(); + const pixel = + geometry && geometry.getType() === 'Point' + ? this.map?.getPixelFromCoordinate( + (geometry as Point).getCoordinates() + ) + : null; + const layerKey = String(feature.get('_layerKey') || ''); + const entry = { + feature, + layerKey, + iconUrl: String(feature.get('_iconUrl') || ''), + legendVisible: feature.get('_legendVisible') !== false, + regionVisible: feature.get('_regionVisible') !== false, + densityPriority: this.getFeatureDensityPriority(feature), + nearbyVisible: this.shouldRenderNearbyFeature(), + labelText: this.formatPointLabelText( + feature.get('_labelText') as string + ), + pixelX: pixel?.[0], + pixelY: pixel?.[1] + }; + viewportEntries.push(entry); + + if ( + pixel && + entry.layerKey && + entry.legendVisible && + entry.regionVisible + ) { + const gridKey = this.getFeaturePixelGridKey( + entry.layerKey, + pixel[0], + pixel[1], + densityIsolationThreshold + ); + const bucket = densityPixelGrid.get(gridKey) || []; + bucket.push({ + feature, + layerKey: entry.layerKey, + pixelX: pixel[0], + pixelY: pixel[1] + }); + densityPixelGrid.set(gridKey, bucket); + } + }); + + if (currentZoom >= FULL_DISPLAY_NO_COLLISION_ZOOM) { + viewportEntries.forEach(entry => { + const minZoom = this.getFeatureDensityMinZoom(entry.feature); + const densityVisible = + currentZoom >= minZoom || + (entry.legendVisible && + entry.regionVisible && + !!entry.layerKey && + entry.pixelX !== undefined && + entry.pixelY !== undefined && + !this.hasNearbyViewportFeature( + { + feature: entry.feature, + layerKey: entry.layerKey, + pixelX: entry.pixelX, + pixelY: entry.pixelY + }, + densityPixelGrid, + densityIsolationThreshold + )); + this.syncFeatureDensityVisible( + entry.feature, + densityVisible, + dirtyLayerKeys + ); + const shouldRenderIcon = + !!entry.iconUrl && + this.isIconReady(entry.iconUrl) && + entry.legendVisible && + entry.regionVisible && + densityVisible && + entry.nearbyVisible; + const hasLabel = !!entry.labelText; + + this.syncFeatureIconCollisionVisible( + entry.feature, + shouldRenderIcon, + dirtyLayerKeys + ); + this.syncFeatureLabelCollisionVisible( + entry.feature, + shouldRenderIcon && hasLabel, + dirtyLayerKeys + ); + }); + this.flushDirtyPointLayers(dirtyLayerKeys); + return; + } + + viewportEntries.forEach(entry => { + const minZoom = this.getFeatureDensityMinZoom(entry.feature); + const densityVisible = + currentZoom >= minZoom || + (entry.legendVisible && + entry.regionVisible && + !!entry.layerKey && + entry.pixelX !== undefined && + entry.pixelY !== undefined && + !this.hasNearbyViewportFeature( + { + feature: entry.feature, + layerKey: entry.layerKey, + pixelX: entry.pixelX, + pixelY: entry.pixelY + }, + densityPixelGrid, + densityIsolationThreshold + )); + this.syncFeatureDensityVisible( + entry.feature, + densityVisible, + dirtyLayerKeys + ); + + const shouldRenderIcon = + !!entry.iconUrl && + this.isIconReady(entry.iconUrl) && + entry.legendVisible && + entry.regionVisible && + densityVisible && + entry.nearbyVisible; + + if (!shouldRenderIcon) { + this.syncFeatureIconCollisionVisible( + entry.feature, + false, + dirtyLayerKeys + ); + this.syncFeatureLabelCollisionVisible( + entry.feature, + false, + dirtyLayerKeys + ); + return; + } + + if (entry.pixelX === undefined || entry.pixelY === undefined) { + this.syncFeatureIconCollisionVisible( + entry.feature, + false, + dirtyLayerKeys + ); + this.syncFeatureLabelCollisionVisible( + entry.feature, + false, + dirtyLayerKeys + ); + return; + } + + const dynamicScale = this.getDynamicPointScale(currentZoom); + // 备注:图标碰撞盒适当小于视觉图标尺寸,允许相邻站点轻微贴近显示, + // 避免像“小浪底/三门峡”这类近点被过早裁掉成只剩一个点。 + const iconCollisionSize = Math.max(14, 24 * dynamicScale); + const iconPadding = 0; + const iconLeft = entry.pixelX - iconCollisionSize / 2 - iconPadding; + const iconRight = entry.pixelX + iconCollisionSize / 2 + iconPadding; + const iconTop = entry.pixelY - iconCollisionSize / 2 - iconPadding; + const iconBottom = entry.pixelY + iconCollisionSize / 2 + iconPadding; + const labelText = entry.labelText; + const fontSize = this.getPointFontSize(dynamicScale); + const lines = labelText ? labelText.split('\n') : ['']; + const maxLineLength = Math.max(...lines.map(line => line.length), 1); + const labelLineCount = lines.length; + const labelOffsetY = this.getPointLabelCollisionOffsetY( + dynamicScale, + labelLineCount + ); + const estimatedWidth = maxLineLength * fontSize * 0.6 + 16; + const estimatedHeight = labelLineCount * (fontSize + 4) + 8; + const centerX = entry.pixelX; + const centerY = entry.pixelY + labelOffsetY; + const candidateId = String( + entry.feature.getId?.() || entry.feature.get('stcd') || '' + ); + const dedupeKey = + candidateId || + [ + entry.feature.get('_layerKey') || '', + entry.pixelX.toFixed(2), + entry.pixelY.toFixed(2), + labelText + ].join('|'); + + candidateMap.set(dedupeKey, { + feature: entry.feature, + iconLeft, + iconRight, + iconTop, + iconBottom, + hasLabel: !!labelText, + left: centerX - estimatedWidth / 2, + right: centerX + estimatedWidth / 2, + top: centerY - estimatedHeight / 2, + bottom: centerY + estimatedHeight / 2, + priority: Number(entry.feature.get('_nearbyPriority') || 9999), + engPriority: this.getFeatureEngRenderPriority(entry.feature), + densityPriority: entry.densityPriority, + id: candidateId, + pixelX: entry.pixelX, + pixelY: entry.pixelY + }); + }); + + candidateMap.forEach(candidate => { + candidates.push(candidate); + }); + + candidates.sort((left, right) => { + if (left.engPriority !== right.engPriority) { + return right.engPriority - left.engPriority; + } + if (left.priority !== right.priority) { + return left.priority - right.priority; + } + if (left.densityPriority !== right.densityPriority) { + return left.densityPriority - right.densityPriority; + } + if (left.pixelY !== right.pixelY) { + return left.pixelY - right.pixelY; + } + return left.id.localeCompare(right.id); + }); + + const placedIconRects: Array<{ + featureId: string; + left: number; + right: number; + top: number; + bottom: number; + }> = []; + const placedIconGrid = new Map< + string, + Array<{ + featureId: string; + left: number; + right: number; + top: number; + bottom: number; + }> + >(); + const placedLabelRects: Array<{ + featureId: string; + left: number; + right: number; + top: number; + bottom: number; + }> = []; + const placedLabelGrid = new Map< + string, + Array<{ + featureId: string; + left: number; + right: number; + top: number; + bottom: number; + }> + >(); + const collisionGridCellSize = 96; + + candidates.forEach(candidate => { + const featureId = String( + candidate.feature.getId?.() || candidate.feature.get('stcd') || '' + ); + const iconRect = { + left: candidate.iconLeft, + right: candidate.iconRight, + top: candidate.iconTop, + bottom: candidate.iconBottom + }; + const iconHasCollision = !!this.findCollidingRectInGrid( + iconRect, + placedIconGrid, + collisionGridCellSize, + rect => this.checkLabelCollision(rect, iconRect) + ); + const iconVisible = !iconHasCollision; + this.syncFeatureIconCollisionVisible( + candidate.feature, + iconVisible, + dirtyLayerKeys + ); + + if (iconVisible) { + placedIconRects.push({ + featureId, + left: iconRect.left, + right: iconRect.right, + top: iconRect.top, + bottom: iconRect.bottom + }); + this.addRectToCollisionGrid( + placedIconRects[placedIconRects.length - 1], + placedIconGrid, + collisionGridCellSize + ); + } + }); + + const labelCandidates = [...candidates].sort((left, right) => { + if (left.engPriority !== right.engPriority) { + return right.engPriority - left.engPriority; + } + if (left.priority !== right.priority) { + return left.priority - right.priority; + } + if (left.pixelY !== right.pixelY) { + return left.pixelY - right.pixelY; + } + if (left.pixelX !== right.pixelX) { + return left.pixelX - right.pixelX; + } + return left.id.localeCompare(right.id); + }); + + labelCandidates.forEach(candidate => { + const featureId = String( + candidate.feature.getId?.() || candidate.feature.get('stcd') || '' + ); + const iconVisible = + candidate.feature.get('_iconCollisionVisible') !== false; + if (!candidate.hasLabel) { + this.syncFeatureLabelCollisionVisible( + candidate.feature, + false, + dirtyLayerKeys + ); + return; + } + if (!iconVisible) { + this.syncFeatureLabelCollisionVisible( + candidate.feature, + false, + dirtyLayerKeys + ); + return; + } + + const collidingIconRect = this.findCollidingRectInGrid( + candidate, + placedIconGrid, + collisionGridCellSize, + rect => + rect.featureId !== featureId && + this.checkLabelCollisionWithIcon(rect, candidate) + ); + const hasCollisionWithIcon = !!collidingIconRect; + const collidingLabelRect = this.findCollidingRectInGrid( + candidate, + placedLabelGrid, + collisionGridCellSize, + rect => this.checkLabelCollision(rect, candidate) + ); + const hasCollisionWithLabel = !!collidingLabelRect; + const visible = !hasCollisionWithIcon && !hasCollisionWithLabel; + + this.syncFeatureLabelCollisionVisible( + candidate.feature, + visible, + dirtyLayerKeys + ); + + if (visible) { + placedLabelRects.push({ + featureId, + left: candidate.left, + right: candidate.right, + top: candidate.top, + bottom: candidate.bottom + }); + this.addRectToCollisionGrid( + placedLabelRects[placedLabelRects.length - 1], + placedLabelGrid, + collisionGridCellSize + ); + } + }); + this.flushDirtyPointLayers(dirtyLayerKeys); + } + + private requestRefreshPointLabelVisibility( + immediate = false, + debounceMs = 0 + ) { + if (this.labelVisibilityDebounceTimerId !== null) { + window.clearTimeout(this.labelVisibilityDebounceTimerId); + this.labelVisibilityDebounceTimerId = null; + } + + if (immediate) { + if (this.labelVisibilityRefreshFrameId !== null) { + cancelAnimationFrame(this.labelVisibilityRefreshFrameId); + this.labelVisibilityRefreshFrameId = null; + } + this.refreshPointLabelVisibility(); + return; + } + + if (debounceMs > 0) { + this.labelVisibilityDebounceTimerId = window.setTimeout(() => { + this.labelVisibilityDebounceTimerId = null; + this.requestRefreshPointLabelVisibility(); + }, debounceMs); + return; + } + + if (this.labelVisibilityRefreshFrameId !== null) { + return; + } + + this.labelVisibilityRefreshFrameId = window.requestAnimationFrame(() => { + this.labelVisibilityRefreshFrameId = null; + this.refreshPointLabelVisibility(); + }); + } + + private syncFeatureIconCollisionVisible( + feature: Feature, + visible: boolean, + dirtyLayerKeys?: Set + ) { + this.markFeatureVisibilityDirty( + feature, + '_iconCollisionVisible', + visible, + dirtyLayerKeys + ); + } + + private syncFeatureLabelCollisionVisible( + feature: Feature, + visible: boolean, + dirtyLayerKeys?: Set + ) { + this.markFeatureVisibilityDirty( + feature, + '_labelCollisionVisible', + visible, + dirtyLayerKeys + ); + } + + private isIconReady(iconUrl: string): boolean { + return this.iconLoadState.get(iconUrl) === 'loaded'; + } + + private ensureIconReady(iconUrl: string): boolean { + if (!iconUrl) { + return false; + } + + const status = this.iconLoadState.get(iconUrl); + if (status === 'loaded') { + return true; + } + if (status === 'loading' || status === 'error') { + return false; + } + + this.iconLoadState.set(iconUrl, 'loading'); + const image = new Image(); + image.crossOrigin = 'anonymous'; + image.onload = () => { + this.iconLoadState.set(iconUrl, 'loaded'); + this.requestRefreshPointLayerStyles(); + }; + image.onerror = () => { + this.iconLoadState.set(iconUrl, 'error'); + this.requestRefreshPointLayerStyles(); + }; + image.src = iconUrl; + + if (image.complete && image.naturalWidth > 0) { + this.iconLoadState.set(iconUrl, 'loaded'); + return true; + } + + return false; + } + + private requestRefreshPointLayerStyles() { + if (this.pointLayerStyleRefreshFrameId !== null) { + return; + } + + this.pointLayerStyleRefreshFrameId = window.requestAnimationFrame(() => { + this.pointLayerStyleRefreshFrameId = null; + this.refreshPointLayerStyles(); + }); + } + + private refreshPointLayerStyles() { + this.pointLayerManager.forEachLayer(layer => { + layer.changed(); + }); + this.requestRefreshPointLabelVisibility(); + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(); + } + } + + private requestUpdateBatchPopups(immediate = false, rebuild = true) { + if (!this.isBatchPopupMode) { + return; + } + this.batchPopupPendingRebuild = this.batchPopupPendingRebuild || rebuild; + + if (immediate) { + if (this.batchPopupRefreshFrameId !== null) { + cancelAnimationFrame(this.batchPopupRefreshFrameId); + this.batchPopupRefreshFrameId = null; + } + this.updateBatchPopups(); + this.batchPopupPendingRebuild = false; + return; + } + + if (this.batchPopupRefreshFrameId !== null) { + return; + } + + this.batchPopupRefreshFrameId = window.requestAnimationFrame(() => { + this.batchPopupRefreshFrameId = null; + if (!this.isBatchPopupMode) { + return; + } + this.updateBatchPopups(); + this.batchPopupPendingRebuild = false; + }); + } + + private checkLabelCollision( + left: { left: number; right: number; top: number; bottom: number }, + right: { left: number; right: number; top: number; bottom: number } + ) { + const padding = 4; + return !( + left.right + padding < right.left || + left.left - padding > right.right || + left.bottom + padding < right.top || + left.top - padding > right.bottom + ); + } + + private checkLabelCollisionWithIcon( + iconRect: { left: number; right: number; top: number; bottom: number }, + labelRect: { left: number; right: number; top: number; bottom: number } + ) { + // 标签避让图标时仅保留图标中心更小的保护区,并允许边缘接触不算碰撞, + // 避免像“三峡/黄龙滩”这类仅在边界轻微擦到时把文字过度压掉。 + const inset = 4; + const padding = 0; + const narrowedIconRect = { + left: iconRect.left + inset, + right: iconRect.right - inset, + top: iconRect.top + inset, + bottom: iconRect.bottom - inset + }; + + return !( + narrowedIconRect.right + padding <= labelRect.left || + narrowedIconRect.left - padding >= labelRect.right || + narrowedIconRect.bottom + padding <= labelRect.top || + narrowedIconRect.top - padding >= labelRect.bottom + ); + } + + /** + * 点位标注最多显示两行,每行 12 个字符;超出部分在第二行末尾显示省略号。 + */ + private formatPointLabelText(text: string): string { + const normalizedText = String(text || '') + .replace(/[()()]/g, '') + .trim(); + if (!normalizedText) { + return ''; + } + + const maxLineLength = 12; + if (normalizedText.length <= maxLineLength) { + return normalizedText; + } + + const firstLine = normalizedText.slice(0, maxLineLength); + if (normalizedText.length <= maxLineLength * 2) { + return `${firstLine}\n${normalizedText.slice(maxLineLength)}`; + } + + const secondLine = `${normalizedText.slice( + maxLineLength, + maxLineLength + 9 + )}...`; + return `${firstLine}\n${secondLine}`; + } + + /** + * 根据缩放级别计算锚点图标缩放比例,统一复用,减少样式函数中的重复判断。 + */ + private getDynamicPointScale(currentZoom: number): number { + let dynamicScale = 0.7 + (currentZoom - 4.5) * 0.08; + dynamicScale = Math.max(0.5, Math.min(3.0, dynamicScale)); + return dynamicScale; + } + + /** + * 根据图标缩放比例统一计算文字字号,避免样式函数中散落重复计算。 + */ + private getPointFontSize(dynamicScale: number): number { + return Math.max(10, Math.min(24, 12 * dynamicScale)); + } + + /** + * 统一计算标签渲染时的纵向偏移,保持视觉位置与原效果一致。 + */ + private getPointLabelRenderOffsetY( + dynamicScale: number, + labelLineCount: number + ): number { + return labelLineCount > 1 ? -30 * dynamicScale : -22 * dynamicScale; + } + + /** + * 统一计算标签碰撞时的纵向偏移。 + * 这里允许比视觉位置略高一点,避免相邻点图标过早压掉主标签。 + */ + private getPointLabelCollisionOffsetY( + dynamicScale: number, + labelLineCount: number + ): number { + return labelLineCount > 1 ? -36 * dynamicScale : -28 * dynamicScale; + } + + /** + * distance 字段表示点位密度分档,不是物理距离。 + * 这里仅用它决定点位从哪个缩放级别开始参与显示候选。 + */ + private getFeatureDensityValue(feature: Feature): number | null { + const rawDistance = feature.get('distance'); + if ( + rawDistance === undefined || + rawDistance === null || + rawDistance === '' + ) { + return null; + } + const densityValue = Number(rawDistance); + return Number.isFinite(densityValue) ? densityValue : null; + } + + private getFeatureDensityPriority(feature: Feature): number { + const densityValue = this.getFeatureDensityValue(feature); + const densityDisplayRules = getNearbyPointDensityDisplayRules(); + if (densityValue === null) { + return densityDisplayRules.length; + } + + const matchedRuleIndex = densityDisplayRules.findIndex(rule => { + return densityValue >= rule.minDensityValue; + }); + return matchedRuleIndex >= 0 + ? matchedRuleIndex + : densityDisplayRules.length; + } + + private getFeatureDensityMinZoom(feature: Feature): number { + const densityValue = this.getFeatureDensityValue(feature); + if (densityValue === null) { + return 0; + } + + const densityDisplayRules = getNearbyPointDensityDisplayRules(); + const matchedRule = densityDisplayRules.find(rule => { + return densityValue >= rule.minDensityValue; + }); + if (matchedRule) { + return matchedRule.minZoom; + } + + return densityDisplayRules.at(-1)?.minZoom ?? 0; + } + + private isFeatureEng(feature: Feature): boolean { + const layerKey = String(feature.get('_layerKey') || '').toLowerCase(); + const sttpMap = String( + feature.get('_sttpMap') || feature.get('sttpMap') || '' + ).toUpperCase(); + const sttpCode = String( + feature.get('sttpCode') || feature.get('sttp') || '' + ).toUpperCase(); + + return ( + layerKey.includes('eng_point') || + sttpMap === 'ENG' || + sttpMap === 'ENG2' || + sttpCode === 'ENG' + ); + } + + private isFeatureEngAlarm(feature: Feature): boolean { + const layerKey = String( + feature.get('_layerKey') || feature.get('type') || '' + ).toLowerCase(); + const legendState = String(feature.get('anchoPointState') || '') + .trim() + .toLowerCase(); + + return ( + layerKey.includes('eng_alarm_point') || + layerKey.includes('alarm_range') || + legendState.startsWith('alarm_range_') || + legendState.startsWith('large_eng_built_alarm_range_') || + legendState.startsWith('mid_eng_built_alarm_range_') + ); + } + + private getFeatureEngRenderPriority(feature: Feature): number { + if (this.isFeatureEngAlarm(feature)) { + return 300; + } + return this.isFeatureEng(feature) ? 200 : 100; + } + + /** + * 如果点位在当前视图中没有近邻点,则允许跳过静态密度门槛直接参与显示。 + * 这样像“戈兰滩”这类 distance 档位偏密、但当前周围实际很空的点也能出现。 + */ + private shouldBypassDensityGateForIsolatedFeature(feature: Feature): boolean { + if (!this.map) { + return false; + } + + const layerKey = String(feature.get('_layerKey') || ''); + const geometry = feature.getGeometry(); + if (!geometry || geometry.getType() !== 'Point') { + return false; + } + + const featurePixel = this.map.getPixelFromCoordinate( + (geometry as Point).getCoordinates() + ); + if (!featurePixel) { + return false; + } + + const nearbyPixelThreshold = 56; + const viewportFeatures = this.pointLayerManager.getFeaturesInViewport(); + + return !viewportFeatures.some(otherFeature => { + if (otherFeature === feature) { + return false; + } + if (otherFeature.get('_legendVisible') === false) { + return false; + } + if (otherFeature.get('_regionVisible') === false) { + return false; + } + if (String(otherFeature.get('_layerKey') || '') !== layerKey) { + return false; + } + + const otherGeometry = otherFeature.getGeometry(); + if (!otherGeometry || otherGeometry.getType() !== 'Point') { + return false; + } + + const otherPixel = this.map?.getPixelFromCoordinate( + (otherGeometry as Point).getCoordinates() + ); + if (!otherPixel) { + return false; + } + + return ( + Math.hypot( + otherPixel[0] - featurePixel[0], + otherPixel[1] - featurePixel[1] + ) <= nearbyPixelThreshold + ); + }); + } + + private shouldRenderFeatureByDensity( + feature: Feature, + currentZoom: number + ): boolean { + const minZoom = this.getFeatureDensityMinZoom(feature); + const bypassDensityGate = + currentZoom < minZoom && + this.shouldBypassDensityGateForIsolatedFeature(feature); + return currentZoom >= minZoom || bypassDensityGate; + } + + /** + * 近邻点统一参与原位堆叠,具体谁显示在顶层交给碰撞排序和图层优先级控制。 + */ + private shouldRenderNearbyFeature(): boolean { + return true; + } + /** + * 初始化加载基础图层 + * @param layer 图层配置对象 + */ + addBaseDataLayer(layer: any, isShow: boolean, isCache = false): void { + if (!this.map) return; + + // 备注:同 key 的底图重复添加前先移除旧实例,避免注册表覆盖后旧图层仍残留在地图上。 + const existingLayer = layer?.key + ? this.layerRegistry.get(layer.key as string) + : null; + if (existingLayer) { + this.map.removeLayer(existingLayer); + this.layerRegistry.delete(layer.key); + } + + if (layer.type === 'wmts') { + if (!layer.url) return; + const url = !isCache ? layer.url : layer.url_3d; + const urlParams = new URLSearchParams(url.split('?')[1]); + if (layer.key === this.REGISTRY_KEY) { + this.baseLayerConfig = layer; + } + const layerName: string = urlParams.get('LAYER') || ''; + const matrixSetName: any = urlParams.get('TILEMATRIXSET'); + + const projection = getProjection('EPSG:3857'); + if (!projection) { + console.error('无法获取 EPSG:3857 投影'); + return; + } + const projectionExtent = projection.getExtent(); + + const size = getWidth(projectionExtent) / 256; + const maxZoom = 13; + + const resolutions = new Array(maxZoom + 1); + const matrixIds = new Array(maxZoom + 1); + + for (let z = 0; z <= maxZoom; ++z) { + resolutions[z] = size / Math.pow(2, z); + matrixIds[z] = `${matrixSetName}:${z}`; + } + + const wmtsLayer = new TileLayer({ + source: new WMTS({ + url: layer.url.split('?')[0], + layer: layerName, + matrixSet: matrixSetName, + format: 'image/png', + projection: projection, + tileGrid: new WMTSTileGrid({ + origin: getTopLeft(projectionExtent), + resolutions: resolutions, + matrixIds: matrixIds + }), + style: 'default', + wrapX: true, + crossOrigin: 'anonymous' + }) + }); + + if (layer.key === this.REGISTRY_KEY) { + !isCache ? wmtsLayer.setZIndex(-100) : wmtsLayer.setZIndex(-99); + } else { + wmtsLayer.setZIndex(-100); + } + wmtsLayer.type = 'layer'; + wmtsLayer.setVisible(isShow); + this.layerRegistry.set(layer.key, wmtsLayer); + this.map.addLayer(wmtsLayer); + layer._layer = wmtsLayer; + } else if (layer.type == 'raster-dem') { + const tileLayer = new TileLayer({ + source: new XYZ({ + url: layer.url, + wrapX: true, + crossOrigin: 'anonymous' + }) + }); + tileLayer.setZIndex(-100); + tileLayer.setVisible(isShow); + tileLayer.type = 'layer'; + this.layerRegistry.set(layer.key, tileLayer); + this.map.addLayer(tileLayer); + } else if (layer.type === 'vector') { + if (layer.key === 'hydropBase') { + this.hydropBaseConfig = layer; + } + } + } + /** + * 根据 key 设置底图图层显隐 + * @param layerKey 图层 key + * @param visible 是否显示 + */ + private setBaseLayerVisible(layerKey: string, visible: boolean): void { + const layer = this.layerRegistry.get(layerKey); + if (layer) { + layer.setVisible(visible); + } + } + /** + * 同步当前激活底图源的显隐,保证树勾选和下方图源切换使用同一套可见性规则 + * @param checked 是否显示当前激活底图 + */ + private syncActiveBaseLayerVisibility(checked: boolean): void { + this.setBaseLayerVisible(this.REGISTRY_KEY, checked); + + this.rasterBaseLayerKeys.forEach(key => { + const shouldShow = + checked && + this.activeBaseLayerKey !== 's_province_boundaries' && + key === this.activeBaseLayerKey; + this.setBaseLayerVisible(key, shouldShow); + }); + } + /** + * 获取当前应应用基地裁切的底图图层集合 + * @returns 当前可见底图图层列表 + */ + private getCurrentMaskTargetLayers(): TileLayer[] { + const layers: TileLayer[] = []; + const baseLayer = this.layerRegistry.get(this.REGISTRY_KEY); + + if (baseLayer instanceof TileLayer) { + layers.push(baseLayer); + } + + if (this.activeBaseLayerKey !== 's_province_boundaries') { + const activeRasterLayer = this.layerRegistry.get(this.activeBaseLayerKey); + if ( + activeRasterLayer instanceof TileLayer && + activeRasterLayer !== baseLayer + ) { + layers.push(activeRasterLayer); + } + } + + return layers; + } + /** + * 重新把当前基地裁切绑定到最新底图实例,保证切换图源后边界裁切持续生效 + */ + private reapplyCurrentBaseMask(): void { + if (!this.currentClipGeoJson) { + return; + } + + const targetLayers = this.getCurrentMaskTargetLayers(); + if (targetLayers.length === 0) { + return; + } + + this.regionMaskManager.applyMapMaskToLayers( + targetLayers, + this.currentClipGeoJson + ); + } + enableNortheastMask(): void { + const baseLayer = this.layerRegistry.get(this.REGISTRY_KEY); + + if (!this.geoJsonData1) { + console.warn('东北边界数据尚未加载'); + return; + } + + if (baseLayer && baseLayer instanceof TileLayer) { + this.regionMaskManager.applyMapMask(baseLayer, this.geoJsonData1); + } else { + console.warn('未找到全量底图图层或图层类型错误'); + } + } + /** + * 控制特定区域图层的显示(互斥显示) + * @param regionId 区域ID (例如 "hebei", "13", "01" 等,需与图层 Key 或属性对应) + * @param isAll 是否显示所有 (true: 显示所有图层; false: 仅显示匹配 regionId 的图层,隐藏其他) + */ + async jdPanelControlShowAndHidden( + _regionId: string, + isAll: boolean + ): Promise { + if (!this.map || !this.hydropBaseConfig) { + console.warn('地图未初始化或 hydropBaseConfig 未配置'); + return; + } + + if (this.clipRequestController) { + this.clipRequestController.abort(); + this.clipRequestController = null; + } + + this.BASEID = _regionId; + + if (!isAll) { + this.currentClipGeoJson = null; + this.regionMaskManager.clearMapMask(); + this.regionMaskManager.showAllPoints(); + return; + } + + const baseLayers = this.getCurrentMaskTargetLayers(); + if (baseLayers.length === 0) { + console.warn('未找到底图图层,无法应用遮罩'); + return; + } + + this.regionMaskManager.hideAllPoints(); + this.clipRequestController = new AbortController(); + const signal = this.clipRequestController.signal; + + try { + const url = + this.hydropBaseConfig.geojson_url + + `&cql_filter=BASEID='${this.BASEID}'`; + + const geoJsonData = await this.loadGeoJsonData(url, signal); + + if (signal.aborted) { + return; + } + + if (this.BASEID !== _regionId) { + return; + } + + this.currentClipGeoJson = geoJsonData; + this.regionMaskManager.filterPointsByRegion(geoJsonData); + this.regionMaskManager.fitViewToGeoJson(geoJsonData); + this.regionMaskManager.applyMapMaskToLayers(baseLayers, geoJsonData); + } catch (error: any) { + if (error.name === 'AbortError') { + return; + } + this.currentClipGeoJson = null; + console.error('加载裁切数据失败:', error); + this.regionMaskManager.clearMapMask(); + this.regionMaskManager.showAllPoints(); + } finally { + if (this.clipRequestController?.signal === signal) { + this.clipRequestController = null; + } + } + } + /** + * 基础图层显示影隐藏方法 + * @param layerType 图层类型 (备用,优先使用 key) + * @param key 图层唯一标识 Key + * @param checked true 为显示,false 为隐藏 + */ + controlBaseLayerTreeShowAndHidden( + layerType: string, + key: string, + checked: boolean + ): void { + if (!this.map) return; + const registryKey = key || layerType; + + if (!registryKey) { + console.warn( + 'controlBaseLayerTreeShowAndHidden: 缺少有效的 Key 或 LayerType' + ); + return; + } + if (registryKey === this.REGISTRY_KEY) { + this.syncActiveBaseLayerVisibility(checked); + return; + } + const layerInstance = this.layerRegistry.get(registryKey as string); + if (layerInstance) { + layerInstance.setVisible(checked); + // 图层显隐变化时刷新 batch popup + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(true); + } + } else { + console.warn( + `未找到标识为 [${registryKey}] 的图层实例,当前注册表 keys:`, + Array.from(this.layerRegistry.keys()) + ); + } + } + mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void { + this.pointLayerManager.setLayerVisible(layerType, checked); + this.requestRefreshPointLabelVisibility(true); + // 图层显隐变化时刷新 batch popup + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(true); + } + } + + hasLayer(layerType: string): boolean { + return this.pointLayerManager.hasLayer(layerType as string); + } + + hasBaseLayer(layerKey: string): boolean { + return this.layerRegistry.has(layerKey); + } + + /** + * 缩放地图 + * @param type 'out' 缩小, 'in' 放大 + */ + zoomToggle(type: 'out' | 'in'): void { + if (!this.map || !this.view) return; + + const currentZoom = this.view.getZoom(); + if (currentZoom === undefined) return; + + // 定义缩放步长,对应 Leaflet 的 zoomDelta + const zoomDelta = 1; + + let targetZoom = currentZoom; + + if (type === 'in') { + targetZoom = currentZoom + zoomDelta; + // 限制最大缩放级别 + if (targetZoom > MAX_ZOOM) { + targetZoom = MAX_ZOOM; + } + } else { + targetZoom = currentZoom - zoomDelta; + // 限制最小缩放级别 + if (targetZoom < MIN_ZOOM) { + targetZoom = MIN_ZOOM; + } + } + + // 使用 animate 实现平滑缩放动画 + this.view.animate({ + zoom: targetZoom, + duration: 250, // 动画持续时间 (ms),与滚轮缩放保持一致 + easing: t => t // 线性缓动,也可以引入 ol/easing 使用更复杂的曲线 + }); + } + + /** + * 切换底图 + * @param key 业务标识 Key (如 's_province_boundaries', 'BASEMAP-white', 'BASEMAP-img') + */ + baseLayerSwitcher(key: string, checked: boolean): void { + if (!this.map || !this.view) return; + this.activeBaseLayerKey = key; + const oldLayer = this.layerRegistry.get(this.REGISTRY_KEY); + if (oldLayer) { + this.map.removeLayer(oldLayer); + this.layerRegistry.delete(this.REGISTRY_KEY); + } + + if (key == 's_province_boundaries') { + this.addBaseDataLayer(this.baseLayerConfig, checked); + this.hideBaseMapLayers(this.rasterBaseLayerKeys); + } else { + this.addBaseDataLayer(this.baseLayerConfig, checked, true); + this.rasterBaseLayerKeys.forEach(layerKey => { + if (layerKey === key) { + this.addBaseDataLayer(servers.BaseLayer[layerKey], checked); + } else { + this.setBaseLayerVisible(layerKey, false); + } + }); + } + + this.reapplyCurrentBaseMask(); + } + /** + * 隐藏指定的底图图层 + * @param layerKeys 要隐藏的图层 key 数组 + */ + hideBaseMapLayers(layerKeys: string[]): void { + layerKeys.forEach(key => { + const layer = this.layerRegistry.get(key); + if (layer) { + layer.setVisible(false); + } + }); + } + + /** + * 显示指定的底图图层 + * @param layerKeys 要显示的图层 key 数组 + */ + showBaseMapLayers(layerKeys: string[]): void { + layerKeys.forEach(key => { + const layer = this.layerRegistry.get(key); + if (layer) { + layer.setVisible(true); + } + }); + } + + /** + * 添加梯级流域图 (Vector Layer) - 使用本地 GeoJSON 数据 + * @param layer 图层配置对象 + * @param fillcolor 填充颜色 + * @param outlineColor 边框颜色 + * @param datas 需要显示的 RVCD 列表 (例如: ['SJLY25', ...]),如果为空则显示所有或根据业务逻辑处理 + */ + addTertiarybasinLayer( + layer: any, + fillcolor: any, + outlineColor: any, + datas: any + ): void { + if (!this.map || !this.view) return; + + // 1. 检查是否已存在该图层,已存在时直接切换为显示并刷新样式 + const existingLayer = this.layerRegistry.get(layer.key); + + // 2. 创建样式函数 + const visibleStyle = new Style({ + fill: new Fill({ color: fillcolor }), + stroke: new Stroke({ color: outlineColor, width: 1 }) + }); + + const hiddenStyle = new Style({ + fill: new Fill({ color: 'rgba(0,0,0,0)' }), + stroke: new Stroke({ color: 'rgba(0,0,0,0)' }) + }); + + if (existingLayer) { + const allowedIds = Array.isArray(datas) ? datas : []; + const existingFeatures = + existingLayer.getSource?.()?.getFeatures?.() ?? []; + + existingFeatures.forEach(feature => { + const rvcd = feature.get('RVCD'); + const isVisible = + allowedIds.length > 0 ? rvcd && allowedIds.includes(rvcd) : true; + + feature.setStyle(isVisible ? visibleStyle : hiddenStyle); + }); + + existingLayer.setVisible(layer.visible !== false); + return; + } + + // 3. 创建矢量源 (VectorSource),并通过 layer.geojson_url 加载数据 + const vectorSource = new VectorSource(); + + if (layer?.geojson_url) { + this.loadGeoJsonData(VITE_APP_MAP_URL + layer.geojson_url).then( + geoJsonData => { + if (!geoJsonData) return; + + const features = new GeoJSON().readFeatures(geoJsonData, { + featureProjection: 'EPSG:3857' // 确保转换到地图使用的投影 + }); + + vectorSource.addFeatures(features); + + // 4. 数据过滤逻辑 + const allowedIds = Array.isArray(datas) ? datas : []; + + features.forEach(feature => { + // 获取属性中的 RVCD + const rvcd = feature.get('RVCD'); + + let isVisible = false; + + // 逻辑:如果 datas 为空,通常意味着显示所有(或者都不显示,视具体需求而定) + // 这里假设:datas 有值时严格过滤;datas 为空时显示所有 + if (allowedIds.length > 0) { + isVisible = rvcd && allowedIds.includes(rvcd); + } else { + isVisible = true; + } + + // 应用样式 + feature.setStyle(isVisible ? visibleStyle : hiddenStyle); + }); + } + ); + } + + // 5. 创建矢量图层 (VectorLayer) + const vectorLayer = new VectorLayer({ + source: vectorSource, + style: null, // 样式已应用在 Feature 上,这里设为 null 或保留默认 + zIndex: 100, + visible: layer.visible !== false + }); + + // 6. 注册并添加到地图 + this.layerRegistry.set(layer.key, vectorLayer); + this.map.addLayer(vectorLayer); + } + /** + * 隐藏梯级流域图 + * @param layer 图层配置对象 (需包含 key 属性) + */ + hideTertiarybasinLayer(layer: any): void { + if (!this.map || !layer || !layer.key) { + console.warn('hideTertiarybasinLayer: 无效的图层或地图未初始化'); + return; + } + // 1. 从注册表中获取图层实例 + const layerInstance = this.layerRegistry.get(layer.key); + + if (layerInstance) { + layerInstance.setVisible(false); + } else { + console.warn(`未找到标识为 [${layer.key}] 的梯级流域图层实例`); + } + } + /** + * 删除描点图层 + * @param layerKey 图层 key + */ + removePointLayer(layerKey: string): void { + this.pointLayerManager.removeLayer(layerKey); + } + /** + * 地图打印/导出 + * 将当前地图视图导出为 PNG 图片,背景强制为白色 + */ + mapOutPut(): void { + if (!this.map) { + console.warn('地图未初始化,无法打印'); + return; + } + const mapElement = this.map.getTargetElement(); + const canvas = mapElement.querySelector('canvas'); + + if (!canvas) { + console.error('未找到地图 Canvas 元素,无法导出'); + return; + } + + try { + const width = canvas.width; + const height = canvas.height; + + const offscreenCanvas = document.createElement('canvas'); + offscreenCanvas.width = width; + offscreenCanvas.height = height; + const ctx = offscreenCanvas.getContext('2d'); + + if (!ctx) { + throw new Error('无法获取 Canvas 上下文'); + } + + ctx.fillStyle = '#FFFFFF'; + ctx.fillRect(0, 0, width, height); + + ctx.drawImage(canvas, 0, 0); + + const dataURL = offscreenCanvas.toDataURL('image/png'); + + const link = document.createElement('a'); + link.download = `map_export_${new Date().getTime()}.png`; + link.href = dataURL; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } catch (e) { + console.error('地图导出失败', e); + alert('地图导出失败,请检查控制台错误信息。'); + } + } + + /** + * 切换双击缩放交互的状态 + */ + private toggleDoubleClickZoom(active: boolean): void { + if (!this.map) return; + this.map.getInteractions().forEach(interaction => { + if (interaction instanceof DoubleClickZoom) { + interaction.setActive(active); + } + }); + } + + /** + * 创建并返回测量 Tooltip Overlay + */ + private createMeasureTooltipOverlay(): Overlay { + const element = document.createElement('div'); + element.className = 'measure-tooltip tooltip-measure'; + Object.assign(element.style, { + background: 'rgba(0, 0, 0, 0.7)', + color: 'white', + padding: '4px 8px', + borderRadius: '4px', + fontSize: '12px', + whiteSpace: 'nowrap' + }); + + return new Overlay({ + element, + offset: [0, -15], + positioning: 'bottom-center' + }); + } + /** + * 通用测量启动方法 + * @param geomType 'LineString' | 'Polygon' + * @param drawStyle 绘制中的样式函数 + * @param finishedStyle 完成后的样式 + * @param onResult 计算结果的回调 (feature, resultText) + */ + private startMeasurement( + geomType: 'LineString' | 'Polygon', + drawStyle: any, + finishedStyle: Style, + onResult: (feature: Feature, text: string) => void + ): void { + if (!this.map || !this.view) return; + + // 1. 初始化图层 + if (!this.measureLayer) { + this.measureSource = new VectorSource(); + this.measureLayer = new VectorLayer({ + source: this.measureSource, + zIndex: 1000 + }); + this.map.addLayer(this.measureLayer); + } + + // 2. 清理旧交互 + if (this.drawInteraction) { + this.map.removeInteraction(this.drawInteraction); + } + + // 禁用双击缩放 + this.toggleDoubleClickZoom(false); + + // 3. 创建绘制交互 + this.drawInteraction = new Draw({ + source: this.measureSource!, + type: geomType, + style: drawStyle + }); + + this.map.addInteraction(this.drawInteraction); + + let changeListenerKey: any; + let currentTooltip: Overlay | null = null; + + // 4. 监听绘制开始 + this.drawInteraction.on('drawstart', (evt: any) => { + const feature = evt.feature; + const geom = feature.getGeometry(); + + // 创建动态 Tooltip + currentTooltip = this.createMeasureTooltipOverlay(); + this.map?.addOverlay(currentTooltip); + + // 监听几何变化更新 Tooltip + changeListenerKey = geom!.on('change', () => { + if (currentTooltip && currentTooltip.getElement() && geom) { + // 根据类型计算临时值 + let tempText = ''; + if (geomType === 'LineString') { + tempText = this.formatLength(geom as LineString); + } else { + tempText = this.formatArea( + geom as import('ol/geom/Polygon').default + ); + } + + currentTooltip.getElement()!.innerHTML = tempText; + + // 对于多边形,Tooltip 跟随鼠标最后一个点;对于线,也是最后一个点 + const lastCoord = (geom as any).getLastCoordinate(); + if (lastCoord) currentTooltip.setPosition(lastCoord); + } + }); + }); + + // 5. 监听绘制结束 + this.drawInteraction.on('drawend', (evt: any) => { + const feature = evt.feature; + const geom = feature.getGeometry(); + + // ✅ 修复:检查几何体是否有效 + // 对于 Polygon,如果坐标点数不足(例如只点了两下),geom 可能是无效的或面积为0 + if (!geom || geom.getCoordinates().length === 0) { + console.warn('无效的几何体,已忽略'); + this.measureSource?.removeFeature(feature); + if (currentTooltip) this.map?.removeOverlay(currentTooltip); + if (changeListenerKey) unByKey(changeListenerKey); + return; + } + + // 清理监听和临时 Tooltip + if (changeListenerKey) unByKey(changeListenerKey); + if (currentTooltip) this.map?.removeOverlay(currentTooltip); + + // ✅ 修复:强制设置样式,确保即使默认样式有问题也能显示 + feature.setStyle(finishedStyle); + + // 计算最终结果并回调 + let resultText = ''; + let isValidResult = true; + + if (geomType === 'LineString') { + resultText = this.formatLength(geom as LineString); + } else { + // 对于多边形,再次检查面积是否过小或无效 + const polyGeom = geom as import('ol/geom/Polygon').default; + const area = getSphericalArea(polyGeom); + if (area < 0.0001) { + // 极小面积视为无效绘制 + isValidResult = false; + console.warn('面积过小,已忽略'); + this.measureSource?.removeFeature(feature); + } else { + resultText = this.formatArea(polyGeom); + } + } + + // 只有结果有效才添加标签 + if (isValidResult) { + onResult(feature, resultText); + } + + // 清理交互 + this.map?.removeInteraction(this.drawInteraction); + this.drawInteraction = null; + + // 恢复双击缩放 + setTimeout(() => { + this.toggleDoubleClickZoom(true); + }, 0); + }); + } + /** + * 长度量算 + */ + lengthCalculate(): void { + this.startMeasurement( + 'LineString', + (feature: any) => { + // 绘制中只显示线,隐藏点 + return feature.getGeometry()?.getType() === 'LineString' + ? new Style({ + stroke: new Stroke({ + color: '#ffcc33', + lineDash: [10, 10], + width: 2 + }) + }) + : []; + }, + new Style({ + stroke: new Stroke({ color: '#9AD8E7', width: 3 }) // 加粗一点 + }), + (feature, text) => { + this.addFixedLabel(feature, text); + } + ); + } + + /** + * 面积量算 + */ + areCalculate(): void { + this.startMeasurement( + 'Polygon', + (feature: any) => { + // 绘制中显示线和填充 + return feature.getGeometry()?.getType() === 'Polygon' + ? new Style({ + stroke: new Stroke({ + color: '#ffcc33', + lineDash: [10, 10], + width: 2 + }), + fill: new Fill({ color: 'rgba(255, 204, 51, 0.3)' }) // 提高透明度以便看清 + }) + : []; + }, + new Style({ + stroke: new Stroke({ color: '#9AD8E7', width: 3 }), // 加粗边框 + fill: new Fill({ color: 'rgba(154, 216, 231, 0.4)' }) // 提高填充可见度 + }), + (feature, text) => { + this.addFixedLabel(feature, text); + } + ); + } + /** + * 移除量算结果 + */ + removeQueryLayer(): void { + // 1. 清除矢量数据 (线条) + if (this.measureSource) { + this.measureSource.clear(); + } + + // 2. 清除所有相关 Overlay (Label) + if (this.map) { + // ✅ 修复:先获取所有 Overlay 的副本,避免在遍历过程中修改原数组导致漏删 + const overlaysToRemove: Overlay[] = []; + + this.map.getOverlays().forEach(overlay => { + const el = overlay.getElement(); + // 通过类名判断是否为我们创建的测量标签 + if ( + el && + (el.classList.contains('measure-tooltip') || + el.classList.contains('measure-label-container')) + ) { + overlaysToRemove.push(overlay); + } + }); + + // 统一移除 + overlaysToRemove.forEach(overlay => { + this.map?.removeOverlay(overlay); + }); + + // 确保恢复双击缩放 + this.toggleDoubleClickZoom(true); + } + + // 3. 清除交互 + if (this.drawInteraction) { + this.map?.removeInteraction(this.drawInteraction); + this.drawInteraction = null; + } + } + + /** + * 添加固定的 Label (带删除按钮) + */ + private addFixedLabel(feature: Feature, lengthText: string): void { + if (!this.map) return; + + const container = document.createElement('div'); + container.className = 'measure-label-container'; + + // 使用 Object.assign 批量设置样式,代码更整洁 + Object.assign(container.style, { + position: 'absolute', + border: '1px solid #000', + padding: '4px 8px', + borderRadius: '4px', + fontSize: '12px', + color: '#000', + cursor: 'default', + whiteSpace: 'nowrap', + display: 'flex', + alignItems: 'center', + zIndex: '1001', + pointerEvents: 'auto' // 确保可以点击 + }); + + const textSpan = document.createElement('span'); + textSpan.innerText = lengthText; + + const closeBtn = document.createElement('span'); + closeBtn.innerHTML = '×'; + Object.assign(closeBtn.style, { + fontWeight: 'bold', + marginLeft: '5px', + cursor: 'pointer', + fontSize: '14px', + lineHeight: '1' + }); + + const geom: any = feature.getGeometry(); + let center: any; + + // ✅ 修复:根据几何类型选择标签位置 + if (geom?.getType() === 'Polygon') { + // 多边形使用内部点,确保标签在面内 + center = (geom as import('ol/geom/Polygon').default) + .getInteriorPoint() + .getCoordinates(); + } else { + // 线使用中点 + center = (geom as LineString).getCoordinateAt(0.5); + } + + const overlay = new Overlay({ + element: container, + positioning: 'top-center', + offset: [0, -10], + position: center + }); + + closeBtn.onclick = e => { + e.stopPropagation(); + this.measureSource?.removeFeature(feature); + this.map?.removeOverlay(overlay); + }; + + container.appendChild(textSpan); + container.appendChild(closeBtn); + this.map.addOverlay(overlay); + } + /** + * 格式化长度输出 (米) + */ + private formatLength(line: LineString): string { + return '长度:' + getSphericalLength(line).toFixed(3) + 'm'; + } + /** + * 格式化面积输出 (km²) + */ + private formatArea(polygon: import('ol/geom/Polygon').default): string { + // 获取球面面积 (平方米) + const areaSqMeters = getSphericalArea(polygon); + // 转换为平方公里 + const areaSqKm = areaSqMeters / 1000000; + return '面积:' + areaSqKm.toFixed(3) + 'km²'; + } + /** + * 图例和基地面板控制描点数据显示隐藏方法 + * @param layerType 图层类型 + * @param key 图层标识符(锚点状态 nameEn) + * @param baseid 基地ID + * @param checked 是否选中(显示/隐藏) + * @param isAll 是否全部操作 + */ + mdLayerShowOrHidden( + layerType: string, + key?: string, + baseid: string, + checked?: boolean, + isAll?: boolean + ): void { + void baseid; + void isAll; + this.pointLayerManager.setLegendVisibleByField( + layerType, + key || '', + !!checked + ); + // 图例变化时刷新 batch popup + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(true); + } + } + + /** + * 根据 anchoPointState 控制单个图例的锚点显示隐藏 + * @param layerKey 图层 key + * @param anchoPointState 锚点状态(对应图例的 nameEn) + * @param checked 是否显示 + */ + setLegendPointVisible( + layerKey: string, + anchoPointState: string, + checked: boolean + ): void { + this.pointLayerManager.setLegendVisibleByField( + layerKey, + anchoPointState, + checked + ); + this.requestRefreshPointLabelVisibility(true); + // 图例变化时刷新 batch popup + if (this.isBatchPopupMode) { + this.requestUpdateBatchPopups(true); + } + } + + switchView(_type): void {} + fitBounds(): void {} + /** + * 飞行定位到指定经纬度和缩放级别 + * @param position [经度, 纬度] (EPSG:4326) + * @param zoom 缩放级别 + */ + flyTopanto(position: number[], zoom: number): void { + if (!this.map || !this.view) { + console.warn('地图未初始化,无法执行飞行定位'); + return; + } + + // 1. 将经纬度 [lon, lat] 转换为地图投影坐标 (EPSG:3857) + const targetCenter = fromLonLat(position); + + // 2. 执行动画 + // duration: 动画持续时间,单位毫秒,例如 1000ms (1秒) + this.view.animate( + { + center: targetCenter, + duration: 1000 + }, + { + zoom: zoom, + duration: 1000 + } + ); + } + + getCurrentZoom(): number | undefined { + return this.view?.getZoom(); + } + + /** + * 生成带完整圆边框的上半圆 Canvas + * @param radius 半径(像素) + * @param color 填充颜色 + * @returns HTMLCanvasElement + */ + private createSemiCircleCanvas( + radius: number, + color: string + ): HTMLCanvasElement { + const size = radius * 2 + 2; + const canvas = document.createElement('canvas'); + canvas.width = size; + canvas.height = size; + const ctx = canvas.getContext('2d')!; + ctx.clearRect(0, 0, size, size); + + const centerX = size / 2; + const centerY = size / 2; + + // 1. 绘制下半圆填充(给定颜色)— 圆弧从 π 到 2π + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, 0, Math.PI, false); + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); + + // 2. 绘制上半圆填充(白色) + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, Math.PI, 2 * Math.PI, false); + ctx.closePath(); + ctx.fillStyle = '#FFFFFF'; // 白色 + ctx.fill(); + + // 3. 绘制完整圆边框 + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, 0, Math.PI * 2); + ctx.strokeStyle = 'rgba(0, 0, 0, 0.5)'; + ctx.lineWidth = 1.5; + ctx.stroke(); + + return canvas; + } + + /** + * 移除地图对象,释放资源 + */ + destroy(): void { + if (this.pointLayerStyleRefreshFrameId !== null) { + cancelAnimationFrame(this.pointLayerStyleRefreshFrameId); + this.pointLayerStyleRefreshFrameId = null; + } + if (this.labelVisibilityRefreshFrameId !== null) { + cancelAnimationFrame(this.labelVisibilityRefreshFrameId); + this.labelVisibilityRefreshFrameId = null; + } + if (this.labelVisibilityDebounceTimerId !== null) { + window.clearTimeout(this.labelVisibilityDebounceTimerId); + this.labelVisibilityDebounceTimerId = null; + } + this.clearBatchPopupPostRenderSync(); + this.removeQueryLayer(); + this.regionMaskManager.destroy(); + + const clearLayer = (layer: any) => { + if (layer && layer.getSource) { + const source = layer.getSource(); + if (source && source.clear) { + source.clear(); + } + } + if (this.map && this.map.getLayers().getArray().includes(layer)) { + this.map.removeLayer(layer); + } + if (layer.setMap) layer.setMap(null); + }; + + if (this.layerRegistry) { + this.layerRegistry.forEach(clearLayer); + this.layerRegistry.clear(); + } + + this.popupManager.destroy(); + this.pointLayerManager.destroy(); + + if (this.map) { + this.map.getInteractions().clear(); + this.map.getOverlays().clear(); + this.map.setTarget(undefined); + this.map.dispose(); + this.map = null; + } + this.popupManager.setMap(null); + this.pointLayerManager.setMap(null); + this.regionMaskManager.setContext(null, null); + + if (this.view) { + this.view.dispose(); + this.view = null; + } + + this.baseLayerConfig = null; + this.measureSource = null; + this.measureLayer = null; + this.drawInteraction = null; + this.geoJsonData = null; + this.geoJsonData1 = null; + } + + // 倾斜摄影方法仅3D支持,2D为空实现 + addQxsyLayer(_item: any): void {} + removeQxsyLayer(_item: any): void {} + qxsyChangeClick(_item: any, _checked: boolean): void {} + qxsyToPosition(_item: any): void {} +} diff --git a/frontend-sjgl/src/components/gis/mapurlManage.ts b/frontend-sjgl/src/components/gis/mapurlManage.ts new file mode 100644 index 00000000..88161502 --- /dev/null +++ b/frontend-sjgl/src/components/gis/mapurlManage.ts @@ -0,0 +1,759 @@ +/** + * @author: yjw + * @date: 2022-11-17 + * @description: 后期建议本文件内容做到系统配置中 + */ + +// import { MemoryCache } from '@zebras/qgc-share/cache/MemoryCache' +// import { Session } from '@zebras/qgc-share/service/Session' + +export interface MapBaseUrlItem { + code: string; + name: string; + url: string; +} + +export interface ServerConfigItem { + id?: string; + key?: string; + urlType: 'gisurl' | 'online'; + url?: string; + url_3d?: string; + layers?: string; + rasteropacity?: number; + _layer?: string; + imgUrl?: string; + visible?: boolean; + visibility?: boolean; //?是否可以删除 + minZoom?: number; + maxZoom?: number; + fillOpacity?: number; + lineWidth?: number; + [name: string]: any; +} + +const tdtToken = 'e90d56e5a09d1767899ad45846b0cefd'; //企业版密钥,勿换e650f138c4481cca888cd13094bb9026 +const mapType = 'w'; //c:天地图经纬度底图;w:天地图墨卡托底图 +const URL_TerTDT = `https://t0.tianditu.gov.cn/ter_${mapType}/wmts?tk=${tdtToken}`; //terMap +// const URL_TerLabelTDT = `http://t0.tianditu.gov.cn/cta_${mapType}/wmts?tk=${tdtToken}` //terLabel +// const URL_VecTDT = `http://t0.tianditu.com/vec_${mapType}/wmts?tk=${tdtToken}` //vecMap +// const URL_VecLableTDT = `http://t0.tianditu.com/cva_${mapType}/wmts?tk=${tdtToken}` //vecLabel +// const URL_ImgTDT = `http://t0.tianditu.com/img_${mapType}/wmts?tk=${tdtToken}` //imgMap +// const URL_ImgLableTDT = `http://t0.tianditu.com/cia_${mapType}/wmts?tk=${tdtToken}` + +// const znyMapUrl = "http://10.219.26.6:8050/" //中南院的测试地图环境 +// const djjtMapUrl = "http://210.72.227.199:18084/" //中南院的测试地图环境 +//TODO:以后改成在系统管理里面配置地图可视化范围 +export const location_map_maxlon = 126.8267; +export const location_map_maxlat = 38.5769; +export const location_map_minlon = 73.7443; +export const location_map_minlat = 16.32; +// todo: 以后从接口获取数据 +export const servers: Record | Record = { + // 省(自治区)界 + province_boundaries: { + id: 'province_boundaries', + key: 'province_boundaries', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:provinceline&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provinceline&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:provinceline', + rasteropacity: 1, + minZoom: 0, + maxZoom: 21, + type: 'wms', + layerType: 'line', + lineWidth: 2, + visible: true + }, + //国界 + chinaBoundary: { + id: 'chinaBoundary', + key: 'chinaBoundary', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Achina@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:china&maxFeatures=50&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:china', + _layer: 'china', + layerType: 'line', + minZoom: 0, + maxZoom: 16, + minHeight: 0, + maxHeight: 80000000, + rasteropacity: 1, + type: 'vector_Boundary', + paint: { + 'line-color': '#AAA4C5', + 'line-width': 3, + 'line-opacity': 0.9 + } + }, + //九段线 + nineSegmentLine: { + id: 'nineSegmentLine', + key: 'nineSegmentLine', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Azh_island1@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:zh_island1&maxFeatures=50&outputFormat=application%2Fjson&token= + `, + layers: 'qgc:zh_island1', + _layer: 'zh_island1', + layerType: 'line', + minZoom: 0, + maxZoom: 16, + minHeight: 0, + maxHeight: 80000000, + rasteropacity: 1, + type: 'vector_Boundary', + paint: { + 'line-color': '#AAA4C5', + 'line-width': 3, + 'line-opacity': 0.9 + } + }, + // 基础图层 + BaseLayer: { + 'BASEMAP-img': { + key: 'BASEMAP-img', + type: 'raster-dem', + urlType: 'online', + url: + 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}' + + `&token=`, + url_3d: + 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}' + + `&token=`, + _layer: 'img', + visible: false, + maxzoom: 20 + }, + 'BASEMAP-white': { + key: 'BASEMAP-white', + urlType: 'online', + type: 'raster-dem', + url: `${URL_TerTDT}&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=${mapType}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=tiles&token= + `, + url_3d: URL_TerTDT + `&token=`, + _layer: 'ter', + visible: false, + maxzoom: 14 + } + }, + // 区|县 + county: { + id: 'county', + key: 'county', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Acounty@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:county&outputFormat=application%2Fjson&token=`, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:county', + _layer: 'county', + rasteropacity: 0.5, + imgUrl: '/zfile/qgc/icons/map-xzXian.png', + minZoom: 8, + maxZoom: 16, + minHeight: 0, + maxHeight: 800000, + type: 'vector', + layerType: 'symbol', + visible: true + }, + //县注记 + county_lable: { + id: 'county_lable', + key: 'county_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:countyAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:countyAno&outputFormat=application%2Fjso&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:countyAno', + _layer: 'countyAno', + rasteropacity: 1, + minZoom: 8, + maxZoom: 16, + minHeight: 0, + maxHeight: 800000, + type: 'wms', + layerType: 'symbol', + visible: true + }, + + // 市 + city: { + id: 'city', + key: 'city', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Acity@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:city&outputFormat=application%2Fjson&token=`, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:city', + _layer: 'city', + rasteropacity: 0.5, + imgUrl: '/zfile/qgc/icons/map-xzShi.png', + minZoom: 5, + maxZoom: 8, + minHeight: 800000, + maxHeight: 1200000, + type: 'vector', + layerType: 'symbol', + visible: false + }, + //市注记 + city_lable: { + id: 'city_lable', + key: 'city_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:cityAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:cityAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:cityAno', + _layer: 'cityAno', + rasteropacity: 1, + minZoom: 5, + maxZoom: 8, + minHeight: 800000, + maxHeight: 1200000, + type: 'wms', + layerType: 'symbol', + visible: true + }, + // 省 + provincial_capital: { + id: 'provincial_capital', + key: 'provincial_capital', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Aprovincecity@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provincecity&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:provincecity', + _layer: 'provincecity', + rasteropacity: 0.5, + imgUrl: '/zfile/qgc/icons/map-xzSheng.png', + visible: true, + minZoom: 0, + maxZoom: 5, + minHeight: 1200000, + maxHeight: 99999999999, + type: 'vector', + layerType: 'symbol' + }, + //省注记 + province_lable: { + id: 'province_lable', + key: 'province_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:provincecityAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provincecityAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:provincecityAno', + _layer: 'provinceAno', + rasteropacity: 0.5, + minZoom: 0, + maxZoom: 5, + minHeight: 1200000, + maxHeight: 99999999999, + type: 'wms', + layerType: 'symbol', + visible: true + }, + baseImageLayerUrl: { + id: 'BaseLayer', + key: 'BaseLayer', + urlType: 'online', + url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?tk=88735d6d9bbd5930f1b1c8b8df72e762&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}' + }, + WhiteBaseLayerUrl: { + id: 'BaseLayer', + key: 'BaseLayer', + urlType: 'online', + url: `https://t0.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e6372a5333c4bac9b9ef6097453c3cd6&token= + ` + }, + + /** + * 电站基地 + */ + hydropBase: { + id: 'hydropBase', + key: 'hydropBase', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3AstationEra1117@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEra1117&maxFeatures=50&outputFormat=application/json&token= + `, + url_3d: '/geoserver/qgc/wms', + _layer: 'stationEra1117', + layers: 'qgc:stationEra1117', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 20, + type: 'vector', + layerType: 'fill', + paint: { + 'fill-color': '#f0dcda', + 'fill-opacity': 0.8, + 'fill-outline-color': '#dd7065' + } + }, + /** + * 电站基地配置 + */ + powerBaseStationLayerWFSUrl: { + id: 's_hydropBase_wfs', + key: 's_hydropBase_wfs', + urlType: 'gisurl', + url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEra1117&maxFeatures=50&outputFormat=application/json&token= + `, + _layer: 'stationEra1117', + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:stationEra1117', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 20 + }, + + /** + * 电站基地配置 LM项目 + */ + powerBaseStationLayerWFSUrlOfLM: { + id: 's_hydropBase_wfs', + key: 's_hydropBase_wfs', + urlType: 'gisurl', + url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEraLM&maxFeatures=50&outputFormat=application/json&token= + `, + _layer: 'stationEraLM', + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:stationEraLM', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 20 + }, + /** + * 河流连通性分析中河流水系配置 + */ + YLJ_LCJ_LayerWFSUrl: { + id: 'river_riverEvaTemp', + key: 'river_riverEvaTemp', + urlType: 'gisurl', + url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:ylj_lcj&maxFeatures=50&outputFormat=application%2Fjson&token= + `, + _layer: 'ylj_lcj', + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:ylj_lcj', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 20 + }, + + /** + * 水质水温渐变线配置 + */ + LCJ_WaterQuality_line: { + id: 'LCJ_WaterQuality_line', + key: 'LCJ_WaterQuality_line', + urlType: 'gisurl', + url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:lcj_waterquality_line&maxFeatures=50&outputFormat=application%2Fjson&token= + `, + _layer: 'lcj_waterquality_line', + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:lcj_waterquality_line', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 20 + }, + + /** + * 全国乡镇名称 + */ + NationalTownships: { + id: 'NationalTownships', + key: 'NationalTownships', + layerType: 'symbol', + isShowLabel: true, + urlType: 'gisurl', + url: `/geoserver/gwc/service/tms/1.0.0/qgc%3ANationalTownships@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf?token=`, + _layer: 'NationalTownships', + layers: 'qgc:NationalTownships', + visible: true, + minZoom: 10.5, + maxZoom: 18, + isOnlyAno: true, + type: 'vector', + layout_text: { + 'text-field': ['get', 'NAME'], + 'text-font': ['Open Sans Bold'], + 'text-size': 16, + 'text-anchor': 'top', + 'text-padding': 0, + 'text-max-width': 100, + 'text-ignore-placement': false, + 'text-allow-overlap': false, + visibility: 'visible' + }, + paint_text: { + 'text-color': '#404040', + 'text-halo-color': '#fff', + 'text-halo-width': 2 + } + }, + + /** + * 一级流域 + */ + heliu1: { + id: 'heliu1', + key: 'heliu1', + urlType: 'gisurl', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river1_line&maxFeatures=50&outputFormat=application/json&token= + `, + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver1_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + _layer: 'river1_line', + layers: 'qgc:river1_line', + rasteropacity: 0.5, + visible: true, + minZoom: 0, + maxZoom: 18, + minHeight: 0, + maxHeight: 99999999999, + type: 'vector', + layerType: 'line', + paint: { + 'line-color': '#00A1E9', + 'line-width': 4, + 'line-opacity': 0.9 + } + }, + //一级河流注记 + heliu1_lable: { + id: 'heliu1_lable', + key: 'heliu1_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river1_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river1_lineAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:river1_lineAno', + _layer: 'river1_lineAno', + rasteropacity: 1, + minZoom: 0, + maxZoom: 18, + minHeight: 0, + maxHeight: 99999999999, + type: 'wms', + layerType: 'symbol', + visible: true + }, + + /** + * 二级流域 + */ + heliu2: { + id: 'heliu2', + key: 'heliu2', + urlType: 'gisurl', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river2_line&maxFeatures=50&outputFormat=application/json&token= + `, + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver2_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + _layer: 'river2_line', + layers: 'qgc:river2_line', + lineWidth: 2, + rasteropacity: 0.5, + visible: false, + minZoom: 4, + maxZoom: 18, + minHeight: 0, + maxHeight: 1200000, + type: 'vector', + layerType: 'line', + paint: { + 'line-color': '#00A1E9', + 'line-width': 3, + 'line-opacity': 0.9 + } + }, + //二级河流注记 + heliu2_lable: { + id: 'heliu2_lable', + key: 'heliu2_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river2_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river2_lineAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:river2_lineAno', + _layer: 'river2_lineAno', + rasteropacity: 1, + minZoom: 4, + maxZoom: 18, + minHeight: 0, + maxHeight: 1200000, + type: 'wms', + layerType: 'symbol', + visible: true + }, + /** + * 三级流域 + */ + heliu3: { + id: 'heliu3', + key: 'heliu3', + urlType: 'gisurl', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river3_line&maxFeatures=50&outputFormat=application/json&token= + `, + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver3_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + _layer: 'river3_line', + layers: 'qgc:river3_line', + lineWidth: 1, + rasteropacity: 0.5, + visible: false, + minZoom: 6, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + type: 'vector', + layerType: 'line', + paint: { + 'line-color': '#00A1E9', + 'line-width': 2, + 'line-opacity': 0.9 + } + }, + //三级河流注记 + heliu3_lable: { + id: 'heliu3_lable', + key: 'heliu3_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river3_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river3_lineAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:river3_lineAno', + _layer: 'river3_lineAno', + rasteropacity: 1, + minZoom: 6, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + type: 'wms', + layerType: 'symbol', + visible: true + }, + /** + * 四级流域 + */ + heliu4: { + id: 'heliu4', + key: 'heliu4', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver4_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river4_line&maxFeatures=8000&outputFormat=application%2Fjson&token= + `, + _layer: 'river4_line', + layers: 'qgc:river4_line', + visible: false, + minZoom: 8, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + rasteropacity: 1, + type: 'vector', + layerType: 'line', + paint: { + 'line-color': '#00A1E9', + 'line-width': 1, + 'line-opacity': 0.9 + } + }, + //四级河流注记 + heliu4_lable: { + id: 'heliu4_lable', + key: 'heliu4_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river4_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river4_lineAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:river4_lineAno', + _layer: 'river4_lineAno', + rasteropacity: 1, + minZoom: 8, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + type: 'wms', + layerType: 'symbol', + + visible: true + }, + /** + * 五级流域 - 水质等级图层 + */ + heliu5: { + id: 'heliu5', + key: 'heliu5', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver5_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river5_line&maxFeatures=8000&outputFormat=application%2Fjson&token= + `, + _layer: 'river5_line', + layers: 'qgc:river5_line', + visible: false, + minZoom: 8, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + rasteropacity: 1, + type: 'vector', + layerType: 'line', + paint: { + 'line-color': '#00A1E9', + 'line-width': 1, + 'line-opacity': 0.9 + } + }, + //五级河流注记 + heliu5_lable: { + id: 'heliu5_lable', + key: 'heliu5_lable', + urlType: 'gisurl', + // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', + url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river5_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river5_lineAno&outputFormat=application%2Fjson&token= + `, + url_3d: '/geoserver/qgc/wms', + layers: 'qgc:river5_lineAno', + _layer: 'river5_lineAno', + rasteropacity: 1, + minZoom: 8, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + type: 'wms', + layerType: 'symbol', + visible: true + }, + //流域梯级图 + Tertiarybasin: { + id: 'Tertiarybasin', + key: 'Tertiarybasin', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Anew_LiuYuThrLev@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:new_LiuYuThrLev&outputFormat=application%2Fjson&token= + `, + _layer: 'new_LiuYuThrLev', + layers: 'qgc:new_LiuYuThrLev', + visible: true, + minZoom: 1, + maxZoom: 18, + minHeight: 0, + maxHeight: 800000, + rasteropacity: 0.8, + type: 'vector', + layerType: 'fill' + }, + // //鱼类栖息地 + // fishQxd: { + // id: 'fishQxd', + // key: 'fishQxd', + // urlType: 'gisurl', + // url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Afish_qxd@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + // url_3d: '/geoserver/qgc/wms', + // geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:fish_qxd&outputFormat=application%2Fjson&token= + // `, + // _layer: 'fish_qxd', + // layers: 'qgc:fish_qxd', + // visible: true, + // minZoom: 0, + // maxZoom: 18, + // minHeight: 0, + // maxHeight: 80000000, + // rasteropacity: 0.9, + // type: 'vector', + // layerType: 'line', + // lineWidth: 2, + // paint: { + // 'line-color': '#A21C83', + // 'line-width': 4, + // 'line-opacity': 1 + // } + // }, + /** + * 水功能分区 + */ + WaterFunctionPartition: { + id: 'WaterFunctionPartition', + key: 'WaterFunctionPartition', + urlType: 'gisurl', + url: '/geoserver/gwc/service/tms/1.0.0/qgc%3AGNQ@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', + url_3d: '/geoserver/qgc/wms', + geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:GNQ&outputFormat=application%2Fjson&token=`, + _layer: 'GNQ', + layers: 'qgc:GNQ', + visible: true, + minZoom: 0, + maxZoom: 18, + minHeight: 0, + maxHeight: 8000000, + rasteropacity: 0.9, + type: 'vector', + layerType: 'line', + lineWidth: 2, + paint: { + 'line-color': '#A21C83', + 'line-width': 3, + 'line-opacity': 0 + } + } +}; + +/** + * 获取Gis图层配置 + * @param key gis服务key + * @returns + */ +// export const getConfig = (key: string) => { +// const mapBaseUrls: Record = MemoryCache.get('mapBaseUrls') || {} +// if (Object.prototype.hasOwnProperty.call(servers, key)) { +// const r = { ...servers[key] } +// const { urlType } = r +// const baseUrlObj = mapBaseUrls[urlType as string] +// if (baseUrlObj) { +// r.url = baseUrlObj.url + r.url +// r.url_3d = baseUrlObj.url + r.url_3d +// if (r.geojson_url) { +// r.geojson_url = baseUrlObj.url + r.geojson_url +// } +// } +// return r +// } +// console.warn(`The gis config which key is ${key} not exist!`) +// return null +// } diff --git a/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts b/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts new file mode 100644 index 00000000..87e29dd7 --- /dev/null +++ b/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts @@ -0,0 +1,391 @@ +import Feature from 'ol/Feature'; +import Point from 'ol/geom/Point'; +import OlMap from 'ol/Map'; +import VectorLayer from 'ol/layer/Vector'; +import VectorSource from 'ol/source/Vector'; +import { fromLonLat } from 'ol/proj'; +import { getIconPath } from '@/utils/index'; +type PointLayerStyleFactory = (feature: Feature) => any; + +type PointLayerManagerOptions = { + map: OlMap | null; + createStyle: PointLayerStyleFactory; +}; + +export class PointLayerManager { + private map: OlMap | null; + private createStyle: PointLayerStyleFactory; + private layerRegistry: Map> = new Map(); + private layerFeatureIndexes: Map< + string, + Map> + > = new Map(); + + constructor(options: PointLayerManagerOptions) { + this.map = options.map; + this.createStyle = options.createStyle; + } + + // 备注:同步更新地图实例,供地图初始化后把真实 map 注入点图层管理器。 + setMap(map: OlMap | null) { + this.map = map; + } + + // 备注:获取当前屏幕可视区域内的所有点要素(仅包含图层可见且图例可见的要素)。 + getFeaturesInViewport(): Feature[] { + if (!this.map) return []; + + const extent = this.map.getView().calculateExtent(this.map.getSize()); + if (!extent) return []; + + const [minX, minY, maxX, maxY] = extent; + const result: Feature[] = []; + + this.forEachFeature((feature, layer) => { + // 跳过图层本身不可见的要素 + if (!layer.getVisible()) return; + + const geom = feature.getGeometry(); + if (!geom || geom.getType() !== 'Point') return; + + const coords = (geom as Point).getCoordinates(); + const [x, y] = coords; + + if (x >= minX && x <= maxX && y >= minY && y <= maxY) { + result.push(feature); + } + }); + + return result; + } + + // 备注:统一返回当前点图层注册表,供外层做遍历或清理。 + getRegistry() { + return this.layerRegistry; + } + + // 备注:按图层 key 获取已注册的点图层实例。 + getLayer(layerKey: string) { + return this.layerRegistry.get(layerKey); + } + + // 备注:返回当前所有点图层实例,供命中检测和批量刷新使用。 + getLayers(): VectorLayer[] { + return Array.from(this.layerRegistry.values()); + } + + // 备注:按当前缩放级别统一刷新近邻点展开坐标,保证抽吸后的点击和 popup 与视觉位置一致。 + updateNearbyFeatureLayout(currentZoom?: number): void { + if (!this.map) return; + + if (currentZoom === undefined || !Number.isFinite(currentZoom)) { + return; + } + + this.forEachFeature(feature => { + this.resetFeatureToBaseCoordinate(feature); + }); + } + + // 备注:判断指定图层 key 的点图层是否已存在。 + hasLayer(layerKey: string): boolean { + return this.layerRegistry.has(layerKey); + } + + // 备注:按需获取或创建点图层实例,并自动完成注册与挂载。 + ensureLayer(layerKey: string, layerType?: string) { + if (!this.map || !layerKey) return null; + + let vectorLayer = this.layerRegistry.get(layerKey); + if (vectorLayer) { + return vectorLayer; + } + + const vectorSource = new VectorSource(); + vectorLayer = new VectorLayer({ + source: vectorSource, + zIndex: 100, + declutter: true, + style: feature => this.createStyle(feature as Feature) + }); + (vectorLayer as any).type = layerType || layerKey; + this.layerRegistry.set(layerKey, vectorLayer); + this.map.addLayer(vectorLayer); + return vectorLayer; + } + + // 备注:把后端点位数组转换为 OpenLayers Feature,并写入指定点图层。 + addDataLayer(pointData: any, layerType: string): void { + if (!this.map) return; + + let dataArray: any[] = []; + let targetLayerKey = layerType; + + if (Array.isArray(pointData)) { + dataArray = pointData; + } else { + dataArray = pointData?.data || []; + targetLayerKey = pointData?.key || layerType; + } + + if (!targetLayerKey) { + console.warn('缺少图层 Key,无法加载描点'); + return; + } + + const vectorLayer = this.ensureLayer(targetLayerKey, layerType); + if (!vectorLayer) return; + + const vectorSource = vectorLayer.getSource(); + if (!vectorSource) { + return; + } + + vectorSource.clear(); + this.resetLayerFeatureIndexes(targetLayerKey); + + if (dataArray.length === 0) { + return; + } + + const features: Feature[] = []; + + dataArray.forEach((item: any) => { + const feature = this.createFeature(item, targetLayerKey); + if (feature) { + this.indexFeature(targetLayerKey, feature); + features.push(feature); + } + }); + + if (features.length > 0) { + vectorSource.addFeatures(features); + } + } + + // 备注:统一控制整个点图层显隐,供图层树勾选联动使用。 + setLayerVisible(layerKey: string, visible?: boolean): void { + const vectorLayer = this.layerRegistry.get(layerKey); + if (vectorLayer && vectorLayer.getVisible() !== visible) { + vectorLayer.setVisible(visible); + vectorLayer.changed(); + } + } + + // 备注:按图层 key 删除点图层并清空其 source 数据。 + removeLayer(layerKey: string): void { + if (!this.map || !layerKey) { + console.warn('removePointLayer: 无效的图层 key 或地图未初始化'); + return; + } + + const vectorLayer = this.layerRegistry.get(layerKey); + if (!vectorLayer) { + console.warn(`未找到标识为 [${layerKey}] 的描点图层实例`); + return; + } + + const source = vectorLayer.getSource(); + if (source) { + source.clear(); + } + this.map.removeLayer(vectorLayer); + this.layerRegistry.delete(layerKey); + this.layerFeatureIndexes.delete(layerKey); + } + + // 备注:按图层遍历所有点图层实例,供 hover 刷新和区域裁切复用。 + forEachLayer( + callback: (layer: VectorLayer, layerKey: string) => void + ): void { + this.layerRegistry.forEach((layer, layerKey) => { + callback(layer, layerKey); + }); + } + + // 备注:遍历所有点要素,供区域裁切或批量状态更新使用。 + forEachFeature( + callback: ( + feature: Feature, + layer: VectorLayer, + layerKey: string + ) => void + ): void { + this.forEachLayer((layer, layerKey) => { + const source = layer.getSource(); + if (!source) return; + source.getFeatures().forEach(feature => { + callback(feature as Feature, layer, layerKey); + }); + }); + } + + // 备注:按图例字段值统一控制要素显隐,供图例和容量筛选联动复用。 + setLegendVisibleByField( + layerKey: string, + matchValue: string, + checked: boolean, + fieldKey = 'anchoPointState' + ): void { + const vectorLayer = this.layerRegistry.get(layerKey); + if (!vectorLayer) return; + + const source = vectorLayer.getSource(); + if (!source) return; + + if (!matchValue) { + source.getFeatures().forEach(feature => { + if (feature.get('_legendVisible') !== false) { + feature.set('_legendVisible', false); + feature.changed(); + } + }); + vectorLayer.changed(); + return; + } + + const targetFeatures = this.getIndexedFeatures( + layerKey, + fieldKey, + matchValue + ); + if (targetFeatures.length === 0) return; + + targetFeatures.forEach(feature => { + if (feature.get('_legendVisible') !== checked) { + feature.set('_legendVisible', checked); + feature.changed(); + } + }); + vectorLayer.changed(); + } + + // 备注:统一销毁所有点图层并清空注册表,供地图销毁阶段复用。 + destroy(): void { + this.forEachLayer(layer => { + const source = layer.getSource(); + if (source) { + source.clear(); + } + if (this.map && this.map.getLayers().getArray().includes(layer)) { + this.map.removeLayer(layer); + } + if ((layer as any).setMap) { + (layer as any).setMap(null); + } + }); + this.layerRegistry.clear(); + this.layerFeatureIndexes.clear(); + } + + // 备注:统一把业务点位数据转换为 Feature,并补齐样式依赖字段。 + private createFeature(item: any, targetLayerKey: string): Feature | null { + const { lgtd, lttd, stnm, iconCode, titleName, ennm } = item; + + if (lgtd == null || lttd == null) { + return null; + } + + const lon = Number(lgtd); + const lat = Number(lttd); + if (isNaN(lon) || isNaN(lat) || !isFinite(lon) || !isFinite(lat)) { + return null; + } + if (Math.abs(lon) > 180 || Math.abs(lat) > 90) { + return null; + } + + const coord = fromLonLat([lon, lat]); + if (!isFinite(coord[0]) || !isFinite(coord[1])) { + return null; + } + let iconUrl = iconCode ? getIconPath(iconCode) : ''; + if (!iconUrl) { + iconUrl = getIconPath('default') || ''; + } + + const feature = new Feature({ + geometry: new Point(coord), + ...item, + _layerKey: targetLayerKey + }); + const rawFeatureId = + item.stcd || item._id || `${lon.toFixed(6)},${lat.toFixed(6)}`; + feature.setId(`${targetLayerKey}:${rawFeatureId}`); + feature.set('_iconUrl', iconUrl); + feature.set( + '_labelText', + item.sttpMap === 'ylfb' ? item.ftp || '' : titleName || stnm || ennm || '' + ); + feature.set('_baseCoordinates', coord); + feature.set('_legendVisible', true); + feature.set('_regionVisible', true); + feature.set('_sttpMap', item.sttpMap); + if (item.popupHtml) { + feature.set('popupHtml', item.popupHtml); + } + + return feature; + } + + // 备注:重置单个图层的字段索引,供重新灌入数据或删除图层时复用。 + private resetLayerFeatureIndexes(layerKey: string): void { + this.layerFeatureIndexes.set(layerKey, new Map()); + } + + // 备注:按字段值给要素建立索引,供图例切换时快速命中目标锚点集合。 + private indexFeature(layerKey: string, feature: Feature): void { + const fieldIndexMap = + this.layerFeatureIndexes.get(layerKey) || + new Map>(); + + const legendFieldKey = 'anchoPointState'; + const legendFieldValue = feature.get(legendFieldKey); + if (legendFieldValue != null) { + const valueMap = + fieldIndexMap.get(legendFieldKey) || new Map(); + const normalizedValue = String(legendFieldValue); + const targetFeatures = valueMap.get(normalizedValue) || []; + targetFeatures.push(feature); + valueMap.set(normalizedValue, targetFeatures); + fieldIndexMap.set(legendFieldKey, valueMap); + } + + this.layerFeatureIndexes.set(layerKey, fieldIndexMap); + } + + // 备注:根据图层 key、字段名和值快速返回目标要素集合,避免图例切换时整层遍历。 + private getIndexedFeatures( + layerKey: string, + fieldKey: string, + matchValue: string + ): Feature[] { + const fieldIndexMap = this.layerFeatureIndexes.get(layerKey); + if (!fieldIndexMap) return []; + + const valueMap = fieldIndexMap.get(fieldKey); + if (!valueMap) return []; + return valueMap.get(String(matchValue)) || []; + } + + // 备注:先恢复要素原始坐标,再按缩放阶段决定是否做展开偏移,避免多次缩放后偏移累计。 + private resetFeatureToBaseCoordinate(feature: Feature): void { + const baseCoordinates = feature.get('_baseCoordinates') as + | number[] + | undefined; + const geometry = feature.getGeometry(); + if ( + !baseCoordinates || + baseCoordinates.length < 2 || + !geometry || + geometry.getType() !== 'Point' + ) { + return; + } + + (geometry as Point).setCoordinates([ + baseCoordinates[0], + baseCoordinates[1] + ]); + } +} diff --git a/frontend-sjgl/src/components/gis/ol/popup-manager.ts b/frontend-sjgl/src/components/gis/ol/popup-manager.ts new file mode 100644 index 00000000..929d8dfb --- /dev/null +++ b/frontend-sjgl/src/components/gis/ol/popup-manager.ts @@ -0,0 +1,530 @@ +import Feature from 'ol/Feature'; +import Point from 'ol/geom/Point'; +import OlMap from 'ol/Map'; +import Overlay from 'ol/Overlay'; +import VectorLayer from 'ol/layer/Vector'; +import VectorSource from 'ol/source/Vector'; +import { + generatePopupHtml, + shouldPreferEng2Popup +} from '@/utils/popupHtmlGenerator'; + +type PopupManagerOptions = { + map: OlMap | null; + getPointLayers: () => VectorLayer[]; +}; + +type PopupHitResult = { + detectedFeature: Feature | undefined; + isHitIcon: boolean; + coordinate?: number[]; +}; + +type PointerMoveChangePayload = { + hoveredId: string | number | null; + detectedFeature: Feature | undefined; + coordinate?: number[]; +}; + +export class PopupManager { + private map: OlMap | null; + private popupOverlay: Overlay | null = null; + private popupElement: HTMLElement | null = null; + private batchPopupContainer: HTMLDivElement | null = null; + private batchPopupItems: Array<{ + feature: Feature; + element: HTMLDivElement; + }> = []; + private lastHoveredId: string | number | null = null; + private animationFrameId: number | null = null; + private getPointLayers: () => VectorLayer[]; + private popupMouseEnterHandler: (() => void) | null = null; + private popupMouseMoveHandler: (() => void) | null = null; + private hoverChangeHandler: + | ((payload: PointerMoveChangePayload) => void) + | undefined; + + constructor(options: PopupManagerOptions) { + this.map = options.map; + this.getPointLayers = options.getPointLayers; + } + + // 备注:同步地图实例,供地图初始化和销毁后更新 Popup 管理器上下文。 + setMap(map: OlMap | null) { + this.map = map; + } + + // 备注:初始化 Popup Overlay 并挂载到地图实例。 + initPopupOverlay(container: HTMLElement) { + this.popupElement = container; + this.popupElement.style.display = 'none'; + this.popupElement.style.removeProperty('position'); + this.popupElement.style.removeProperty('transform'); + this.popupElement.style.removeProperty('left'); + this.popupElement.style.removeProperty('top'); + this.popupElement.style.setProperty('pointer-events', 'none', 'important'); + this.popupMouseEnterHandler = () => { + this.forceHidePopup(); + }; + this.popupMouseMoveHandler = () => { + this.forceHidePopup(); + }; + this.popupElement.addEventListener( + 'mouseenter', + this.popupMouseEnterHandler + ); + this.popupElement.addEventListener('mousemove', this.popupMouseMoveHandler); + this.popupOverlay = new Overlay({ + element: this.popupElement, + positioning: 'bottom-center', + offset: [0, -10], + stopEvent: false, + autoPan: false + }); + + if (this.map) { + this.map.addOverlay(this.popupOverlay); + } + } + + // 备注:统一处理地图点击命中检测,命中图标时通过回调把要素抛给外层。 + handleMapClick( + pixel: number[], + onHit?: (feature: Feature, coordinate?: number[]) => void + ) { + const { detectedFeature, isHitIcon, coordinate } = + this.detectFeatureAtPixel(pixel); + if (detectedFeature && isHitIcon) { + onHit?.(detectedFeature, coordinate); + } + } + + // 备注:统一处理鼠标悬停命中检测与节流,只有 hover 目标变化时才通知外层刷新。 + handlePointerMove( + pixel: number[], + onHoverChange?: (payload: PointerMoveChangePayload) => void + ) { + if (!this.map) return; + this.hoverChangeHandler = onHoverChange; + + const zoom = this.map.getView().getZoom(); + if (zoom !== undefined && zoom < 4.7) { + return; + } + + if (this.animationFrameId) { + cancelAnimationFrame(this.animationFrameId); + } + + this.animationFrameId = requestAnimationFrame(() => { + const { detectedFeature, isHitIcon, coordinate } = + this.detectFeatureAtPixel(pixel); + const hoveredId = + detectedFeature && isHitIcon ? (detectedFeature.getId() as any) : null; + const nextFeature = hoveredId ? detectedFeature : undefined; + const nextCoordinate = hoveredId ? coordinate : undefined; + + if (hoveredId !== this.lastHoveredId) { + this.emitHoverChange({ + hoveredId, + detectedFeature: nextFeature, + coordinate: nextCoordinate + }); + } + }); + } + + // 备注:在指定像素位置检测点图层要素,并判断是否命中图标区域。 + detectFeatureAtPixel(pixel: number[]): PopupHitResult { + let detectedFeature: Feature | undefined = undefined; + let isHitIcon = false; + let coordinate: number[] | undefined; + const pointLayers = this.getPointLayers(); + + if (this.isPixelInsidePopup(pixel)) { + return { + detectedFeature: undefined, + isHitIcon: false, + coordinate: undefined + }; + } + + this.map?.forEachFeatureAtPixel( + pixel, + (feature, layer) => { + if (pointLayers.includes(layer as VectorLayer)) { + detectedFeature = feature as Feature; + const geom = feature.getGeometry(); + if (geom && geom.getType() === 'Point') { + coordinate = (geom as Point).getCoordinates(); + const iconPixel = this.map?.getPixelFromCoordinate(coordinate); + if (iconPixel) { + const dx = pixel[0] - iconPixel[0]; + const dy = pixel[1] - iconPixel[1]; + if (this.isPixelInsideIconArea(dx, dy)) { + isHitIcon = true; + } + } + } + + return true; + } + return false; + }, + { hitTolerance: 0 } + ); + + return { detectedFeature, isHitIcon, coordinate }; + } + + // 备注:仅把图标本体区域作为 hover 命中范围,避免上方文字标签被误判为图标命中。 + private isPixelInsideIconArea(dx: number, dy: number): boolean { + if (!this.map) return false; + + const zoom = this.map.getView().getZoom() ?? 4.5; + let dynamicScale = 0.7 + (zoom - 4.5) * 0.08; + dynamicScale = Math.max(0.5, Math.min(3.0, dynamicScale)); + + const halfWidth = 12 * dynamicScale; + const topReach = 8 * dynamicScale; + const bottomReach = 12 * dynamicScale; + + return ( + dx >= -halfWidth && + dx <= halfWidth && + dy >= -topReach && + dy <= bottomReach + ); + } + + // 备注:根据当前悬停要素统一显示或隐藏 Popup 内容。 + showPopup(feature: Feature | undefined, coordinate: number[] | undefined) { + if (!this.popupOverlay || !this.popupElement) return; + + if (feature && coordinate) { + const props = feature.getProperties(); + const popupHtml = this.getPopupHtml(props); + + if (popupHtml) { + this.popupElement.innerHTML = popupHtml; + this.popupOverlay.setPosition(coordinate); + this.popupElement.style.display = 'block'; + return; + } + } + + this.popupOverlay.setPosition(undefined); + this.popupElement.style.display = 'none'; + } + + private getPopupHtml(props: Record) { + return props.popupHtml || generatePopupHtml(props); + } + + // 备注:批量显示多个要素的 Popup,使用绝对定位的 div 而非 Overlay。 + showPopupsForFeatures( + features: Feature[], + styleChecker?: (feature: Feature) => boolean, + options?: { + rebuild?: boolean; + } + ) { + if (!this.map || !this.popupElement) return; + const shouldRebuild = options?.rebuild !== false; + + // 过滤:只显示图例可见的要素 + const visibleFeatures = features.filter( + f => f.get('_legendVisible') !== false + ); + + if (visibleFeatures.length === 0) { + this.clearBatchPopups(); + return; + } + + if (!shouldRebuild && this.batchPopupItems.length > 0) { + this.updateBatchPopupPositions(styleChecker); + return; + } + + this.clearBatchPopups(); + + const mapElement = this.map.getTargetElement(); + const batchContainer = document.createElement('div'); + batchContainer.className = 'batch-popup-container'; + batchContainer.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 1000; + `; + batchContainer.id = 'batch-popup-container'; + this.batchPopupContainer = batchContainer; + + // 先添加容器到 DOM,以便后续元素能正确测量尺寸 + mapElement.appendChild(batchContainer); + + // 用于碰撞检测的已放置 popup 列表 + const placedPopups: Array<{ + left: number; + right: number; + top: number; + bottom: number; + }> = []; + visibleFeatures.forEach(feature => { + const geom = feature.getGeometry(); + if (!geom || geom.getType() !== 'Point') return; + + const coords = (geom as Point).getCoordinates(); + const pixel = this.map?.getPixelFromCoordinate(coords); + if (!pixel) return; + + // 检查样式是否隐藏(declutter、距离过滤等) + if (styleChecker && !styleChecker(feature)) { + return; + } + + const props = feature.getProperties(); + const popupHtml = shouldPreferEng2Popup(props) + ? generatePopupHtml(props, { forceEng2: true }) || + props.popupHtml || + generatePopupHtml(props) + : this.getPopupHtml(props); + if (!popupHtml) return; + + // 创建与原始 popupElement 完全相同的样式 + const popupEl = document.createElement('div'); + popupEl.className = this.popupElement.className; + popupEl.innerHTML = popupHtml; + // 不设置自定义 cssText,只设置定位(对应原始 popup 的 positioning: 'bottom-center', offset: [0, -10]) + popupEl.style.position = 'absolute'; + popupEl.style.display = 'block'; + popupEl.style.transform = 'translate(-50%, -100%)'; // bottom-center 对齐 + popupEl.style.pointerEvents = 'none'; + + // 临时设置 visibility: hidden 来测量尺寸 + popupEl.style.visibility = 'hidden'; + popupEl.style.left = `${pixel[0]}px`; + popupEl.style.top = `${pixel[1] - 10}px`; + batchContainer.appendChild(popupEl); + + // 获取 popup 尺寸 + const rect = popupEl.getBoundingClientRect(); + const popupWidth = rect.width; + const popupHeight = rect.height; + + // 计算 popup 的位置(对应原始 positioning: 'bottom-center', offset: [0, -10]) + const popupX = pixel[0]; + const popupY = pixel[1] - 10; // bottom-center 对齐 + 10px 偏移 + const popupRect = { + left: popupX - popupWidth / 2, + right: popupX + popupWidth / 2, + top: popupY - popupHeight, + bottom: popupY + }; + + // 碰撞检测 + let hasCollision = false; + for (const placed of placedPopups) { + if (this.checkCollision(popupRect, placed)) { + hasCollision = true; + break; + } + } + + if (!hasCollision) { + // 无碰撞,显示 popup + popupEl.style.visibility = 'visible'; + popupEl.style.left = `${popupX}px`; + popupEl.style.top = `${popupY}px`; + this.batchPopupItems.push({ + feature, + element: popupEl + }); + + placedPopups.push({ + left: popupRect.left, + right: popupRect.right, + top: popupRect.top, + bottom: popupRect.bottom + }); + } else { + // 有碰撞,移除该 popup + batchContainer.removeChild(popupEl); + } + }); + } + + updateBatchPopupPositions(styleChecker?: (feature: Feature) => boolean) { + if ( + !this.map || + !this.batchPopupContainer || + this.batchPopupItems.length === 0 + ) { + return; + } + + const mapSize = this.map.getSize(); + const viewportWidth = mapSize?.[0] ?? 0; + const viewportHeight = mapSize?.[1] ?? 0; + const viewportPadding = 48; + + this.batchPopupItems.forEach(({ feature, element }) => { + if (feature.get('_legendVisible') === false) { + element.style.display = 'none'; + return; + } + + if (styleChecker && !styleChecker(feature)) { + element.style.display = 'none'; + return; + } + + const geom = feature.getGeometry(); + if (!geom || geom.getType() !== 'Point') { + element.style.display = 'none'; + return; + } + + const coords = (geom as Point).getCoordinates(); + const pixel = this.map?.getPixelFromCoordinate(coords); + if (!pixel) { + element.style.display = 'none'; + return; + } + + const popupX = pixel[0]; + const popupY = pixel[1] - 10; + if ( + popupX < -viewportPadding || + popupY < -viewportPadding || + popupX > viewportWidth + viewportPadding || + popupY > viewportHeight + viewportPadding + ) { + element.style.display = 'none'; + return; + } + + element.style.left = `${popupX}px`; + element.style.top = `${popupY}px`; + element.style.display = 'block'; + }); + } + + // 备注:清除批量显示的 popups。 + clearBatchPopups() { + this.batchPopupItems = []; + if (this.batchPopupContainer) { + this.batchPopupContainer.remove(); + this.batchPopupContainer = null; + return; + } + + const existing = document.getElementById('batch-popup-container'); + if (existing) { + existing.remove(); + } + } + + // 备注:检测两个 popup 矩形是否碰撞。 + private checkCollision( + rect1: { left: number; right: number; top: number; bottom: number }, + rect2: { left: number; right: number; top: number; bottom: number } + ): boolean { + const padding = 4; + return !( + rect1.right + padding < rect2.left || + rect1.left - padding > rect2.right || + rect1.bottom + padding < rect2.top || + rect1.top - padding > rect2.bottom + ); + } + + // 备注:统一重置 hover 和 Popup 状态,供地图销毁和切换时复用。 + reset() { + if (this.animationFrameId) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; + } + this.emitHoverChange({ + hoveredId: null, + detectedFeature: undefined, + coordinate: undefined + }); + } + + // 备注:在弹窗层意外接管鼠标时,通过统一 hover 回调链路立即清空当前悬停状态。 + private forceHidePopup() { + this.emitHoverChange({ + hoveredId: null, + detectedFeature: undefined, + coordinate: undefined + }); + } + + // 备注:统一派发 hover 变化,确保地图侧的 cursor、Popup 和图层刷新走同一条处理链路。 + private emitHoverChange(payload: PointerMoveChangePayload) { + this.lastHoveredId = payload.hoveredId; + this.hoverChangeHandler?.(payload); + if (!this.hoverChangeHandler) { + this.showPopup(payload.detectedFeature, payload.coordinate); + } + } + + // 备注:当鼠标进入当前 Popup 可见区域时,禁止再把该区域重新识别为图标 hover。 + private isPixelInsidePopup(pixel: number[]): boolean { + if (!this.map || !this.popupElement) { + return false; + } + + if (this.popupElement.style.display === 'none') { + return false; + } + + const popupRect = this.popupElement.getBoundingClientRect(); + if (popupRect.width <= 0 || popupRect.height <= 0) { + return false; + } + + const mapRect = this.map.getTargetElement().getBoundingClientRect(); + const clientX = mapRect.left + pixel[0]; + const clientY = mapRect.top + pixel[1]; + + return ( + clientX >= popupRect.left && + clientX <= popupRect.right && + clientY >= popupRect.top && + clientY <= popupRect.bottom + ); + } + + // 备注:销毁 Popup 管理器内部状态和 Overlay 引用。 + destroy() { + this.clearBatchPopups(); + this.reset(); + if (this.popupElement && this.popupMouseEnterHandler) { + this.popupElement.removeEventListener( + 'mouseenter', + this.popupMouseEnterHandler + ); + } + if (this.popupElement && this.popupMouseMoveHandler) { + this.popupElement.removeEventListener( + 'mousemove', + this.popupMouseMoveHandler + ); + } + if (this.map && this.popupOverlay) { + this.map.removeOverlay(this.popupOverlay); + } + this.popupMouseEnterHandler = null; + this.popupMouseMoveHandler = null; + this.hoverChangeHandler = undefined; + this.popupOverlay = null; + this.popupElement = null; + this.map = null; + } +} diff --git a/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts b/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts new file mode 100644 index 00000000..10989037 --- /dev/null +++ b/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts @@ -0,0 +1,341 @@ +import OlMap from 'ol/Map'; +import View from 'ol/View'; +import TileLayer from 'ol/layer/Tile'; +import GeoJSON from 'ol/format/GeoJSON'; +import VectorSource from 'ol/source/Vector'; +import { fromLonLat } from 'ol/proj'; +import { PointLayerManager } from './point-layer-manager'; + +type RegionMaskManagerOptions = { + map: OlMap | null; + view: View | null; + pointLayerManager: PointLayerManager; + defaultCenter: [number, number]; + defaultZoom: number; +}; + +export class RegionMaskManager { + private map: OlMap | null; + private view: View | null; + private pointLayerManager: PointLayerManager; + private defaultCenter: [number, number]; + private defaultZoom: number; + private maskBindings: Array<{ + layer: TileLayer; + prerender: (event: any) => void; + postrender: (event: any) => void; + }> = []; + + constructor(options: RegionMaskManagerOptions) { + this.map = options.map; + this.view = options.view; + this.pointLayerManager = options.pointLayerManager; + this.defaultCenter = options.defaultCenter; + this.defaultZoom = options.defaultZoom; + } + + // 备注:同步地图和视图上下文,供地图初始化、销毁和重建后复用区域过滤能力。 + setContext(map: OlMap | null, view: View | null) { + this.map = map; + this.view = view; + } + + // 备注:统一隐藏所有点位的区域显示状态,供基地裁切前的预处理复用。 + hideAllPoints(): void { + this.pointLayerManager.forEachFeature(feature => { + feature.set('_regionVisible', false); + feature.changed(); + }); + } + + // 备注:统一恢复所有点位的区域显示状态,供取消裁切或异常兜底时复用。 + showAllPoints(): void { + this.pointLayerManager.forEachFeature(feature => { + feature.set('_regionVisible', true); + feature.changed(); + }); + } + + // 备注:根据 GeoJSON 边界批量更新点位的区域显隐状态。 + filterPointsByRegion(geoJson: any): void { + const regionCoords = this.extractPolygonCoords(geoJson); + if (!regionCoords.length) { + console.warn('无法解析区域边界,显示所有锚点'); + this.showAllPoints(); + return; + } + + this.pointLayerManager.forEachFeature(feature => { + const props = feature.getProperties(); + const lon = Number(props.lgtd); + const lat = Number(props.lttd); + + if (!isFinite(lon) || !isFinite(lat)) { + feature.set('_regionVisible', false); + feature.changed(); + return; + } + + feature.set('_regionVisible', this.isPointInPolygon(lon, lat, regionCoords)); + feature.changed(); + }); + } + + // 备注:根据 GeoJSON 范围拟合地图视野,供基地切换后快速聚焦到目标区域。 + fitViewToGeoJson(geoJson: any): void { + if (!this.map || !this.view) return; + + try { + const features = new GeoJSON().readFeatures(geoJson, { + dataProjection: 'EPSG:4326', + featureProjection: 'EPSG:3857' + }); + + if (!features.length) return; + + const source = new VectorSource({ + features + }); + const extent = source.getExtent(); + + if (extent[0] === Infinity || extent[0] === -Infinity) { + console.warn('无法计算有效的地图包围盒'); + return; + } + + this.view.fit(extent, { + padding: [100, 200, 50, 50], + duration: 1000, + maxZoom: 13 + }); + } catch (error) { + console.error('调整地图视野失败:', error); + } + } + + // 备注:把 GeoJSON 边界绑定到底图 prerender/postrender 事件,实现区域裁切遮罩。 + applyMapMask(rasterLayer: TileLayer, clipGeoJson: any): void { + this.applyMapMaskToLayers(rasterLayer ? [rasterLayer] : [], clipGeoJson); + } + + // 备注:把 GeoJSON 边界同时绑定到多个底图图层,保证多底图叠加场景下裁切边界保持一致。 + applyMapMaskToLayers(rasterLayers: TileLayer[] = [], clipGeoJson: any): void { + if (!clipGeoJson) return; + + const targetLayers = rasterLayers.filter(Boolean); + if (targetLayers.length === 0) return; + + const features = new GeoJSON().readFeatures(clipGeoJson, { + dataProjection: 'EPSG:4326', + featureProjection: 'EPSG:3857' + }); + + if (!features.length) { + console.warn('裁切数据为空,无法应用遮罩'); + return; + } + + this.clearMaskEvents(); + + targetLayers.forEach(rasterLayer => { + const maskPrerender = (event: any) => { + const context = event.context; + const frameState = event.frameState; + + if (!context || !frameState || !this.map) return; + + context.save(); + context.setTransform(1, 0, 0, 1, 0, 0); + context.beginPath(); + + let hasValidPath = false; + + for (const feature of features) { + const geometry = feature.getGeometry(); + if (!geometry) continue; + + if (geometry.getType() === 'Polygon') { + const rings = (geometry as any).getCoordinates() as number[][][]; + for (const ring of rings) { + if (this.drawRingToContext(context, ring, frameState)) { + hasValidPath = true; + } + } + } else if (geometry.getType() === 'MultiPolygon') { + const polygons = (geometry as any).getCoordinates() as number[][][][]; + for (const polygonRings of polygons) { + for (const ring of polygonRings) { + if (this.drawRingToContext(context, ring, frameState)) { + hasValidPath = true; + } + } + } + } + } + + if (!hasValidPath) { + console.warn('未能生成有效的裁切路径'); + return; + } + + context.save(); + context.lineWidth = 6; + context.strokeStyle = '#6D64DF'; + context.stroke(); + context.clip(); + context.strokeStyle = '#CCC9F4'; + context.lineWidth = 5; + context.stroke(); + context.clip(); + }; + + const maskPostrender = (event: any) => { + if (event.context) { + event.context.restore(); + event.context.restore(); + } + }; + + this.maskBindings.push({ + layer: rasterLayer, + prerender: maskPrerender, + postrender: maskPostrender + }); + + rasterLayer.on('prerender', maskPrerender); + rasterLayer.on('postrender', maskPostrender); + rasterLayer.changed(); + }); + } + + // 备注:清除当前底图遮罩并按需恢复默认视野,供切换基地和异常兜底复用。 + clearMapMask(resetView = true): void { + const maskedLayers = this.maskBindings.map(binding => binding.layer); + this.clearMaskEvents(); + + maskedLayers.forEach(layer => layer.changed()); + + if (resetView && this.view) { + this.view.animate({ + center: fromLonLat(this.defaultCenter), + zoom: this.defaultZoom, + duration: 1000 + }); + } + } + + // 备注:统一销毁区域过滤相关引用和事件,供地图销毁阶段复用。 + destroy(): void { + this.clearMapMask(false); + this.map = null; + this.view = null; + } + + // 备注:从 GeoJSON 中提取可用于点在面判断的多边形环坐标。 + private extractPolygonCoords(geoJson: any): number[][][] { + if (!geoJson?.features?.length) { + return []; + } + + const coords: number[][][] = []; + geoJson.features.forEach((feature: any) => { + const geometry = feature.geometry; + if (!geometry) return; + + if (geometry.type === 'Polygon') { + coords.push(...geometry.coordinates); + } else if (geometry.type === 'MultiPolygon') { + geometry.coordinates.forEach((polygon: number[][][]) => { + coords.push(...polygon); + }); + } + }); + + return coords; + } + + // 备注:使用射线法判断点是否落在任意一个区域环内。 + private isPointInPolygon( + lon: number, + lat: number, + polygons: number[][][] + ): boolean { + for (const polygon of polygons) { + if (this.isPointInRing(lon, lat, polygon)) { + return true; + } + } + return false; + } + + // 备注:使用射线法判断点是否落在单个闭合环内。 + private isPointInRing(lon: number, lat: number, ring: number[][]): boolean { + let inside = false; + const ringLength = ring.length; + + for (let i = 0, j = ringLength - 1; i < ringLength; j = i++) { + const xi = ring[i][0]; + const yi = ring[i][1]; + const xj = ring[j][0]; + const yj = ring[j][1]; + + const intersect = + yi > lat !== yj > lat && + lon < ((xj - xi) * (lat - yi)) / (yj - yi) + xi; + + if (intersect) { + inside = !inside; + } + } + + return inside; + } + + // 备注:把单个面环转换为当前帧 Canvas 可裁切的路径。 + private drawRingToContext( + context: CanvasRenderingContext2D, + ring: number[][], + frameState: any + ): boolean { + if (!ring || ring.length < 3) return false; + + const pixelRatio = frameState.pixelRatio || window.devicePixelRatio || 1; + let moved = false; + + for (let i = 0; i < ring.length; i++) { + const coord = ring[i]; + if (!coord || coord.length < 2 || typeof coord[0] !== 'number') { + continue; + } + + const cssPixel = this.map?.getPixelFromCoordinate(coord as [number, number]); + if (!cssPixel) continue; + + const canvasX = cssPixel[0] * pixelRatio; + const canvasY = cssPixel[1] * pixelRatio; + + if (!moved) { + context.moveTo(canvasX, canvasY); + moved = true; + } else { + context.lineTo(canvasX, canvasY); + } + } + + if (moved) { + context.closePath(); + return true; + } + + return false; + } + + // 备注:解除旧底图上的遮罩事件,避免重复绑定或残留旧裁切效果。 + private clearMaskEvents(): void { + this.maskBindings.forEach(binding => { + binding.layer.un('prerender', binding.prerender); + binding.layer.un('postrender', binding.postrender); + }); + this.maskBindings = []; + } +} diff --git a/frontend-sjgl/src/components/gis/osgbUtils.ts b/frontend-sjgl/src/components/gis/osgbUtils.ts new file mode 100644 index 00000000..5f4abea8 --- /dev/null +++ b/frontend-sjgl/src/components/gis/osgbUtils.ts @@ -0,0 +1,747 @@ +/** + * 倾斜摄影(OSGB)工具函数 + * 适配自旧项目 osgbTool.ts,核心逻辑保持一致 + * + * 使用字段: url, boundary, location, height, accuracy + */ +import * as turf from '@turf/turf'; +import * as Cesium from 'cesium'; +import { getToken } from '@/utils/auth'; + +// ==================== 类型定义 ==================== + +export interface OSGBLocation { + destination: number[]; // [x, y, z] 或 [lng, lat, height] + orientation: { + heading: number; + pitch: number; + roll: number; + }; + center: number[]; +} + +export interface OSGBItem { + /** 3D Tileset 服务地址 */ + url: string; + /** GeoJSON Polygon 边界(用于裁切) */ + boundary?: any; + /** 定位信息 */ + location?: OSGBLocation | string; + /** 模型高度偏移 */ + height?: number; + /** 屏幕空间误差 (默认 16) */ + accuracy?: number; + /** 内部状态 - 不要手动设置 */ + osgbtitles?: any; + cartesian3?: any; + clippingPlanes?: any; + eventListener?: any; + _loading?: boolean; + _loadId?: number; + /** 用户手动关闭开关标志:为 true 时不自动加载/显示,只做显隐切换 */ + _switchOff?: boolean; +} + +// ==================== 内部状态(每个 OSGB 实例独立) ==================== + +interface OSGBInstanceState { + destination: Cesium.Cartesian3 | null; + orientation: any; + timelookat: any; + time: number; + num: number; + witetime: number; + timeout: any; +} + +const instanceStates = new WeakMap(); + +function getState(obj: OSGBItem): OSGBInstanceState { + let state = instanceStates.get(obj); + if (!state) { + state = { + destination: null, + orientation: null, + timelookat: null, + time: 0, + num: 0, + witetime: 0, + timeout: undefined + }; + instanceStates.set(obj, state); + } + return state; +} + +function clearState(obj: OSGBItem) { + const state = instanceStates.get(obj); + if (state) { + clearTimeout(state.timeout); + clearInterval(state.timelookat); + } + instanceStates.delete(obj); +} + +// ==================== 3D Tileset 场景管理 ==================== + +/** + * 将 tileset 添加到场景 + */ +const addOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { + if (!viewer || viewer.isDestroyed()) return; + viewer.scene.primitives.add(tileset); +}; + +/** + * 从场景移除 tileset(PrimitiveCollection.remove 默认 destroy=true,会销毁 tileset) + */ +const removeOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { + if (!viewer || viewer.isDestroyed()) return; + viewer.scene.primitives.remove(tileset); +}; + +// ==================== 裁切相关 ==================== + +/** + * 规范化 GeoJSON 输入,提取纯 Geometry + * 兼容 Feature / FeatureCollection / Geometry + */ +const normalizeGeometry = (geo: any): any => { + if (!geo) return null; + // 已经是 Geometry 类型(有 type 且 coordinates) + if (geo.type && geo.coordinates) return geo; + // Feature → 提取 geometry + if (geo.type === 'Feature' && geo.geometry) return geo.geometry; + // FeatureCollection → 取第一个 feature 的 geometry + if (geo.type === 'FeatureCollection' && geo.features?.length) { + return normalizeGeometry(geo.features[0]); + } + return null; +}; + +const get_verts_core = (poly: any): Cesium.Cartesian3[] => { + const verts_carte3: Cesium.Cartesian3[] = []; + if (!poly) return verts_carte3; + + try { + // 规范化输入:兼容 Feature / FeatureCollection / Geometry + const geom = normalizeGeometry(poly); + if (!geom) return verts_carte3; + + let verts = turf.coordAll(geom); + const clockwiseRing = turf.booleanClockwise(turf.lineString(verts)); + if (clockwiseRing) { + verts = verts.reverse(); + } + for (let i = 0; i < verts.length - 1; i++) { + const vert = verts[i]; + verts_carte3.push(Cesium.Cartesian3.fromDegrees(vert[0], vert[1])); + } + } catch (e) { + console.warn('get_verts_core 解析 boundary 失败:', e); + } + return verts_carte3; +}; + +const get_clipping_planes = ( + points: Cesium.Cartesian3[] +): Cesium.ClippingPlane[] => { + const pointsLength = points.length; + const clippingPlanes: Cesium.ClippingPlane[] = []; + + for (let i = 0; i < pointsLength; ++i) { + const nextIndex = (i + 1) % pointsLength; + let midpoint = Cesium.Cartesian3.add( + points[i], + points[nextIndex], + new Cesium.Cartesian3() + ); + midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint); + + const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3()); + let right = Cesium.Cartesian3.subtract( + points[nextIndex], + midpoint, + new Cesium.Cartesian3() + ); + right = Cesium.Cartesian3.normalize(right, right); + + let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3()); + normal = Cesium.Cartesian3.normalize(normal, normal); + + const originCenteredPlane = new Cesium.Plane(normal, 0.0); + const distance = Cesium.Plane.getPointDistance( + originCenteredPlane, + midpoint + ); + + clippingPlanes.push(new Cesium.ClippingPlane(normal, distance)); + } + + return clippingPlanes; +}; + +const clipping_terrain = ( + viewer: Cesium.Viewer, + clippingPlanes: Cesium.ClippingPlane[] +) => { + const globe = viewer.scene.globe; + globe.clippingPlanes = new Cesium.ClippingPlaneCollection({ + planes: clippingPlanes, + edgeWidth: 0, + edgeColor: Cesium.Color.GREEN, + enabled: true + }); + globe.backFaceCulling = true; + globe.showSkirts = true; +}; + +const clipping_3dtiles = ( + clippingPlanes: Cesium.ClippingPlane[], + tileset: Cesium.Cesium3DTileset +) => { + // Cesium 1.141: root.transform 是内部属性,安全访问 + const rootTransform = (tileset as any)?.root?.transform; + if (!rootTransform) return; + const invtrans = Cesium.Matrix4.inverse(rootTransform, new Cesium.Matrix4()); + for (let i = 0; i < clippingPlanes.length; i++) { + clippingPlanes[i] = Cesium.Plane.transform(clippingPlanes[i], invtrans); + } + tileset.clippingPlanes = new Cesium.ClippingPlaneCollection({ + planes: clippingPlanes, + unionClippingRegions: true, + edgeWidth: 0, + edgeColor: Cesium.Color.RED, + enabled: false + }); +}; + +const Clip3DTile = (boundary: any, tileset: Cesium.Cesium3DTileset) => { + try { + const geom = normalizeGeometry(boundary); + if (!geom) return; + const buffered = turf.buffer(geom, 10, { units: 'meters' }); + const verts_core = get_verts_core(buffered).reverse(); + if (!verts_core.length) return; + const planes = get_clipping_planes(verts_core); + clipping_3dtiles(planes, tileset); + } catch (e) { + console.warn('Clip3DTile 裁切失败:', e); + } +}; + +const ClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + // Cesium 1.141: 安全访问 clippingPlanes 内部属性 _planes + const existingPlanes = (viewer.scene.globe.clippingPlanes as any)?._planes; + if ( + !osgbObj.clippingPlanes || + (existingPlanes && + !compareClippingPlanes(osgbObj.clippingPlanes, existingPlanes)) + ) { + const verts_core = get_verts_core(osgbObj.boundary); + if (!verts_core.length) return; + const planes = get_clipping_planes(verts_core); + clipping_terrain(viewer, planes); + osgbObj.clippingPlanes = planes; + } +}; + +const removeClip = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (osgbObj.clippingPlanes) { + removeClippingPlanes(viewer); + osgbObj.clippingPlanes = undefined; + } +}; + +const removeClippingPlanes = (viewer: Cesium.Viewer) => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) { + return; + } + if (Cesium.defined(viewer.scene.globe.clippingPlanes)) { + viewer.scene.globe.clippingPlanes.removeAll(); + } +}; + +const compareClippingPlanes = (planes1: any, planes2: any): boolean => { + let result = true; + if (planes1.length === planes2?.length) { + for (let index = 0; index < planes1.length; index++) { + if (planes1[index]._distance !== planes2[index]._distance) { + result = false; + break; + } + } + } else { + result = false; + } + return result; +}; + +const getMinDistanceOfOSGB = (viewer: Cesium.Viewer): number => { + let result = Infinity; + const length = viewer.scene.primitives.length; + for (let i = 0; i < length; i++) { + const p = viewer.scene.primitives.get(i); + // Cesium 1.141: _url 和 _distanceToCamera 是内部属性,安全访问 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if ((p as any)?._url) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const d = (p as any)?.root?._distanceToCamera; + if (d != null && d < result) result = d; + } + } + return result; +}; + +// ==================== 动态显隐 ==================== + +const dynamicSetVisible = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; + if (!Cesium.defined(osgbObj?.cartesian3)) return; + + let cameraPosition: Cesium.Cartesian3 | undefined; + if (viewer.trackedEntity) { + cameraPosition = viewer.trackedEntity.position?.getValue( + viewer.clock.currentTime + ); + } + if (!cameraPosition) { + cameraPosition = viewer.camera.position.clone(); + } + + const distance = Cesium.Cartesian3.distance( + osgbObj.cartesian3, + cameraPosition + ); + + if (distance < 12000) { + // 用户手动关闭了开关 → 不自动加载 + if (osgbObj._switchOff) return; + + // 匹配旧代码逻辑:osgbObj.osgbtitles 同步设置为 nonClassificationTileset 防重入 + // 新代码用 _loading + _loadId 实现同样的效果(因为 fromUrl 是异步的) + if (!osgbObj.osgbtitles && !osgbObj._loading) { + osgbObj._loading = true; + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + const loadId = osgbObj._loadId; + + const url = osgbObj.url.includes('?') + ? osgbObj.url + `&token=${getToken()}` + : osgbObj.url + `?token=${getToken()}`; + Cesium.Cesium3DTileset.fromUrl(url, { + maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, + show: true, + maximumMemoryUsage: 128 + }) + .then((tileset: Cesium.Cesium3DTileset) => { + // 竞态保护:版本号变了(removeQxsy 被调用或新一轮加载开始)→ 销毁退出 + if ( + osgbObj._loadId !== loadId || + !Cesium.defined(viewer) || + viewer.isDestroyed() + ) { + tileset.destroy(); + return; + } + osgbObj._loading = false; + if (!Cesium.defined(tileset)) return; + tileset.maximumScreenSpaceError = 32; + + // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) + if (osgbObj.height != 0) { + const bs = Cesium.Cartographic.fromCartesian( + tileset.boundingSphere.center + ); + const surface = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + 0.0 + ); + const offset = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + osgbObj.height + ); + const translation = Cesium.Cartesian3.subtract( + offset, + surface, + new Cesium.Cartesian3() + ); + tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + } + + addOSGB(viewer, tileset); + osgbObj.osgbtitles = tileset; + }) + .catch((e: Error) => { + osgbObj._loading = false; + console.log('dynamicSetVisible 加载倾斜摄影报错', e); + }); + } + } else if (distance > 13000) { + // 匹配旧代码逻辑:镜头拉远 → 销毁 tileset 释放内存 + if (osgbObj.osgbtitles) { + removeOSGB(viewer, osgbObj.osgbtitles); + osgbObj.osgbtitles = undefined; + } + // 不重置 _switchOff,开关状态由用户手动控制,不受距离影响 + } +}; + +// ==================== 地形动态裁切 ==================== + +const dynamicClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!osgbObj?.osgbtitles) { + removeClip(viewer, osgbObj); + return; + } + + // Cesium 1.141: root 和 _distanceToCamera 是内部属性,安全访问 + const root = (osgbObj.osgbtitles as any)?.root; + if (!Cesium.defined(root)) { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + return; + } + + if (!osgbObj?.osgbtitles?.show) { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + return; + } + + const distance = root._distanceToCamera; + const tilesLoaded = osgbObj.osgbtitles.tilesLoaded; + if (osgbObj.boundary && tilesLoaded) { + if (distance != null && getMinDistanceOfOSGB(viewer) === distance) { + ClipTerrain(viewer, osgbObj); + if ( + osgbObj.osgbtitles?.clippingPlanes && + !osgbObj.osgbtitles.clippingPlanes.enabled + ) { + osgbObj.osgbtitles.clippingPlanes.enabled = true; + } + } else { + removeClip(viewer, osgbObj); + if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { + osgbObj.osgbtitles.clippingPlanes.enabled = false; + } + } + } +}; + +// ==================== 公开 API ==================== + +/** + * 加载倾斜摄影 3D Tileset 模型 + * + * Cesium 1.141 中必须使用 Cesium3DTileset.fromUrl() 静态方法, + * new Cesium3DTileset({url}) 不会触发网络请求。 + */ +export const LoadOSGB = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + if (!osgbObj.url) return; + + // 已加载则跳过 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) return; + + // 正在加载中也跳过(防止重复调用 fromUrl) + if (osgbObj._loading) return; + osgbObj._loading = true; + + // 自增版本号:每次 LoadOSGB 都 +1,.then() 里靠版本号判断是否已失效 + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + const loadId = osgbObj._loadId; + + const url = osgbObj.url.includes('?') + ? osgbObj.url + `&token=${getToken()}` + : osgbObj.url + `?token=${getToken()}`; + + Cesium.Cesium3DTileset.fromUrl(url, { + maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, + show: true, + maximumMemoryUsage: 128 + }) + .then((tileset: Cesium.Cesium3DTileset) => { + // 竞态保护:版本号变了 → 销毁退出 + if ( + osgbObj._loadId !== loadId || + !Cesium.defined(viewer) || + viewer.isDestroyed() + ) { + tileset.destroy(); + return; + } + if (!Cesium.defined(tileset)) return; + + osgbObj._loading = false; + tileset.maximumScreenSpaceError = 32; + + // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) + if (osgbObj.height != 0) { + const bs = Cesium.Cartographic.fromCartesian( + tileset.boundingSphere.center + ); + const surface = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + 0.0 + ); + const offset = Cesium.Cartesian3.fromRadians( + bs.longitude, + bs.latitude, + osgbObj.height + ); + const translation = Cesium.Cartesian3.subtract( + offset, + surface, + new Cesium.Cartesian3() + ); + tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); + } + + // 加入场景(匹配旧代码 readyPromise 中 addOSGB) + addOSGB(viewer, tileset); + osgbObj.osgbtitles = tileset; + + // 始终设置 cartesian3,保证 dynamicSetVisible 能计算距离 + osgbObj.cartesian3 = tileset.boundingSphere.center.clone(); + + // boundary 裁切(匹配旧代码 readyPromise 中处理) + if (osgbObj.boundary) { + if (typeof osgbObj.boundary === 'string') { + osgbObj.boundary = JSON.parse(osgbObj.boundary); + } + Clip3DTile(osgbObj.boundary, tileset); + } + + // 注册 postRender 动态显隐(300ms 节流,匹配旧代码 throttle) + let lastTime = 0; + osgbObj.eventListener = viewer.scene.postRender.addEventListener(() => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; + const now = performance.now(); + if (now - lastTime < 300) return; + lastTime = now; + + if (!getState(osgbObj).timelookat) { + dynamicSetVisible(viewer, osgbObj); + } + dynamicClipTerrain(viewer, osgbObj); + }); + }) + .catch((e: Error) => { + osgbObj._loading = false; + console.log('加载倾斜摄影报错', e); + }); +}; + +/** + * 卸载倾斜摄影模型(完全移除) + * 仅在切换 2D 等场景调用,平时开关节用 osgbChangeClick 做显隐 + * 匹配旧代码 removeqxsy(osgbTool.ts:233-244):不清理 cartesian3 + */ +export const removeQxsy = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + // 递增版本号:使所有进行中的 fromUrl().then() 失效 + osgbObj._loadId = (osgbObj._loadId || 0) + 1; + removeClippingPlanes(viewer); + osgbObj.clippingPlanes = undefined; + osgbObj._loading = false; + osgbObj._switchOff = undefined; + + if (typeof osgbObj.eventListener === 'function') { + osgbObj.eventListener(); + osgbObj.eventListener = undefined; + } + + if (osgbObj.osgbtitles) { + removeOSGB(viewer, osgbObj.osgbtitles); + osgbObj.osgbtitles = undefined; + } + // 注意:不清理 cartesian3,匹配旧代码行为 +}; + +/** + * 倾斜摄影显隐切换 + * - 开关状态全局记录,不受距离影响 + * - 12km 以内:执行实际的显隐/加载操作 + * - 12km 以外:仅记录状态,不做 tileset 操作(tileset 不存在或已销毁) + * - 仅切换 2D 时才通过 removeQxsy 真正销毁 + */ +export const osgbChangeClick = ( + viewer: Cesium.Viewer, + osgbObj: OSGBItem, + checked: boolean +) => { + // 先记录开关状态(无论距离远近) + osgbObj._switchOff = !checked; + + // 12km 以外:只记状态不操作 tileset(此时 tileset 可能不存在或已销毁) + if (osgbObj.cartesian3) { + const cameraPosition = viewer.camera.position.clone(); + const distance = Cesium.Cartesian3.distance( + osgbObj.cartesian3, + cameraPosition + ); + if (distance >= 12000) return; + } + + if (checked) { + // 开关 ON:已有未销毁的 tileset → 直接显示;否则加载 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { + osgbObj.osgbtitles.show = true; + } else { + LoadOSGB(viewer, osgbObj); + } + } else { + // 开关 OFF:隐藏 tileset,移除 terrain 裁切 + if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { + osgbObj.osgbtitles.show = false; + } + removeClip(viewer, osgbObj); + } +}; + +/** + * 解析 location 字段为结构化定位信息 + */ +const parseLocation = (location: any): OSGBLocation | null => { + if (!location) return null; + + // 如果已经是对象,直接用 + if (typeof location === 'object' && location.destination) { + return location as OSGBLocation; + } + + // 如果是字符串,尝试解析 + if (typeof location === 'string') { + try { + const jsonString = location.replace(/\n/g, ''); + const startIndex = jsonString.indexOf('{'); + const endIndex = jsonString.lastIndexOf('}'); + if (startIndex === -1 || endIndex === -1) return null; + const extractedData = jsonString.substring(startIndex, endIndex + 1); + const parsed = eval('(' + extractedData + ')'); + return { + destination: parsed.destination, + orientation: parsed.orientation, + center: parsed.center + }; + } catch { + return null; + } + } + + return null; +}; + +/** + * 飞行定位到倾斜摄影模型 + * 包含 flyTo + 到达后旋转动画 + */ +export const osgbLocation = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { + const state = getState(osgbObj); + + clearTimeout(state.timeout); + state.num = 0; + state.time = 0; + state.witetime = 0; + + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + + let center = Cesium.Cartesian3.fromDegrees( + 100.271729604817, + 35.3107902811941, + 2800 + ); + let heading = Cesium.Math.toRadians(0.0); + const pitch = Cesium.Math.toRadians(-30.0); + const range = 2000.0; + + const locationInfor = parseLocation(osgbObj.location); + + if (!locationInfor) { + console.warn('该模型定位坐标未配置!'); + return; + } + + // 判断是经纬度还是笛卡尔坐标 + const destCoords = locationInfor.destination; + if (destCoords[0] <= 180 && destCoords[0] >= -180) { + state.destination = Cesium.Cartesian3.fromDegrees( + destCoords[0], + destCoords[1], + destCoords[2] + ); + } else { + state.destination = new Cesium.Cartesian3( + destCoords[0], + destCoords[1], + destCoords[2] + ); + } + + state.orientation = locationInfor.orientation; + center = Cesium.Cartesian3.fromDegrees( + locationInfor.center[0], + locationInfor.center[1], + locationInfor.center[2] + ); + + if (!state.destination || !state.orientation) return; + + viewer.camera.cancelFlight(); + viewer.camera.flyTo({ + destination: state.destination, + orientation: state.orientation, + complete: () => { + state.timeout = setTimeout(() => { + rotate(); + }, 2000); + } + }); + + const rotate = () => { + clearInterval(state.timelookat); + state.timelookat = setInterval(() => { + if (!Cesium.defined(viewer) || viewer.isDestroyed()) { + return; + } + state.witetime += 0.7; + if (state.witetime > 180 && state.witetime < 360) { + state.time += 0.7; + heading = Cesium.Math.toRadians(state.time); + viewer.camera.lookAt( + center, + new Cesium.HeadingPitchRange(heading, pitch, range) + ); + } else if (state.witetime > 360) { + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + clearInterval(state.timelookat); + state.timelookat = null; + viewer.camera.flyTo({ + destination: state.destination!, + orientation: state.orientation, + duration: 2 + }); + return; + } + }, 10); + }; + + // 点击 body 两次退出旋转 + const body = document.getElementsByTagName('body')[0]; + body.onclick = function () { + if (viewer && !viewer.isDestroyed() && viewer.camera) { + state.num = state.num + 1; + if (state.num > 1) { + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + clearInterval(state.timelookat); + clearTimeout(state.timeout); + state.timelookat = null; + } + } + }; +}; diff --git a/frontend-sjgl/src/components/pdf/pdfView.vue b/frontend-sjgl/src/components/pdf/pdfView.vue new file mode 100644 index 00000000..26059853 --- /dev/null +++ b/frontend-sjgl/src/components/pdf/pdfView.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/frontend-sjgl/src/components/previewMedia/index.vue b/frontend-sjgl/src/components/previewMedia/index.vue new file mode 100644 index 00000000..703c4d74 --- /dev/null +++ b/frontend-sjgl/src/components/previewMedia/index.vue @@ -0,0 +1,315 @@ + + + + diff --git a/frontend-sjgl/src/components/ylfbModal/index.vue b/frontend-sjgl/src/components/ylfbModal/index.vue new file mode 100644 index 00000000..0889ac06 --- /dev/null +++ b/frontend-sjgl/src/components/ylfbModal/index.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/frontend-sjgl/src/directive/index.ts b/frontend-sjgl/src/directive/index.ts new file mode 100644 index 00000000..a9663760 --- /dev/null +++ b/frontend-sjgl/src/directive/index.ts @@ -0,0 +1,2 @@ +export { hasPerm, hasRole } from './permission'; +export { deBounce } from './utils'; diff --git a/frontend-sjgl/src/directive/permission/index.ts b/frontend-sjgl/src/directive/permission/index.ts new file mode 100644 index 00000000..ce5fd9b4 --- /dev/null +++ b/frontend-sjgl/src/directive/permission/index.ts @@ -0,0 +1,83 @@ +import { useUserStoreHook } from '@/store/modules/user'; +import { Directive, DirectiveBinding } from 'vue'; + +/** + * 按钮权限校验 + */ +export const hasPerm: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + // 「超级管理员」拥有所有的按钮权限 + const { roles, perms } = useUserStoreHook(); + if (roles.includes('超级管理员')) { + return true; + } + // 「其他角色」按钮权限校验 + const { value } = binding; + if (value) { + const requiredPerms = value; // DOM绑定需要的按钮权限标识 + const hasPerm = perms?.some(perm => { + return requiredPerms.includes(perm); + }); + + if (!hasPerm) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error( + "need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"" + ); + } + } +}; + +/** + * 检查当前用户是否拥有指定权限 + * @param perms 权限标识数组,例如 ['sjtb:import-zip'] + * @returns boolean + */ +export function checkPerm(perms: string[]): boolean { + const userStore = useUserStoreHook(); + + // 1. 超级管理员拥有所有权限 + if (userStore.roles.includes('超级管理员')) { + return true; + } + + // 2. 校验普通权限 + // 只要用户拥有的权限列表中,包含传入列表中的任意一个,即返回 true + // 注意:原指令逻辑是 requiredPerms.includes(perm),即用户拥有的 perm 必须在要求列表中 + // 通常业务逻辑是:要求的权限列表中的某一个在用户拥有的权限列表中即可 + // 这里沿用你原指令的逻辑:requiredPerms (传入值) 包含 userPerms (用户拥有的) + + if (!perms || perms.length === 0) { + return false; + } + + const hasPermission = userStore.perms?.some(userPerm => { + return perms.includes(userPerm); + }); + + return !!hasPermission; +} +/** + * 角色权限校验 + */ +export const hasRole: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + const { value } = binding; + + if (value) { + const requiredRoles = value; // DOM绑定需要的角色编码 + const { roles } = useUserStoreHook(); + const hasRole = roles.some(perm => { + return requiredRoles.includes(perm); + }); + + if (!hasRole) { + el.parentNode && el.parentNode.removeChild(el); + } + } else { + throw new Error("need roles! Like v-has-role=\"['admin','test']\""); + } + } +}; diff --git a/frontend-sjgl/src/directive/utils/index.ts b/frontend-sjgl/src/directive/utils/index.ts new file mode 100644 index 00000000..9eeaef99 --- /dev/null +++ b/frontend-sjgl/src/directive/utils/index.ts @@ -0,0 +1,15 @@ +import { Directive } from 'vue'; + +/** + * 按钮防抖 + */ +export const deBounce:Directive = { + mounted(el:HTMLElement) { + el.addEventListener('click', () => { + el.classList.add('is-disabled') + setTimeout(() => { + el.classList.remove('is-disabled') + }, 2000) + }) + } +} diff --git a/frontend-sjgl/src/env.d.ts b/frontend-sjgl/src/env.d.ts new file mode 100644 index 00000000..bcddf3e8 --- /dev/null +++ b/frontend-sjgl/src/env.d.ts @@ -0,0 +1,19 @@ +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; +} + +// 环境变量 TypeScript的智能提示 +interface ImportMetaEnv { + VITE_APP_TITLE: string; + VITE_APP_PORT: string; + VITE_APP_BASE_API: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/frontend-sjgl/src/lang/en.ts b/frontend-sjgl/src/lang/en.ts new file mode 100644 index 00000000..63b4df79 --- /dev/null +++ b/frontend-sjgl/src/lang/en.ts @@ -0,0 +1,29 @@ +export default { + // 路由国际化 + route: { + dashboard: 'Dashboard', + document: 'Document' + }, + // 登录页面国际化 + login: { + title: 'Jingyi system', + username: 'Username', + rulesUsername: 'enter one user name', + password: 'Password', + rulesPassword: 'Please input a password', + rulesPasswordPlace: 'The password cannot be less than 6 digits', + login: 'Login', + code: 'Verification Code', + copyright: '', + icp: '', + thirdPartyLogin: 'third-party login', + remember: 'Remember password' + }, + // 导航栏国际化 + navbar: { + dashboard: 'Dashboard', + logout: 'Logout', + document: 'Document', + gitee: 'Gitee' + } +}; diff --git a/frontend-sjgl/src/lang/index.ts b/frontend-sjgl/src/lang/index.ts new file mode 100644 index 00000000..5ca3f653 --- /dev/null +++ b/frontend-sjgl/src/lang/index.ts @@ -0,0 +1,46 @@ +// 自定义国际化配置 +import { createI18n } from 'vue-i18n'; +import { localStorage } from '@/utils/localStorage'; + +// 本地语言包 +import enLocale from './en'; +import zhCnLocale from './zh-cn'; + +const messages = { + 'zh-cn': { + ...zhCnLocale + }, + en: { + ...enLocale + } +}; + +/** + * 获取当前系统使用语言字符串 + * + * @returns zh-cn|en ... + */ +export const getLanguage = () => { + // 本地缓存获取 + let language = localStorage.get('language'); + if (language) { + return language; + } + // 浏览器使用语言 + language = navigator.language.toLowerCase(); + const locales = Object.keys(messages); + for (const locale of locales) { + if (language.indexOf(locale) > -1) { + return locale; + } + } + return 'zh-cn'; +}; + +const i18n = createI18n({ + legacy: false, + locale: getLanguage(), + messages: messages +}); + +export default i18n; diff --git a/frontend-sjgl/src/lang/zh-cn.ts b/frontend-sjgl/src/lang/zh-cn.ts new file mode 100644 index 00000000..ba8be673 --- /dev/null +++ b/frontend-sjgl/src/lang/zh-cn.ts @@ -0,0 +1,29 @@ +export default { + // 路由国际化 + route: { + dashboard: '首页', + document: '项目文档' + }, + // 登录页面国际化 + login: { + title: '全过程数据管理子系统', + titleSjtb: '全过程数据管理子系统数据填报子系统', + username: '用户名', + rulesUsername: '用户账号/身份证号/手机号 不能为空', + password: '密码', + rulesPassword: '密码 不能为空', + rulesPasswordPlace: '密码不能少于6位', + login: '登 录', + code: '请输入验证码', + copyright: '', + icp: '', + thirdPartyLogin: '第三方登录', + remember: '记住密码' + }, + navbar: { + dashboard: '首页', + logout: '注销', + document: '项目文档', + gitee: '码云' + } +}; diff --git a/frontend-sjgl/src/layout/components/AppMain.vue b/frontend-sjgl/src/layout/components/AppMain.vue new file mode 100644 index 00000000..565d76b2 --- /dev/null +++ b/frontend-sjgl/src/layout/components/AppMain.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/frontend-sjgl/src/layout/components/Navbar.vue b/frontend-sjgl/src/layout/components/Navbar.vue new file mode 100644 index 00000000..c0111646 --- /dev/null +++ b/frontend-sjgl/src/layout/components/Navbar.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend-sjgl/src/layout/components/Sidebar/index.vue b/frontend-sjgl/src/layout/components/Sidebar/index.vue new file mode 100644 index 00000000..ac637235 --- /dev/null +++ b/frontend-sjgl/src/layout/components/Sidebar/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/frontend-sjgl/src/layout/components/changePassword.vue b/frontend-sjgl/src/layout/components/changePassword.vue new file mode 100644 index 00000000..0a38cb1a --- /dev/null +++ b/frontend-sjgl/src/layout/components/changePassword.vue @@ -0,0 +1,394 @@ + + + + + diff --git a/frontend-sjgl/src/layout/components/index.ts b/frontend-sjgl/src/layout/components/index.ts new file mode 100644 index 00000000..2f563531 --- /dev/null +++ b/frontend-sjgl/src/layout/components/index.ts @@ -0,0 +1,2 @@ +export { default as Navbar } from './Navbar.vue'; +export { default as AppMain } from './AppMain.vue'; diff --git a/frontend-sjgl/src/layout/index.vue b/frontend-sjgl/src/layout/index.vue new file mode 100644 index 00000000..4a2a5bbb --- /dev/null +++ b/frontend-sjgl/src/layout/index.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/frontend-sjgl/src/main.ts b/frontend-sjgl/src/main.ts new file mode 100644 index 00000000..8968d2b1 --- /dev/null +++ b/frontend-sjgl/src/main.ts @@ -0,0 +1,49 @@ +import { createApp, Directive } from 'vue'; +import App from './App.vue'; +import router from '@/router'; +import { setupStore } from '@/store'; + +import ElementPlus from 'element-plus'; +import * as ElementPlusIconsVue from '@element-plus/icons-vue'; +import Pagination from '@/components/Pagination/index.vue'; +import '@/permission'; + +import Antd from 'ant-design-vue'; +import 'ant-design-vue/dist/reset.css'; // Ant Design 全局样式重置 +import dayjs from 'dayjs'; // ant 中文语言 +import 'dayjs/locale/zh-cn'; +import 'virtual:svg-icons-register'; +// 3d地图 +import * as Cesium from 'cesium'; +import 'cesium/Build/Cesium/Widgets/widgets.css'; + +// 国际化 +import i18n from '@/lang/index'; + +import '@/styles/index.scss'; +import 'element-plus/theme-chalk/index.css'; + +const app = createApp(App); +// 自定义指令 +import * as directive from '@/directive'; +Object.keys(directive).forEach(key => { + app.directive(key, (directive as { [key: string]: Directive })[key]); +}); +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component); +} + +dayjs.locale('zh-cn'); +// 全局方法 +import { getDictionaries } from '@/api/dict'; +app.config.globalProperties.$getDictionaries = getDictionaries; + +// 全局挂载 +setupStore(app); +app + .component('Pagination', Pagination) + .use(router) + .use(ElementPlus) + .use(Antd) + .use(i18n) + .mount('#app'); diff --git a/frontend-sjgl/src/modules/jidiSelectorMod.vue b/frontend-sjgl/src/modules/jidiSelectorMod.vue new file mode 100644 index 00000000..7ec74a20 --- /dev/null +++ b/frontend-sjgl/src/modules/jidiSelectorMod.vue @@ -0,0 +1,110 @@ + + + + diff --git a/frontend-sjgl/src/modules/map/application/map-orchestrator.ts b/frontend-sjgl/src/modules/map/application/map-orchestrator.ts new file mode 100644 index 00000000..4c0ff19e --- /dev/null +++ b/frontend-sjgl/src/modules/map/application/map-orchestrator.ts @@ -0,0 +1,806 @@ +import { watch, type WatchStopHandle, ref } from 'vue'; +import { useRoute } from 'vue-router'; +import { unByKey } from 'ol/Observable'; +import dayjs from 'dayjs'; +import { MapClass } from '@/components/gis/map.class'; +import { getMapConfig, layerConfig2Flat } from '@/components/gis/gisUtils'; +import { useMapConfigStore } from '@/modules/map/stores/map-config.store'; +import { useMapDataStore } from '@/modules/map/stores/map-data.store'; +import { useMapViewStore } from '@/modules/map/stores/map-view.store'; +import { useMapStore } from '@/store/modules/map'; +import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; + +type InitializeOptions = { + container: HTMLElement; + popupContainer?: HTMLDivElement | null; + pageKey: string; +}; + +type LoadPageOptions = { + pageKey: string; + isInitialLoad?: boolean; +}; + +type ApplyLayerSelectionOptions = { + checkedKeys: string[]; + triggerKey?: string; + checked?: boolean; +}; +const SYSTEM_ID = 'qgc'; +const HYDRO_DYNAMIC_LAYER_KEYS = [ + 'dw_point', + 'stinfo_video_point', + 'stinfo_gjllz_point', + 'wt_point', + 'wq_ownWq_point', + 'wq_countryWq_point', + 'fp_point', + 'eq_point', + 'fb_point', + 'vp_point', + 'va_point', + 'sg_point' +]; +const ENG_POINT_LAYER_KEY = 'eng_point'; +const ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5; +const CESIUM_ZOOM_SYNC_DEBOUNCE_MS = 80; +const LARGE_ENG_LEGEND_PREFIX = 'large_eng_'; +const MID_ENG_LEGEND_PREFIX = 'mid_eng_'; + +export const useMapOrchestrator = () => { + const route = useRoute(); + const mapClass = MapClass.getInstance(); + const mapStore = useMapStore(); + const mapConfigStore = useMapConfigStore(); + const mapDataStore = useMapDataStore(); + const mapViewStore = useMapViewStore(); + const jidiSelectEventStore = useJidiSelectEventStore(); + let activePageLoadRequestId = 0; + let removeZoomListener: (() => void) | null = null; + let stopBaseSelectionWatch: WatchStopHandle | null = null; + const initializedBaseLayerKeys = new Set(); + const baseSelectionDebounceTimer = ref | null>( + null + ); + const zoomSyncDebounceTimer = ref | null>(null); + let latestHydroMenuGetter: (() => boolean) | null = null; + let currentMapType: '2D' | '3D' = '2D'; + let hydroMenuDefaultCheckedKeys = new Set(); + let hydroDynamicLayerSyncTask: { + visible: boolean; + promise: Promise; + } | null = null; + + // 备注:统一获取当前地图视图对象,避免在多个组件里重复兼容 2D/3D view 访问方式。 + const getCurrentView = () => { + return mapClass.view?.getView ? mapClass.view.getView() : mapClass.view; + }; + + // 备注:统一获取当前地图缩放级别,供页面切换和缩放监听复用。 + const getCurrentZoom = (): number | undefined => { + return mapClass.getCurrentZoom(); + }; + + const clearZoomSyncDebounceTimer = () => { + if (zoomSyncDebounceTimer.value) { + clearTimeout(zoomSyncDebounceTimer.value); + zoomSyncDebounceTimer.value = null; + } + }; + + // 备注:统一把当前页面中的 GIS 基础图层初始化到地图实例,避免在图层树组件里做配置解析和加层编排。 + const ensureBaseLayersInitialized = (configs: any[] = []) => { + const flatLayerConfigs = layerConfig2Flat(configs); + + flatLayerConfigs.forEach((item: any) => { + if (item.type !== 'GISMap' || !item.key) { + return; + } + + if (!item.config && item.paramJson) { + try { + const jsonObj = JSON.parse(item.paramJson); + item.config = getMapConfig(jsonObj); + } catch { + item.config = null; + } + } + + if (!item.config) { + return; + } + + if (item.key === 'customBaseLayer') { + const serializableBaseLayerConfig = { + key: item.config?.key, + id: item.config?.id, + name: item.config?.name, + type: item.config?.type, + url: item.config?.url, + url_3d: item.config?.url_3d, + layers: item.config?.layers, + rasteropacity: item.config?.rasteropacity + }; + sessionStorage.setItem( + 'customBaseLayer', + JSON.stringify(serializableBaseLayerConfig) + ); + } + + if (!initializedBaseLayerKeys.has(item.key)) { + mapClass.addBaseDataLayer(item.config, item.checked === 1); + initializedBaseLayerKeys.add(item.key); + } + + mapClass.controlBaseLayerTreeShowAndHidden( + item.key, + item.config?.id || item.key, + item.checked === 1 + ); + }); + }; + + // 备注:统一加载当前页面所需的图层配置、图例配置以及首批锚点数据。 + const loadPage = async ({ + pageKey, + isInitialLoad = false + }: LoadPageOptions) => { + let backgroundLoadStarted = false; + const pageLoadRequestId = ++activePageLoadRequestId; + + try { + mapDataStore.setLoading(true); + + const hasGlobalLegendConfig = + Array.isArray(mapConfigStore.legendConfigOriginal) && + mapConfigStore.legendConfigOriginal.length > 0; + const shouldLoadGlobalLegend = isInitialLoad && !hasGlobalLegendConfig; + const previousPageKey = mapConfigStore.lastLoadOptions?.pageKey || ''; + const previousCheckedKeys = mapViewStore.getCheckedLayerKeys(); + const moduleId = (route.meta?.moduleId as string) || ''; + const loadOptions = { + systemId: SYSTEM_ID, + moduleId, + pageKey, + description: 'true' + }; + const layerConfigPromise = + mapConfigStore.loadPageLayerConfig(loadOptions); + const legendConfigPromise = mapConfigStore.loadPageLegendConfig( + moduleId, + { + includeGlobal: shouldLoadGlobalLegend + } + ); + + // 同时等待两个 promise + const [{ layerConfig }, { legendOriginal, pageLegend }] = + await Promise.all([layerConfigPromise, legendConfigPromise]); + + if (pageLoadRequestId !== activePageLoadRequestId) { + return; + } + + // 先设置图层数据(更新 checkedLayerKeys),再设置图例数据 + if (layerConfig.length > 0) { + hydroMenuDefaultCheckedKeys = new Set( + mapConfigStore.extractCheckedLayerKeys(layerConfig) + ); + mapStore.setLayerData(layerConfig); + ensureBaseLayersInitialized(layerConfig); + + let checkedKeys = mapViewStore.getCheckedLayerKeys(); + if (previousPageKey === pageKey && previousCheckedKeys.length > 0) { + const getAllLayerKeys = (items: any[]): string[] => { + const keys: string[] = []; + const walk = (nodes: any[]) => { + nodes.forEach(item => { + if (item?.key) { + keys.push(item.key); + } + if (item?.children?.length > 0) { + walk(item.children); + } + }); + }; + walk(items); + return keys; + }; + const currentLayerKeys = new Set(getAllLayerKeys(layerConfig)); + const runtimeCheckedKeys = previousCheckedKeys.filter(key => + currentLayerKeys.has(key) + ); + if (runtimeCheckedKeys.length > 0) { + mapViewStore.setCheckedLayerKeys(runtimeCheckedKeys); + checkedKeys = runtimeCheckedKeys; + } + } + + // 设置图例数据(此时 checkedLayerKeys 已正确设置) + if (legendOriginal.length > 0) { + mapStore.setLegendData(legendOriginal, pageLegend); + } + + const activePageToken = mapStore.activatePageContext( + pageKey, + layerConfig + ); + await mapStore.updateLayerData(checkedKeys, true); + mapStore.setSelectedLegendData(); + const backgroundLoadPromise = isInitialLoad + ? mapStore.loadAllLayerData(layerConfig, checkedKeys, { + pageToken: activePageToken, + skipSessionCheck: true, + pageKey + }) + : mapStore.loadCurrentPageLayerData(layerConfig, checkedKeys, { + pageToken: activePageToken, + skipSessionCheck: true + }); + + void backgroundLoadPromise.catch(error => { + console.error(`页面锚点后台加载失败 [${pageKey}]`, error); + }); + backgroundLoadStarted = true; + } + } finally { + if ( + !backgroundLoadStarted && + pageLoadRequestId === activePageLoadRequestId + ) { + mapDataStore.setLoading(false); + } + } + }; + + // 备注:统一完成地图实例初始化和弹窗挂载,确保后续事件监听可以在图层数据加载前生效。 + const initializeMapShell = async ({ + container, + popupContainer + }: InitializeOptions) => { + await mapClass.init(container); + + if (popupContainer) { + const popupHost = container.parentElement; + if (popupHost && popupContainer.parentElement !== popupHost) { + popupHost.appendChild(popupContainer); + } + popupContainer.style.display = 'none'; + mapClass.initPopupOverlay(popupContainer); + } + }; + + const replayCurrentMapState = async ( + options: Pick & { + getIsHydroMenu: () => boolean; + } + ) => { + initializedBaseLayerKeys.clear(); + + const currentZoom = getCurrentZoom(); + if (currentZoom !== undefined) { + mapViewStore.setCurrentZoomLevel(currentZoom); + } + + if (options.popupContainer) { + const container = document.getElementById('mapContainer'); + const popupHost = container?.parentElement || null; + if (popupHost && options.popupContainer.parentElement !== popupHost) { + popupHost.appendChild(options.popupContainer); + } + options.popupContainer.style.display = 'none'; + mapClass.initPopupOverlay(options.popupContainer); + } + + ensureBaseLayersInitialized(mapStore.layerData || []); + + const checkedKeys = mapViewStore.getCheckedLayerKeys(); + await mapStore.updateLayerData(checkedKeys, true); + mapStore.setSelectedLegendData(); + await syncZoomSensitiveState({ + isHydroMenu: options.getIsHydroMenu(), + refreshEngPoint: true + }); + + const selectedBaseId = mapViewStore.selectedBaseId; + mapClass.jdPanelControlShowAndHidden( + selectedBaseId || 'all', + !!selectedBaseId + ); + + bindZoomListener(options.getIsHydroMenu); + }; + + // 备注:统一完成首屏页面配置加载,供挂载阶段和后续页面重载复用。 + const initialize = async ({ + container, + popupContainer, + pageKey + }: InitializeOptions) => { + await initializeMapShell({ + container, + popupContainer, + pageKey + }); + await loadPage({ pageKey, isInitialLoad: true }); + }; + + // 备注:统一绑定地图缩放监听,让页面组件只负责触发初始化,不再直接处理缩放联动细节。 + const bindZoomListener = (getIsHydroMenu: () => boolean) => { + if (removeZoomListener) { + removeZoomListener(); + removeZoomListener = null; + } + clearZoomSyncDebounceTimer(); + + const currentZoom = getCurrentZoom(); + if (currentZoom !== undefined) { + mapViewStore.setCurrentZoomLevel(currentZoom); + } + + const emitZoomChange = async () => { + const zoom = getCurrentZoom(); + if (zoom === undefined) return; + + await handleZoomLevelChange( + mapViewStore.currentZoomLevel, + zoom, + getIsHydroMenu() + ); + }; + + if (currentMapType === '3D') { + const removeCesiumListener = + mapClass.view?.camera?.changed?.addEventListener(() => { + clearZoomSyncDebounceTimer(); + zoomSyncDebounceTimer.value = setTimeout(() => { + zoomSyncDebounceTimer.value = null; + void emitZoomChange(); + }, CESIUM_ZOOM_SYNC_DEBOUNCE_MS); + }); + + if (typeof removeCesiumListener === 'function') { + removeZoomListener = () => { + clearZoomSyncDebounceTimer(); + removeCesiumListener(); + }; + } + return; + } + + const view = getCurrentView(); + if (!view?.on) return; + + const zoomListenerKey = view.on('change:resolution', () => { + void emitZoomChange(); + }); + removeZoomListener = () => { + unByKey(zoomListenerKey); + }; + }; + + // 备注:统一绑定基地切换事件,让页面组件不再直接 watch 外部基地选择源。 + const bindBaseSelection = () => { + if (stopBaseSelectionWatch) { + stopBaseSelectionWatch(); + stopBaseSelectionWatch = null; + } + + stopBaseSelectionWatch = watch( + () => jidiSelectEventStore.selectedItem?.wbsCode, + newWbsCode => { + if (!newWbsCode) { + changeBaseId(''); + return; + } + + if (baseSelectionDebounceTimer.value) { + clearTimeout(baseSelectionDebounceTimer.value); + } + + baseSelectionDebounceTimer.value = setTimeout(() => { + changeBaseId(newWbsCode); + baseSelectionDebounceTimer.value = null; + }, 100); + }, + { immediate: true } + ); + }; + + // 备注:统一挂载地图页面生命周期,初始化后自动接管缩放监听和基地切换监听。 + const mountView = async ( + options: InitializeOptions & { + getIsHydroMenu: () => boolean; + } + ) => { + currentMapType = '2D'; + latestHydroMenuGetter = options.getIsHydroMenu; + await initializeMapShell(options); + bindBaseSelection(); + bindZoomListener(options.getIsHydroMenu); + await loadPage({ pageKey: options.pageKey, isInitialLoad: true }); + await syncZoomSensitiveState({ + isHydroMenu: options.getIsHydroMenu(), + refreshEngPoint: true + }); + }; + + const switchMapType = async ( + type: '2D' | '3D', + options: Pick & { + getIsHydroMenu?: () => boolean; + } = {} + ) => { + const hydroMenuGetter = + options.getIsHydroMenu || latestHydroMenuGetter || (() => false); + latestHydroMenuGetter = hydroMenuGetter; + currentMapType = type; + + await mapClass.switchView(type); + await replayCurrentMapState({ + popupContainer: options.popupContainer, + getIsHydroMenu: hydroMenuGetter + }); + }; + + // 备注:统一处理菜单切换后的页面配置重载,供页面 watch 直接复用。 + const reloadPage = async (pageKey: string) => { + if (!pageKey) return; + await loadPage({ pageKey, isInitialLoad: false }); + }; + + // 备注:菜单切换前只隐藏旧页面当前可见点图层,底图保持连续显示,避免切换时闪烁。 + const hideCurrentVisibleLayers = () => { + const currentCheckedKeys = mapViewStore.getCheckedLayerKeys(); + + currentCheckedKeys.forEach(layerKey => { + const layerItem = mapStore.findLayerByKey(mapStore.layerData, layerKey); + if (!layerItem?.key) { + return; + } + + if (layerItem.type === 'pointMap') { + if (mapClass.hasLayer(layerItem.key)) { + mapClass.mdLayerTreeShowOrHidden(layerItem.key, false); + } + } + }); + }; + + // 备注:统一处理图层树勾选结果归一化和地图联动,供图层树组件复用。 + const applyLayerSelection = async ({ + checkedKeys, + triggerKey, + checked + }: ApplyLayerSelectionOptions) => { + const normalizedKeys = mapStore.normalizeCheckedLayerKeys( + checkedKeys, + triggerKey, + checked + ); + await mapStore.updateLayerData(normalizedKeys); + return normalizedKeys; + }; + + // 备注:统一确保指定动态图层完成数据预加载,避免缩放切换时重复在页面组件里拼装加载逻辑。 + const ensureDynamicLayersLoaded = async (layerKeys: string[] = []) => { + const layersToLoad = layerKeys + .map(layerKey => mapStore.findLayerByKey(mapStore.layerData, layerKey)) + .filter( + (layer: any) => layer?.url && !mapDataStore.hasPointLayerData(layer.key) + ); + + if (layersToLoad.length === 0) { + return; + } + + await Promise.all(layersToLoad.map(layer => mapStore.loadLayerData(layer))); + }; + + // 备注:统一控制水电开发菜单下的动态图层增删,避免页面组件直接操作加载和勾选细节。 + const syncHydroDynamicLayers = async (visible: boolean) => { + if ( + hydroDynamicLayerSyncTask && + hydroDynamicLayerSyncTask.visible === visible + ) { + return hydroDynamicLayerSyncTask.promise; + } + + const task = (async () => { + const currentCheckedKeys = mapViewStore.getCheckedLayerKeys(); + + if (visible) { + const layersToAdd = HYDRO_DYNAMIC_LAYER_KEYS.filter( + key => !currentCheckedKeys.includes(key) + ); + + if (layersToAdd.length === 0) { + return currentCheckedKeys; + } + + await ensureDynamicLayersLoaded(layersToAdd); + return applyLayerSelection({ + checkedKeys: [...currentCheckedKeys, ...layersToAdd] + }); + } + + const nextCheckedKeys = currentCheckedKeys.filter(key => { + if (!HYDRO_DYNAMIC_LAYER_KEYS.includes(key)) { + return true; + } + return hydroMenuDefaultCheckedKeys.has(key); + }); + + if (nextCheckedKeys.length === currentCheckedKeys.length) { + return currentCheckedKeys; + } + + return applyLayerSelection({ + checkedKeys: nextCheckedKeys + }); + })().finally(() => { + if (hydroDynamicLayerSyncTask?.promise === task) { + hydroDynamicLayerSyncTask = null; + } + }); + + hydroDynamicLayerSyncTask = { + visible, + promise: task + }; + return task; + }; + + // 备注:统一按当前缩放对齐首页菜单的中型站过滤和 12 级动态图层状态。 + const syncZoomSensitiveState = async ({ + isHydroMenu, + refreshEngPoint = false + }: { + isHydroMenu: boolean; + refreshEngPoint?: boolean; + }) => { + const currentZoom = getCurrentZoom(); + if (currentZoom !== undefined) { + mapViewStore.setCurrentZoomLevel(currentZoom); + } + + if ( + isHydroMenu && + refreshEngPoint && + mapViewStore.getCheckedLayerKeys().includes(ENG_POINT_LAYER_KEY) + ) { + mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); + } + + await syncHydroDynamicLayers( + !!isHydroMenu && currentZoom !== undefined && currentZoom >= 12 + ); + }; + + // 备注:统一处理地图缩放联动,收口水电开发菜单下的动态图层阈值切换逻辑。 + const handleZoomLevelChange = async ( + previousZoom: number, + currentZoom: number, + isHydroMenu: boolean + ) => { + mapViewStore.setCurrentZoomLevel(currentZoom); + + const crossedEngPointMediumThreshold = + (previousZoom <= ENG_POINT_MEDIUM_VISIBLE_ZOOM && + currentZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM) || + (previousZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM && + currentZoom <= ENG_POINT_MEDIUM_VISIBLE_ZOOM); + + if ( + isHydroMenu && + crossedEngPointMediumThreshold && + mapViewStore.getCheckedLayerKeys().includes(ENG_POINT_LAYER_KEY) + ) { + mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); + } + + if (!isHydroMenu) { + return; + } + + const oldZoomLevel = Math.floor(previousZoom); + const newZoomLevel = Math.floor(currentZoom); + + if (oldZoomLevel < 12 && newZoomLevel >= 12) { + await syncHydroDynamicLayers(true); + return; + } + + if (oldZoomLevel >= 12 && newZoomLevel < 12) { + await syncHydroDynamicLayers(false); + } + }; + + // 备注:统一处理菜单切换后的页面重载和动态图层收口,减少页面组件里的分支编排。 + const handlePageChange = (pageKey: string, isHydroMenu: boolean) => { + if (!pageKey) return Promise.resolve(); + + const previousPageKey = mapConfigStore.lastLoadOptions?.pageKey || ''; + if (previousPageKey && previousPageKey !== pageKey) { + hideCurrentVisibleLayers(); + mapViewStore.setCheckedLayerKeys([]); + mapStore.setSelectedLegendData(); + } + + return reloadPage(pageKey).then(async () => { + await syncZoomSensitiveState({ + isHydroMenu, + refreshEngPoint: true + }); + }); + }; + + // 备注:统一处理单个图层切换命令,供后续其他入口复用。 + const toggleLayer = async (layerKey: string, checked?: boolean) => { + const currentKeys = mapViewStore.getCheckedLayerKeys(); + const currentSet = new Set(currentKeys); + const nextChecked = + checked === undefined ? !currentSet.has(layerKey) : checked; + + if (nextChecked) { + currentSet.add(layerKey); + } else { + currentSet.delete(layerKey); + } + + return applyLayerSelection({ + checkedKeys: Array.from(currentSet), + triggerKey: layerKey, + checked: nextChecked + }); + }; + + // 备注:统一处理单个图例切换命令,供图例组件复用。 + const toggleLegend = (nameEn: string, checked?: number) => { + if (!nameEn) return; + console.log('toggleLegend', nameEn, checked); + console.log(mapViewStore.getLegendChecked(nameEn)); + const nextChecked = + checked === undefined + ? mapViewStore.getLegendChecked(nameEn) === 1 + ? 0 + : 1 + : checked; + console.log(nextChecked); + mapStore.updateLegendChecked(nameEn, nextChecked); + }; + + // 备注:统一处理批量图例切换命令,供容量筛选和分组图例复用。 + const toggleLegendBatch = (nameEns: string[] = [], checked: number) => { + const targetNameEns = nameEns.filter(Boolean); + if (targetNameEns.length === 0) return; + mapStore.updateLegendCheckedBatch(targetNameEns, checked); + }; + + // 备注:统一处理基地切换命令,同时驱动地图基地裁切联动。 + const changeBaseId = (baseId: string) => { + const nextBaseId = !baseId || baseId === 'all' ? '' : baseId; + mapViewStore.setSelectedBaseId(nextBaseId); + mapClass.jdPanelControlShowAndHidden( + baseId || 'all', + baseId !== 'all' && !!baseId + ); + }; + + // 备注:统一处理时间范围变更,并触发相关图层数据重载。 + const changeTimeRange = async (range: [any, any]) => { + mapViewStore.setSearchTimeRange(range); + await mapStore.reloadBySearchTimeRange(); + }; + + // 备注:统一处理装机容量筛选,让筛选器切换时同步更新 eng_point 图例运行态和点位显示。 + const changeEngPointCapacity = (capacityType?: string | null) => { + const legendItems = mapStore.getLegendItemsByLayerCode(ENG_POINT_LAYER_KEY); + if (!legendItems.length) return; + + const allEngLegendNames = legendItems + .map((item: any) => item?.nameEn) + .filter(Boolean); + + if (!allEngLegendNames.length) return; + + const normalizedCapacityType = capacityType || 'all'; + let activePrefixes = [LARGE_ENG_LEGEND_PREFIX, MID_ENG_LEGEND_PREFIX]; + + if (normalizedCapacityType === 'large_eng_built') { + activePrefixes = [LARGE_ENG_LEGEND_PREFIX]; + } else if (normalizedCapacityType === 'mid_eng_built') { + activePrefixes = [MID_ENG_LEGEND_PREFIX]; + } + + const visibleLegendNames = allEngLegendNames.filter((nameEn: string) => + activePrefixes.some(prefix => nameEn.startsWith(prefix)) + ); + const hiddenLegendNames = allEngLegendNames.filter( + (nameEn: string) => !visibleLegendNames.includes(nameEn) + ); + + mapStore.updateLegendCheckedBatch(hiddenLegendNames, 0); + mapStore.updateLegendCheckedBatch(visibleLegendNames, 1); + mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); + }; + + // 备注:统一重置地图筛选表单依赖的时间范围,供筛选组件在切页时复位默认输入。 + const resetFilterState = () => { + mapViewStore.setSearchTimeRange([dayjs().subtract(1, 'M'), dayjs()]); + }; + + // 备注:统一处理搜索定位,按点位编码从缓存数据中查找并飞行到目标位置。 + const focusPoint = ( + pointId: string, + zoom = 15, + fallbackPoints: any[] = [] + ) => { + if (!pointId) return; + const pointMatcher = (item: any) => { + return item.stcd === pointId || item._id === pointId; + }; + const targetPoint = + mapDataStore.pointData.find(pointMatcher) || + fallbackPoints.find(pointMatcher); + if (!targetPoint?.lgtd || !targetPoint?.lttd) return; + + const legendState = String(targetPoint?.anchoPointState || ''); + if (legendState && mapViewStore.getLegendChecked(legendState) !== 1) { + mapStore.updateLegendChecked(legendState, 1); + } + + const layerKey = String(targetPoint?.layerKey || ''); + if (layerKey && mapClass.hasLayer(layerKey)) { + mapClass.mdLayerTreeShowOrHidden(layerKey, true); + } + + mapClass.flyTopanto([targetPoint.lgtd, targetPoint.lttd], zoom); + }; + + // 备注:统一释放地图页面生命周期里注册的监听,避免页面卸载后残留联动。 + const unmountView = () => { + if (removeZoomListener) { + removeZoomListener(); + removeZoomListener = null; + } + clearZoomSyncDebounceTimer(); + + if (stopBaseSelectionWatch) { + stopBaseSelectionWatch(); + } + + if (baseSelectionDebounceTimer.value) { + clearTimeout(baseSelectionDebounceTimer.value); + baseSelectionDebounceTimer.value = null; + } + + latestHydroMenuGetter = null; + currentMapType = '2D'; + initializedBaseLayerKeys.clear(); + hydroMenuDefaultCheckedKeys.clear(); + }; + + return { + initialize, + mountView, + switchMapType, + unmountView, + loadPage, + reloadPage, + applyLayerSelection, + ensureDynamicLayersLoaded, + syncHydroDynamicLayers, + getCurrentZoom, + handleZoomLevelChange, + handlePageChange, + toggleLayer, + toggleLegend, + toggleLegendBatch, + changeBaseId, + changeTimeRange, + changeEngPointCapacity, + resetFilterState, + focusPoint + }; +}; diff --git a/frontend-sjgl/src/modules/map/domain/legend-deriver.ts b/frontend-sjgl/src/modules/map/domain/legend-deriver.ts new file mode 100644 index 00000000..c550f926 --- /dev/null +++ b/frontend-sjgl/src/modules/map/domain/legend-deriver.ts @@ -0,0 +1,147 @@ +type BuildLegendTreeOptions = { + items?: any[]; + selectedLayerCodes?: Set; + getLegendChecked: (nameEn?: string) => number; + normalizeLegendNameEn: (nameEn?: string) => string; +}; + +// 备注:统一把 checked 值规范为 0/1,避免运行态和原始配置态混用不同类型。 +export const normalizeLegendCheckedValue = ( + checked: any +): number | undefined => { + if (checked === null || checked === undefined || checked === '') { + return undefined; + } + + const numericChecked = Number(checked); + if (Number.isNaN(numericChecked)) { + return undefined; + } + + return numericChecked === 1 ? 1 : 0; +}; + +// 备注:收集图例树的叶子节点,供初始化图例运行态 checked 索引使用。 +export const collectLegendLeaves = (items: any[] = []): any[] => { + const leaves: any[] = []; + items.forEach(item => { + if (item?.childrenList?.length > 0) { + leaves.push(...collectLegendLeaves(item.childrenList)); + } else { + leaves.push(item); + } + }); + return leaves; +}; + +// 备注:根据原始图例配置生成图例运行态 checked 映射,避免后续重复递归取默认值。 +export const buildLegendCheckedState = ( + sourceData: any[] = [], + normalizeLegendNameEn: (nameEn?: string) => string +): Record => { + const nextState: Record = {}; + + collectLegendLeaves(sourceData).forEach(item => { + const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); + if (!normalizedNameEn) return; + + const fallbackChecked = normalizeLegendCheckedValue(item?.checked) ?? 0; + nextState[normalizedNameEn] = fallbackChecked; + }); + + return nextState; +}; + +// 备注:按当前选中图层和图例运行态生成可展示的图例树结构。 +export const buildLegendTree = ({ + items = [], + selectedLayerCodes, + getLegendChecked, + normalizeLegendNameEn +}: BuildLegendTreeOptions): any[] => { + const buildLegendNode = (item: any): any | null => { + if (item?.name === '地图') { + return null; + } + + if (item?.childrenList?.length > 0) { + const children = item.childrenList + .map((child: any) => buildLegendNode(child)) + .filter(Boolean); + + if (selectedLayerCodes && children.length === 0) { + return null; + } + + return { + ...item, + checked: children.some((child: any) => child.checked === 1) ? 1 : 0, + childrenList: children + }; + } + + if (item?.ifShow === 0) { + return null; + } + + if ( + selectedLayerCodes && + (!item?.layerCode || !selectedLayerCodes.has(item.layerCode)) + ) { + return null; + } + + const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); + return { + ...item, + nameEn: normalizedNameEn, + checked: getLegendChecked(normalizedNameEn) + }; + }; + + return items.map(item => buildLegendNode(item)).filter(Boolean); +}; + +// 备注:按名称从图例树中提取指定分组,供环保设施补充规则复用。 +export const pickLegendGroupByName = ( + items: any[] = [], + groupName: string +): any[] => { + return items.filter(item => item?.name === groupName); +}; + +// 备注:统一应用环保设施图例补充规则,避免在多个位置重复拼装同一组图例。 +export const applyEnvFacilityLegendRule = ( + legendItems: any[] = [], + layerKeys: string[] = [], + legendSource: any[] = [], + buildLegendItems: (items: any[]) => any[] +): any[] => { + const triggerKeys = [ + 'fp_point', + 'eq_point', + 'fb_point', + 'vp_point', + 'va_point', + 'sg_point', + 'dw_point' + ]; + const hasTriggerLayer = triggerKeys.some(key => layerKeys.includes(key)); + const withoutEnvFacility = legendItems.filter( + (item: any) => item.name !== '环保设施' + ); + + if (!hasTriggerLayer) { + return withoutEnvFacility; + } + + const envFacilityLegend = buildLegendItems( + pickLegendGroupByName(legendSource, '环保设施') + )[0]; + + if (!envFacilityLegend) { + return withoutEnvFacility; + } + + return [...withoutEnvFacility, envFacilityLegend]; +}; diff --git a/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts b/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts new file mode 100644 index 00000000..bd1ab375 --- /dev/null +++ b/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts @@ -0,0 +1,80 @@ +type ApplyLayerMutualExclusionRulesOptions = { + rawKeys?: string[]; + previousKeys?: string[]; + triggerKey?: string; + checked?: boolean; + getLayerBranchKeys?: (rootKey: string) => string[]; +}; + +// 备注:统一按当前业务规则收口图层互斥关系,返回归一化后的勾选结果。 +export const applyLayerMutualExclusionRules = ({ + rawKeys = [], + previousKeys = [], + triggerKey, + checked, + getLayerBranchKeys +}: ApplyLayerMutualExclusionRulesOptions): string[] => { + let normalizedKeys = Array.from(new Set(rawKeys.filter(Boolean))); + + const hasAny = (keys: string[]) => + keys.length > 0 && keys.some(key => normalizedKeys.includes(key)); + const hadAny = (keys: string[]) => + keys.length > 0 && keys.some(key => previousKeys.includes(key)); + const removeKeys = (keys: string[]) => { + if (keys.length === 0) return; + normalizedKeys = normalizedKeys.filter(key => !keys.includes(key)); + }; + + // 备注:统一处理两组图层的互斥关系,并优先保留当前触发的一组。 + const resolveConflict = ( + primaryKeys: string[], + secondaryKeys: string[], + preferredGroup: 'primary' | 'secondary' = 'primary' + ) => { + if (!hasAny(primaryKeys) || !hasAny(secondaryKeys)) { + return; + } + + if (triggerKey && checked !== false) { + if (primaryKeys.includes(triggerKey)) { + removeKeys(secondaryKeys); + return; + } + if (secondaryKeys.includes(triggerKey)) { + removeKeys(primaryKeys); + return; + } + } + + const primaryWasChecked = hadAny(primaryKeys); + const secondaryWasChecked = hadAny(secondaryKeys); + + if (primaryWasChecked && !secondaryWasChecked) { + removeKeys(secondaryKeys); + return; + } + if (!primaryWasChecked && secondaryWasChecked) { + removeKeys(primaryKeys); + return; + } + + if (preferredGroup === 'primary') { + removeKeys(secondaryKeys); + } else { + removeKeys(primaryKeys); + } + }; + + resolveConflict(['rare_fish_point'], ['fish_along_point'], 'primary'); + resolveConflict( + ['stinfo', 'stinfo_video_point'], + ['stinfo_ai_video_point'], + 'secondary' + ); + + const facilityKeys = getLayerBranchKeys?.('facilities') || []; + const facilityBuiltKeys = getLayerBranchKeys?.('facilities_built') || []; + resolveConflict(facilityKeys, facilityBuiltKeys, 'primary'); + + return normalizedKeys; +}; diff --git a/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts b/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts new file mode 100644 index 00000000..77d99e51 --- /dev/null +++ b/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts @@ -0,0 +1,418 @@ +export type NearbyPointDisplayMode = 'default' | 'replace' | 'expand'; + +export type NearbyPointAutoRule = { + distanceThresholdMeters: number; + replaceAtZoom: number; + expandAtZoom: number; + expandOffsetPx: number; + angleStepDeg: number; + minGroupSize: number; +}; + +export type NearbyPointLayoutRule = { + ringSize: number; + fanAngleForTwoDeg: number; + fanAngleForFourDeg: number; + fanAngleForManyDeg: number; + ringGapPx: number; + ringGapFactor: number; +}; + +export type NearbyPointDensityDisplayRule = { + minDensityValue: number; + minZoom: number; +}; + +export type NearbyPointConfig = { + autoRule: NearbyPointAutoRule; + layoutRule: NearbyPointLayoutRule; + densityDisplayRules: NearbyPointDensityDisplayRule[]; +}; + +export type NearbyPointRuntimeMeta = { + groupId: string; + displayName: string; + groupSize: number; + priority: number; + showZoomMin: number | null; + showZoomMax: number | null; + replaceAtZoom: number; + expandAtZoom: number; + expandOffsetPx: number; + expandAngleDeg: number; + displayMode: NearbyPointDisplayMode; +}; + +// 备注:近邻点统一调参入口。 +// 当前参数偏向“更容易成组、稍早进入替换与展开、展开位移更明显”, +// 方便抽吸效果在常用浏览层级更早被感知。 +export const DEFAULT_NEARBY_POINT_AUTO_RULE: NearbyPointAutoRule = { + distanceThresholdMeters: 9000, + replaceAtZoom: 10.5, + expandAtZoom: 12.2, + expandOffsetPx: 48, + angleStepDeg: 55, + minGroupSize: 2 +}; + +// 备注:展开布局统一调参入口。这里控制单圈数量、扇形角度和外圈扩散节奏。 +export const DEFAULT_NEARBY_POINT_LAYOUT_RULE: NearbyPointLayoutRule = { + ringSize: 5, + fanAngleForTwoDeg: 110, + fanAngleForFourDeg: 150, + fanAngleForManyDeg: 180, + ringGapPx: 22, + ringGapFactor: 0.85 +}; + +// 备注:密度分档显示规则。distance 越大表示越稀疏,越早参与显示候选。 +export const DEFAULT_NEARBY_POINT_DENSITY_DISPLAY_RULES: NearbyPointDensityDisplayRule[] = + [ + { + minDensityValue: 1500000, + minZoom: 0 + }, + { + minDensityValue: 800000, + minZoom: 0 + }, + { + minDensityValue: 400000, + minZoom: 0 + }, + { + minDensityValue: 50000, + minZoom: 2.0 + }, + { + minDensityValue: 0, + minZoom: 4.0 + } + ]; + +export const DEFAULT_NEARBY_POINT_CONFIG: NearbyPointConfig = { + autoRule: DEFAULT_NEARBY_POINT_AUTO_RULE, + layoutRule: DEFAULT_NEARBY_POINT_LAYOUT_RULE, + densityDisplayRules: DEFAULT_NEARBY_POINT_DENSITY_DISPLAY_RULES +}; + +export const getNearbyPointConfig = (): NearbyPointConfig => { + return DEFAULT_NEARBY_POINT_CONFIG; +}; + +export const getNearbyPointAutoRule = (): NearbyPointAutoRule => { + return getNearbyPointConfig().autoRule; +}; + +export const getNearbyPointLayoutRule = (): NearbyPointLayoutRule => { + return getNearbyPointConfig().layoutRule; +}; + +export const getNearbyPointDensityDisplayRules = + (): NearbyPointDensityDisplayRule[] => { + return getNearbyPointConfig().densityDisplayRules; + }; + +type GroupCandidate = { + index: number; + point: Record; + lon: number; + lat: number; + layerKey: string; +}; + +const isAlarmRangeLegendState = (legendState: string): boolean => { + return ( + legendState.startsWith('alarm_range_') || + legendState.startsWith('large_eng_built_alarm_range_') || + legendState.startsWith('mid_eng_built_alarm_range_') + ); +}; + +const getPointRenderPriority = (point: Record): number => { + const layerKey = String(point.layerKey || point.type || '').toLowerCase(); + const legendState = String(point.anchoPointState || '').trim().toLowerCase(); + + if ( + layerKey.includes('eng_alarm_point') || + layerKey.includes('alarm_range') || + isAlarmRangeLegendState(legendState) + ) { + return 300; + } + + if ( + layerKey.includes('eng_point') || + legendState.startsWith('large_eng_') || + legendState.startsWith('mid_eng_') + ) { + return 200; + } + + return 100; +}; + +const normalizeText = (value: unknown): string => { + return String(value ?? '') + .trim() + .replace(/[()()]/g, '') + .toLowerCase(); +}; + +const toFiniteNumber = (value: unknown): number | null => { + if (value === '' || value === null || value === undefined) { + return null; + } + const numericValue = Number(value); + return Number.isFinite(numericValue) ? numericValue : null; +}; + +const haversineDistanceMeters = ( + lon1: number, + lat1: number, + lon2: number, + lat2: number +): number => { + const toRad = (degree: number) => (degree * Math.PI) / 180; + const earthRadius = 6371000; + const dLat = toRad(lat2 - lat1); + const dLon = toRad(lon2 - lon1); + const lat1Rad = toRad(lat1); + const lat2Rad = toRad(lat2); + + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(lat1Rad) * + Math.cos(lat2Rad) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return earthRadius * c; +}; + +const clearNearbyPointRuntimeMeta = (point: Record) => { + delete point._nearbyRule; + delete point._nearbyGroupId; + delete point._nearbyDisplayName; + delete point._nearbyGroupSize; + delete point._nearbyPriority; + delete point._nearbyShowZoomMin; + delete point._nearbyShowZoomMax; + delete point._nearbyReplaceAtZoom; + delete point._nearbyExpandAtZoom; + delete point._nearbyExpandOffsetPx; + delete point._nearbyExpandAngleDeg; + delete point._nearbyDisplayMode; + delete point._nearbyIsPrimary; +}; + +const getPointDisplayName = (point: Record): string => { + return ( + point.titleName || point.stnm || point.ennm || point.stcd || point._id || '' + ); +}; + +const getPointStableIdentity = ( + point: Record, + index: number +): string => { + return normalizeText( + point.stcd || + point._id || + point.titleName || + point.stnm || + point.ennm || + `point_${index}` + ); +}; + +const getGroupSortKey = (candidate: GroupCandidate): string => { + return [ + getPointStableIdentity(candidate.point, candidate.index), + normalizeText(candidate.point.layerKey), + String(candidate.index).padStart(6, '0') + ].join('|'); +}; + +const compareGroupCandidates = ( + left: GroupCandidate, + right: GroupCandidate +): number => { + const leftRenderPriority = getPointRenderPriority(left.point); + const rightRenderPriority = getPointRenderPriority(right.point); + if (leftRenderPriority !== rightRenderPriority) { + return rightRenderPriority - leftRenderPriority; + } + + const leftDensityValue = toFiniteNumber(left.point.distance); + const rightDensityValue = toFiniteNumber(right.point.distance); + + if ( + leftDensityValue !== null && + rightDensityValue !== null && + leftDensityValue !== rightDensityValue + ) { + return rightDensityValue - leftDensityValue; + } + + if (leftDensityValue !== null || rightDensityValue !== null) { + return leftDensityValue !== null ? -1 : 1; + } + + return getGroupSortKey(left).localeCompare(getGroupSortKey(right)); +}; + +const buildRuntimeMeta = ( + groupId: string, + groupSize: number, + priority: number, + displayName: string, + rule: NearbyPointAutoRule +): NearbyPointRuntimeMeta => { + return { + groupId, + displayName, + groupSize, + priority, + showZoomMin: null, + showZoomMax: null, + replaceAtZoom: rule.replaceAtZoom, + expandAtZoom: rule.expandAtZoom, + expandOffsetPx: rule.expandOffsetPx, + expandAngleDeg: 0, + displayMode: 'default' + }; +}; + +const buildGroupCandidates = ( + points: Record[] = [] +): GroupCandidate[] => { + const candidates: GroupCandidate[] = []; + + points.forEach((point, index) => { + const lon = toFiniteNumber(point.lgtd); + const lat = toFiniteNumber(point.lttd); + if (lon === null || lat === null) { + clearNearbyPointRuntimeMeta(point); + return; + } + if (Math.abs(lon) > 180 || Math.abs(lat) > 90) { + clearNearbyPointRuntimeMeta(point); + return; + } + + candidates.push({ + index, + point, + lon, + lat, + layerKey: String(point.layerKey || '') + }); + }); + + return candidates; +}; + +const buildNearbyGroups = ( + candidates: GroupCandidate[], + rule: NearbyPointAutoRule +): GroupCandidate[][] => { + const result: GroupCandidate[][] = []; + const sortedCandidates = [...candidates].sort(compareGroupCandidates); + const consumedIndexes = new Set(); + + sortedCandidates.forEach((seedCandidate, seedIndex) => { + if (consumedIndexes.has(seedIndex)) { + return; + } + + const groupItems: GroupCandidate[] = [seedCandidate]; + const groupIndexes = [seedIndex]; + + for ( + let candidateIndex = seedIndex + 1; + candidateIndex < sortedCandidates.length; + candidateIndex += 1 + ) { + if (consumedIndexes.has(candidateIndex)) { + continue; + } + + const currentCandidate = sortedCandidates[candidateIndex]; + const distanceMeters = haversineDistanceMeters( + seedCandidate.lon, + seedCandidate.lat, + currentCandidate.lon, + currentCandidate.lat + ); + + if (distanceMeters <= rule.distanceThresholdMeters) { + groupItems.push(currentCandidate); + groupIndexes.push(candidateIndex); + } + } + + if (groupItems.length >= rule.minGroupSize) { + groupIndexes.forEach(index => consumedIndexes.add(index)); + result.push(groupItems); + } + }); + + return result; +}; + +// 备注:统一按空间距离自动识别近邻点组,不按名称或点类型分规则。 +export const attachNearbyPointRuntimeMeta = ( + points: Record[] = [], + rule: NearbyPointAutoRule = getNearbyPointAutoRule() +): Record[] => { + if (!Array.isArray(points) || points.length === 0) { + return []; + } + + points.forEach(point => clearNearbyPointRuntimeMeta(point)); + + const candidates = buildGroupCandidates(points); + if (candidates.length < rule.minGroupSize) { + return points; + } + const groupedCandidates = buildNearbyGroups(candidates, rule); + + let groupSeed = 0; + groupedCandidates.forEach(groupItems => { + if (groupItems.length < rule.minGroupSize) { + return; + } + + const sortedItems = [...groupItems].sort(compareGroupCandidates); + groupSeed += 1; + const groupId = `nearby-group-${groupSeed}`; + + sortedItems.forEach((candidate, orderIndex) => { + const priority = orderIndex + 1; + const runtimeMeta = buildRuntimeMeta( + groupId, + sortedItems.length, + priority, + getPointDisplayName(candidate.point), + rule + ); + + candidate.point._nearbyRule = runtimeMeta; + candidate.point._nearbyGroupId = runtimeMeta.groupId; + candidate.point._nearbyDisplayName = runtimeMeta.displayName; + candidate.point._nearbyGroupSize = runtimeMeta.groupSize; + candidate.point._nearbyPriority = runtimeMeta.priority; + candidate.point._nearbyShowZoomMin = runtimeMeta.showZoomMin; + candidate.point._nearbyShowZoomMax = runtimeMeta.showZoomMax; + candidate.point._nearbyReplaceAtZoom = runtimeMeta.replaceAtZoom; + candidate.point._nearbyExpandAtZoom = runtimeMeta.expandAtZoom; + candidate.point._nearbyExpandOffsetPx = runtimeMeta.expandOffsetPx; + candidate.point._nearbyExpandAngleDeg = runtimeMeta.expandAngleDeg; + candidate.point._nearbyDisplayMode = runtimeMeta.displayMode; + candidate.point._nearbyIsPrimary = runtimeMeta.priority === 1; + }); + }); + + return points; +}; diff --git a/frontend-sjgl/src/modules/map/stores/map-config.store.ts b/frontend-sjgl/src/modules/map/stores/map-config.store.ts new file mode 100644 index 00000000..248d5a00 --- /dev/null +++ b/frontend-sjgl/src/modules/map/stores/map-config.store.ts @@ -0,0 +1,251 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { getMapList, getModuleMapLegendList } from '@/api/map'; + +type MapConfigLoadOptions = { + systemId: string; + moduleId: string; + pageKey?: string; + description?: string; +}; + +type LegendConfigLoadOptions = { + includeGlobal?: boolean; +}; + +const cloneConfigData = (data: T): T => { + return JSON.parse(JSON.stringify(data)); +}; + +export const useMapConfigStore = defineStore('map-config', () => { + const layerConfigTree = ref([]); + const layerConfigByKey = ref>({}); + const legendConfigOriginal = ref([]); + const legendConfigByNameEn = ref>({}); + const legendConfigByLayerCode = ref>({}); + const pageLegendConfig = ref([]); + const configLoading = ref(false); + const legendLoading = ref(false); + const lastLoadOptions = ref(null); + + const normalizeLegendNameEn = (nameEn?: string): string => { + if (!nameEn) return ''; + return nameEn; + }; + + // 备注:重建图层配置索引,后续按 key 读取图层配置时不再全量递归。 + const rebuildLayerConfigIndex = (items: any[] = []) => { + const nextIndex: Record = {}; + + const walk = (nodes: any[] = []) => { + nodes.forEach(item => { + if (item?.key) { + nextIndex[item.key] = item; + } + if (item?.children?.length > 0) { + walk(item.children); + } + }); + }; + + walk(items); + layerConfigByKey.value = nextIndex; + }; + + // 备注:从图层配置中提取默认勾选项,作为页面初始化时的基础勾选状态。 + const extractCheckedLayerKeys = (items: any[] = []): string[] => { + const keys: string[] = []; + + const walk = (nodes: any[] = []) => { + nodes.forEach(item => { + if (Number(item?.checked) === 1 && item?.key) { + keys.push(item.key); + } + if (item?.children?.length > 0) { + walk(item.children); + } + }); + }; + + walk(items); + return keys; + }; + + // 备注:重建图例配置索引,分别支持按 nameEn 和 layerCode 查询图例配置。 + const rebuildLegendConfigIndexes = (items: any[] = []) => { + const nextNameEnMap: Record = {}; + const nextLayerCodeMap: Record = {}; + + const walk = (nodes: any[] = []) => { + nodes.forEach(item => { + if (item?.childrenList?.length > 0) { + walk(item.childrenList); + return; + } + + const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); + if (normalizedNameEn) { + nextNameEnMap[normalizedNameEn] = item; + } + + if (item?.layerCode) { + if (!nextLayerCodeMap[item.layerCode]) { + nextLayerCodeMap[item.layerCode] = []; + } + nextLayerCodeMap[item.layerCode].push(item); + } + }); + }; + + walk(items); + legendConfigByNameEn.value = nextNameEnMap; + legendConfigByLayerCode.value = nextLayerCodeMap; + }; + + // 备注:设置图层树配置,并同步初始化图层索引与默认勾选状态。 + const setLayerConfigTree = (data: any[] = []) => { + const nextData = cloneConfigData(data); + layerConfigTree.value = nextData; + rebuildLayerConfigIndex(nextData); + }; + + // 备注:设置全量原始图例配置,并同步构建图例索引。 + const setLegendConfigOriginal = (data: any[] = []) => { + const nextData = cloneConfigData(data); + legendConfigOriginal.value = nextData; + rebuildLegendConfigIndexes(nextData); + }; + + // 备注:设置页面级图例配置,仅保留后端返回的页面图例结构,不在这里做运行态加工。 + const setPageLegendConfig = (data: any[] = []) => { + pageLegendConfig.value = cloneConfigData(data); + }; + + // 备注:按图层 key 获取图层配置,供后续编排层和运行态 store 复用。 + const getLayerConfigByKey = (layerKey: string) => { + return layerConfigByKey.value[layerKey]; + }; + + // 备注:按图层 layerCode 获取原始图例项列表,供图层勾选后派生图例使用。 + const getLegendConfigByLayerCode = (layerCode: string): any[] => { + return legendConfigByLayerCode.value[layerCode] || []; + }; + + // 备注:按图例 nameEn 获取原始图例项,供运行态读取默认 checked 配置。 + const getLegendConfigByNameEn = (nameEn: string) => { + const normalizedNameEn = normalizeLegendNameEn(nameEn); + return legendConfigByNameEn.value[normalizedNameEn]; + }; + + // 备注:统一清理配置 store,便于菜单切换或地图销毁后重置配置状态。 + const clearConfigState = () => { + layerConfigTree.value = []; + layerConfigByKey.value = {}; + legendConfigOriginal.value = []; + legendConfigByNameEn.value = {}; + legendConfigByLayerCode.value = {}; + pageLegendConfig.value = []; + configLoading.value = false; + legendLoading.value = false; + lastLoadOptions.value = null; + }; + + const loadPageLayerConfig = async (options: MapConfigLoadOptions) => { + configLoading.value = true; + lastLoadOptions.value = { ...options }; + + try { + const layerRes = await getMapList({ + systemId: options.systemId, + moduleId: options.moduleId, + description: options.description ?? 'true' + }); + + const layerConfig = layerRes?.data?.mapLayerVos || []; + setLayerConfigTree(layerConfig); + return { + layerConfig + }; + } finally { + configLoading.value = false; + } + }; + + const loadPageLegendConfig = async ( + pageKey?: string, + options: LegendConfigLoadOptions = {} + ) => { + legendLoading.value = true; + + try { + const includeGlobal = options.includeGlobal !== false; + + let legendOriginal = legendConfigOriginal.value || []; + let pageLegend: any[] = []; + + if (includeGlobal) { + const [legendAllRes, legendPageRes] = await Promise.all([ + getModuleMapLegendList(), + getModuleMapLegendList(pageKey ? { moduleId: pageKey } : undefined) + ]); + + legendOriginal = legendAllRes?.data || []; + pageLegend = legendPageRes?.data || []; + } else { + const legendPageRes = await getModuleMapLegendList( + pageKey ? { moduleId: pageKey } : undefined + ); + pageLegend = legendPageRes?.data || []; + } + + setLegendConfigOriginal(legendOriginal); + setPageLegendConfig(pageLegend); + + return { + legendOriginal, + pageLegend + }; + } finally { + legendLoading.value = false; + } + }; + + // 备注:加载页面地图配置,只负责请求和保存配置数据,不处理锚点或地图渲染逻辑。 + const loadPageMapConfig = async (options: MapConfigLoadOptions) => { + const [{ layerConfig }, { legendOriginal, pageLegend }] = await Promise.all( + [loadPageLayerConfig(options), loadPageLegendConfig(options.pageKey)] + ); + + return { + layerConfig, + legendOriginal, + pageLegend + }; + }; + + return { + layerConfigTree, + layerConfigByKey, + legendConfigOriginal, + legendConfigByNameEn, + legendConfigByLayerCode, + pageLegendConfig, + configLoading, + legendLoading, + lastLoadOptions, + normalizeLegendNameEn, + rebuildLayerConfigIndex, + extractCheckedLayerKeys, + rebuildLegendConfigIndexes, + setLayerConfigTree, + setLegendConfigOriginal, + setPageLegendConfig, + getLayerConfigByKey, + getLegendConfigByLayerCode, + getLegendConfigByNameEn, + clearConfigState, + loadPageLayerConfig, + loadPageLegendConfig, + loadPageMapConfig + }; +}); diff --git a/frontend-sjgl/src/modules/map/stores/map-data.store.ts b/frontend-sjgl/src/modules/map/stores/map-data.store.ts new file mode 100644 index 00000000..1ec9658b --- /dev/null +++ b/frontend-sjgl/src/modules/map/stores/map-data.store.ts @@ -0,0 +1,192 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + +type PointLayerCacheItem = { + checked: boolean; + data: any[]; + cacheKey?: string; +}; + +type LayerLoadStatus = { + loading: boolean; + loaded: boolean; + error: string | null; +}; + +export const useMapDataStore = defineStore('map-data', () => { + const pointData = ref([]); + const pointDataCache = ref>({}); + const layerLoadState = ref>({}); + const loading = ref(true); + + // 备注:统一设置地图模块整体 loading 状态,供图例和筛选组件复用。 + const setLoading = (value: boolean) => { + loading.value = value; + }; + + // 备注:整体清空锚点合并数据,通常用于菜单切换或重新初始化。 + const clearPointData = () => { + pointData.value = []; + }; + + // 备注:直接覆盖锚点合并数据,供地图加载完成后统一回写。 + const setPointData = (data: any[] = []) => { + pointData.value = data; + }; + + // 备注:读取指定图层缓存,供地图渲染逻辑优先命中缓存数据。 + const getPointLayerCache = (layerKey: string) => { + return pointDataCache.value[layerKey]; + }; + + // 备注:判断单个图层缓存是否与当前请求条件匹配,避免旧筛选结果直接复用。 + const hasValidPointLayerCache = (layerKey: string, cacheKey: string) => { + const cache = getPointLayerCache(layerKey); + if (!cache || !cacheKey) return false; + return cache.cacheKey === cacheKey && cache.data.length > 0; + }; + + // 备注:读取单个图层的缓存数据数组,未命中时返回空数组,简化外层判空逻辑。 + const getPointLayerData = (layerKey: string): any[] => { + return pointDataCache.value[layerKey]?.data || []; + }; + + // 备注:判断单个图层缓存是否已具备可用数据,供加载和显隐逻辑快速分支。 + const hasPointLayerData = (layerKey: string): boolean => { + return getPointLayerData(layerKey).length > 0; + }; + + // 备注:写入单个图层的锚点缓存,并保留当前是否勾选的状态。 + const setPointLayerCache = (layerKey: string, cache: PointLayerCacheItem) => { + if (!layerKey) return; + pointDataCache.value[layerKey] = cache; + }; + + // 备注:只更新缓存中的勾选状态,避免重复覆盖整份锚点数据。 + const setPointLayerCacheChecked = (layerKey: string, checked: boolean) => { + const cache = pointDataCache.value[layerKey]; + if (!cache) return; + setPointLayerCache(layerKey, { + ...cache, + checked + }); + }; + + // 备注:删除指定图层缓存,供时间筛选重载和图层强制刷新使用。 + const removePointLayerCache = (layerKey: string) => { + if (!pointDataCache.value[layerKey]) return; + const nextCache = { ...pointDataCache.value }; + delete nextCache[layerKey]; + pointDataCache.value = nextCache; + }; + + // 备注:清空全部图层缓存,供页面切换或地图销毁时复用。 + const clearPointLayerCache = () => { + pointDataCache.value = {}; + }; + + // 备注:根据当前缓存重建合并锚点数据,避免在多个地方手写拼装逻辑。 + const rebuildPointDataFromCache = (layerKeys: string[] = []) => { + const targetLayerKeys = + layerKeys.length > 0 ? layerKeys : Object.keys(pointDataCache.value); + const allPointData: any[] = []; + + targetLayerKeys.forEach(layerKey => { + const cache = pointDataCache.value[layerKey]; + if (!cache?.data?.length) return; + + cache.data.forEach((point: any) => { + if (point?.layerKey !== layerKey) { + point.layerKey = layerKey; + } + allPointData.push(point); + }); + }); + + pointData.value = allPointData; + return allPointData; + }; + + // 备注:统一初始化单个图层的加载状态,避免外层重复判空。 + const ensureLayerLoadState = (layerKey: string): LayerLoadStatus => { + if (!layerLoadState.value[layerKey]) { + layerLoadState.value[layerKey] = { + loading: false, + loaded: false, + error: null + }; + } + return layerLoadState.value[layerKey]; + }; + + // 备注:标记单个图层进入加载中状态。 + const setLayerLoading = (layerKey: string) => { + const current = ensureLayerLoadState(layerKey); + layerLoadState.value[layerKey] = { + ...current, + loading: true, + error: null + }; + }; + + // 备注:标记单个图层加载成功,供后续判断是否已完成首次加载。 + const setLayerLoaded = (layerKey: string) => { + const current = ensureLayerLoadState(layerKey); + layerLoadState.value[layerKey] = { + ...current, + loading: false, + loaded: true, + error: null + }; + }; + + // 备注:标记单个图层加载失败,并记录错误信息。 + const setLayerLoadError = (layerKey: string, error: unknown) => { + const current = ensureLayerLoadState(layerKey); + layerLoadState.value[layerKey] = { + ...current, + loading: false, + loaded: false, + error: error instanceof Error ? error.message : String(error) + }; + }; + + // 备注:清理指定图层的加载状态,供重载场景复用。 + const clearLayerLoadState = (layerKey: string) => { + if (!layerLoadState.value[layerKey]) return; + delete layerLoadState.value[layerKey]; + }; + + // 备注:整体重置数据缓存 store,供菜单切换或地图销毁时调用。 + const resetDataState = () => { + pointData.value = []; + pointDataCache.value = {}; + layerLoadState.value = {}; + loading.value = true; + }; + + return { + pointData, + pointDataCache, + layerLoadState, + loading, + setLoading, + clearPointData, + setPointData, + getPointLayerCache, + hasValidPointLayerCache, + getPointLayerData, + hasPointLayerData, + setPointLayerCache, + setPointLayerCacheChecked, + removePointLayerCache, + clearPointLayerCache, + rebuildPointDataFromCache, + ensureLayerLoadState, + setLayerLoading, + setLayerLoaded, + setLayerLoadError, + clearLayerLoadState, + resetDataState + }; +}); diff --git a/frontend-sjgl/src/modules/map/stores/map-view.store.ts b/frontend-sjgl/src/modules/map/stores/map-view.store.ts new file mode 100644 index 00000000..c0c80452 --- /dev/null +++ b/frontend-sjgl/src/modules/map/stores/map-view.store.ts @@ -0,0 +1,92 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import dayjs from 'dayjs'; + +export const useMapViewStore = defineStore('map-view', () => { + const checkedLayerKeys = ref([]); + const legendCheckedState = ref>({}); + const searchTimeRange = ref<[any, any]>([dayjs().subtract(1, 'M'), dayjs()]); + const selectedBaseId = ref(''); + const currentZoomLevel = ref(4.5); + + // 备注:统一写入当前选中的图层 key,始终保持去重后的结果。 + const setCheckedLayerKeys = (keys: string[] = []) => { + checkedLayerKeys.value = Array.from(new Set(keys.filter(Boolean))); + }; + + // 备注:获取当前选中的图层 key,供图层树、动态图层和筛选联动复用。 + const getCheckedLayerKeys = (): string[] => { + return checkedLayerKeys.value; + }; + + // 备注:覆盖写入完整图例运行态勾选状态,适合图例初始化和整批替换。 + const setLegendCheckedState = (state: Record = {}) => { + legendCheckedState.value = { ...state }; + }; + + // 备注:写入单个图例运行态勾选状态,供点击图例项时复用。 + const setLegendChecked = (nameEn: string, checked: number) => { + if (!nameEn) return; + legendCheckedState.value = { + ...legendCheckedState.value, + [nameEn]: checked + }; + }; + + // 备注:批量写入多个图例运行态勾选状态,供分组图例和筛选联动复用。 + const setLegendCheckedBatch = ( + stateMap: Record = {} + ) => { + legendCheckedState.value = { + ...legendCheckedState.value, + ...stateMap + }; + }; + + // 备注:获取单个图例当前运行态勾选状态,未命中时默认返回 0。 + const getLegendChecked = (nameEn: string): number => { + return legendCheckedState.value[nameEn] ?? 0; + }; + + // 备注:统一更新当前时间筛选范围,供筛选组件和地图数据重载复用。 + const setSearchTimeRange = (range: [any, any]) => { + searchTimeRange.value = range; + }; + + // 备注:统一更新当前基地 ID,供地图筛选和基地联动复用。 + const setSelectedBaseId = (baseId: string) => { + selectedBaseId.value = baseId || ''; + }; + + // 备注:统一更新当前地图缩放级别,供动态图层联动复用。 + const setCurrentZoomLevel = (zoom: number) => { + currentZoomLevel.value = zoom; + }; + + // 备注:在菜单切换或地图销毁时重置运行态到默认值。 + const resetViewState = () => { + checkedLayerKeys.value = []; + legendCheckedState.value = {}; + searchTimeRange.value = [dayjs().subtract(1, 'M'), dayjs()]; + selectedBaseId.value = ''; + currentZoomLevel.value = 4.5; + }; + + return { + checkedLayerKeys, + legendCheckedState, + searchTimeRange, + selectedBaseId, + currentZoomLevel, + setCheckedLayerKeys, + getCheckedLayerKeys, + setLegendCheckedState, + setLegendChecked, + setLegendCheckedBatch, + getLegendChecked, + setSearchTimeRange, + setSelectedBaseId, + setCurrentZoomLevel, + resetViewState + }; +}); diff --git a/frontend-sjgl/src/permission.ts b/frontend-sjgl/src/permission.ts new file mode 100644 index 00000000..9cffa7d9 --- /dev/null +++ b/frontend-sjgl/src/permission.ts @@ -0,0 +1,135 @@ +import router from '@/router'; +import { RouteRecordRaw } from 'vue-router'; +import { useUserStoreHook } from '@/store/modules/user'; +import { usePermissionStoreHook } from '@/store/modules/permission'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; +NProgress.configure({ showSpinner: false }); + +const permissionStore = usePermissionStoreHook(); + +// 白名单路由 +const whiteList = ['/login', '/register']; //login + +// ✅ 新增:递归标准化路由路径,确保所有 path 以 '/' 开头 +function normalizeRoutes(routes: any[]): any[] { + return routes.map(route => { + // 创建副本以避免直接修改原始数据(可选,视具体需求而定) + const normalizedRoute = { ...route }; + + // 修正当前路由的 path + if (normalizedRoute.path && !normalizedRoute.path.startsWith('/')) { + normalizedRoute.path = `/${normalizedRoute.path}`; + } + + // 递归修正子路由 + if (normalizedRoute.children && normalizedRoute.children.length > 0) { + normalizedRoute.children = normalizeRoutes(normalizedRoute.children); + } + + return normalizedRoute; + }); +} + +// 查找第一个可用路由 +function findFirstAvailableRoute(routes: any[]): string | undefined { + for (const route of routes) { + if (route.meta?.hidden) continue; + + if (route.children?.length > 0) { + const child = route.children[0]; + // 优先使用 opturl 或 path + const targetPath = child.opturl || child.path; + return targetPath?.startsWith('/') ? targetPath : `/${targetPath}`; + } + + const targetPath = route.opturl || route.path; + return targetPath; + } + return '/404'; +} + +router.beforeEach(async (to, from, next) => { + NProgress.start(); + const userStore = useUserStoreHook(); + + if (userStore.Token) { + // 登录成功,跳转到首页 + if (to.path === '/login') { + //login + next({ path: '/' }); + NProgress.done(); + return; + } else if ( + (to.path === '/401' || to.path === '/404') && + from.matched.length === 0 && + !from.name + ) { + // 拦截直接 URL 访问错误页面,仅允许内部重定向触发 + next({ path: '/' }); + NProgress.done(); + return; + } else { + const hasGetUserInfo = userStore.roles.length > 0; + if (hasGetUserInfo) { + // 已获取用户信息,检查路由匹配 + if (to.matched.length === 0) { + // 路由未匹配,可能是访问根路径 + if (to.path === '/') { + const firstRoute = findFirstAvailableRoute(permissionStore.routes); + if (firstRoute) { + next(firstRoute); + NProgress.done(); + return; + } + } + from.name ? next({ name: from.name as any }) : next('/401'); + } else { + next(); + } + } else { + try { + const { roles } = await userStore.getInfo(); + let accessRoutes: RouteRecordRaw[] = + await permissionStore.generateRoutes(roles); + + // ✅ 关键修复:在添加路由前,标准化所有路径 + accessRoutes = normalizeRoutes(accessRoutes); + + accessRoutes.forEach((route: any) => { + router.addRoute(route); + }); + + // 关键:如果是根路径,加载完路由后跳转到第一个可用路由 + if (to.path === '/') { + const firstRoute = findFirstAvailableRoute(accessRoutes); + if (firstRoute) { + next(firstRoute); + NProgress.done(); + return; + } + } + + next({ ...to, replace: true }); + } catch (error) { + console.log(error); + await userStore.resetToken(); + next(`/login`); + NProgress.done(); + } + } + } + } else { + // 未登录可以访问白名单页面 + if (whiteList.indexOf(to.path) !== -1) { + next(); + } else { + next(`/login`); + NProgress.done(); + } + } +}); + +router.afterEach(() => { + NProgress.done(); +}); diff --git a/frontend-sjgl/src/router/index.ts b/frontend-sjgl/src/router/index.ts new file mode 100644 index 00000000..75cf3d8f --- /dev/null +++ b/frontend-sjgl/src/router/index.ts @@ -0,0 +1,60 @@ +import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'; +import { usePermissionStoreHook } from '@/store/modules/permission'; + +export const Layout = () => import('@/layout/index.vue'); + +// 静态路由 +export const constantRoutes: RouteRecordRaw[] = [ + { + path: '/redirect', + component: Layout, + meta: { hidden: true }, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect/index.vue') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login/index.vue'), + meta: { hidden: true } + }, + { + path: '/register', + component: () => import('@/views/register/index.vue'), + meta: { hidden: true } + }, + { + path: '/404', + component: () => import('@/views/error-page/404.vue'), + meta: { hidden: true } + }, + { + path: '/401', + component: () => import('@/views/error-page/401.vue'), + meta: { hidden: true } + } +]; + +// 创建路由 +const router = createRouter({ + history: createWebHistory(), + routes: constantRoutes as RouteRecordRaw[], + // 刷新时,滚动条位置还原 + scrollBehavior: () => ({ left: 0, top: 0 }) +}); + +// 重置路由 +export function resetRouter() { + const permissionStore = usePermissionStoreHook(); + permissionStore.routes.forEach(route => { + const name = route.name; + if (name && router.hasRoute(name)) { + router.hasRoute(name) && router.removeRoute(name); + } + }); +} + +export default router; diff --git a/frontend-sjgl/src/settings.ts b/frontend-sjgl/src/settings.ts new file mode 100644 index 00000000..a7aeb796 --- /dev/null +++ b/frontend-sjgl/src/settings.ts @@ -0,0 +1,23 @@ +interface DefaultSettings { + title: string; + showSettings: boolean; + tagsView: boolean; + fixedHeader: boolean; + sidebarLogo: boolean; + errorLog: string; + layout: string; + theme: string; +} + +const defaultSettings: DefaultSettings = { + title: '全过程数据管理子系统', + showSettings: false, + tagsView: true, + fixedHeader: true, + sidebarLogo: true, + errorLog: 'production', + layout: 'left', + theme: 'light' +}; + +export default defaultSettings; diff --git a/frontend-sjgl/src/shims.d.ts b/frontend-sjgl/src/shims.d.ts new file mode 100644 index 00000000..74bf653b --- /dev/null +++ b/frontend-sjgl/src/shims.d.ts @@ -0,0 +1,6 @@ +declare module 'jsencrypt' +declare module 'sortablejs' +declare module '*.svg' { + const content: string + export default content +} \ No newline at end of file diff --git a/frontend-sjgl/src/store/composables/useTimeScale.ts b/frontend-sjgl/src/store/composables/useTimeScale.ts new file mode 100644 index 00000000..544266be --- /dev/null +++ b/frontend-sjgl/src/store/composables/useTimeScale.ts @@ -0,0 +1,207 @@ +import { ref, computed } from 'vue'; +import dayjs, { Dayjs } from 'dayjs'; +import { DateSetting } from '@/utils/enumeration'; + +export interface UseTimeScaleOptions { + defaultTimeScale?: string; + onSearchFinish?: (values: any) => void; + onReset?: (values: any) => void; +} + +export interface TimeShortcutItem { + label: string; + value: [Dayjs, Dayjs]; +} + +export function useTimeScale(options: UseTimeScaleOptions = {}) { + const defaultTimeScale = options.defaultTimeScale || 'tm'; + const currentTimeScale = ref(defaultTimeScale); + + const jcdt = ref({ + min: null as string | null, + max: null as string | null + }); + + // 根据时间尺度动态切换 picker 类型 + const timePicker = computed(() => { + if (currentTimeScale.value === 'tm') return 'date'; + if (currentTimeScale.value === 'dt') return 'date'; + return 'month'; + }); + + // 根据时间尺度动态切换 format + const timeFormat = computed(() => { + if (currentTimeScale.value === 'tm') return 'YYYY-MM-DD HH:mm'; + if (currentTimeScale.value === 'dt') return 'YYYY-MM-DD'; + return 'YYYY-MM'; + }); + + // 小时模式需要 showTime 配置 + const timeShowTime = computed(() => { + if (currentTimeScale.value === 'tm') return { format: 'HH:mm' }; + return undefined; + }); + + const getTmShortcutList = (): TimeShortcutItem[] => { + const getStartTime = () => dayjs().startOf('day').startOf('hour'); + const getStartHourTime = () => dayjs().startOf('hour'); + + return [ + { + label: '此刻', + value: [getStartTime(), getStartTime()] + }, + { + label: '今天', + value: [getStartTime().startOf('day'), getStartTime().endOf('day')] + }, + { + label: '昨天', + value: [ + getStartTime().subtract(1, 'day'), + getStartTime().subtract(1, 'day').endOf('day') + ] + }, + { + label: '最近7小时', + value: [getStartHourTime().subtract(7, 'hour'), getStartHourTime()] + }, + { + label: '本月', + value: [getStartTime().startOf('month'), getStartTime().endOf('month')] + } + ]; + }; + + const getMonthShortcutList = (): TimeShortcutItem[] => { + const now = dayjs(); + + return [ + { + label: '本月', + value: [now.startOf('month'), now.endOf('month')] + }, + { + label: '最近三个月', + value: [now.subtract(3, 'month').startOf('month'), now.endOf('month')] + }, + { + label: '今年', + value: [now.startOf('year'), now.endOf('year')] + }, + { + label: '最近半年', + value: [now.subtract(5, 'month').startOf('month'), now.endOf('month')] + }, + { + label: '最近一年', + value: [now.subtract(12, 'month').startOf('month'), now.endOf('month')] + } + ]; + }; + + const timeShortcutList = computed(() => { + if (currentTimeScale.value === 'tm') return getTmShortcutList(); + if (currentTimeScale.value === 'dt') return DateSetting.RangeButton.days1; + return getMonthShortcutList(); + }); + + // 设置默认时间范围 + const setDefaultTimeRange = (timeScale: string) => { + const now = dayjs(); + const today = now.format('YYYY-MM-DD'); + + if (timeScale === 'tm') { + // 小时:默认前七天,使用当前时分秒 + jcdt.value = { + min: `${dayjs().subtract(6, 'day').format('YYYY-MM-DD')} ${now.format( + 'HH:mm:ss' + )}`, + max: `${today} ${now.format('HH:mm:ss')}` + }; + } else if (timeScale === 'dt') { + // 日:默认前一个月 + jcdt.value = { + min: `${dayjs().subtract(1, 'month').format('YYYY-MM-DD')} 00:00:00`, + max: `${today} 23:59:59` + }; + } else { + // 月:默认前4个月 + jcdt.value = { + min: `${dayjs().subtract(4, 'month').format('YYYY-MM')}-01 00:00:00`, + max: `${today} 23:59:59` + }; + } + }; + + const handleRangeClick = (value: any) => { + jcdt.value = { + min: dayjs(value.value[0]).format('YYYY-MM-DD HH:mm:ss'), + max: dayjs(value.value[1]).format('YYYY-MM-DD HH:mm:ss') + }; + }; + + // 禁用起始时间之前的日期 + const disabledEndDate = (current: Dayjs) => { + if (!jcdt.value.min) return false; + return current && current < dayjs(jcdt.value.min).endOf('day'); + }; + + // 处理搜索完成 + const handleSearchFinish = (values: any) => { + values.jcdt = { + min: values.jcdt?.min || jcdt.value.min, + max: values.jcdt?.max || jcdt.value.max + }; + if (jcdt.value.min) values.jcdt.min = dayjs(jcdt.value.min); + if (jcdt.value.max) values.jcdt.max = dayjs(jcdt.value.max); + // 强制使用当前 timeScale,不被传入值覆盖 + values.timeScale = currentTimeScale.value; + options.onSearchFinish?.(values); + }; + + // 处理值变化 + const handleValuesChange = (changedValues: any, allValues: any) => { + if ( + changedValues.timeScale && + changedValues.timeScale !== currentTimeScale.value + ) { + currentTimeScale.value = changedValues.timeScale; + setDefaultTimeRange(changedValues.timeScale); + } + }; + + // 处理重置 + const handleReset = () => { + jcdt.value = { + min: null, + max: null + }; + currentTimeScale.value = defaultTimeScale; + setDefaultTimeRange(defaultTimeScale); + options.onReset?.({ + timeScale: defaultTimeScale + }); + }; + + // 初始化 + const init = () => { + setDefaultTimeRange(defaultTimeScale); + }; + + return { + jcdt, + currentTimeScale, + timePicker, + timeFormat, + timeShowTime, + timeShortcutList, + handleRangeClick, + disabledEndDate, + handleSearchFinish, + handleValuesChange, + handleReset, + init, + setDefaultTimeRange + }; +} diff --git a/frontend-sjgl/src/store/index.ts b/frontend-sjgl/src/store/index.ts new file mode 100644 index 00000000..fc0ba49d --- /dev/null +++ b/frontend-sjgl/src/store/index.ts @@ -0,0 +1,11 @@ +import type { App } from 'vue'; +import { createPinia } from 'pinia'; + +const store = createPinia(); + +// 全局挂载store +export function setupStore(app: App) { + app.use(store); +} + +export { store }; diff --git a/frontend-sjgl/src/store/modules/app.ts b/frontend-sjgl/src/store/modules/app.ts new file mode 100644 index 00000000..6179f678 --- /dev/null +++ b/frontend-sjgl/src/store/modules/app.ts @@ -0,0 +1,69 @@ +import { + getSize, + setSize, + setLanguage +} from '@/utils/localStorage'; +import { defineStore } from 'pinia'; +import { getLanguage } from '@/lang/index'; +import { computed, reactive, ref } from 'vue'; +import { useStorage } from '@vueuse/core'; + +// Element Plus 语言包 +import zhCn from 'element-plus/es/locale/lang/zh-cn'; +import en from 'element-plus/es/locale/lang/en'; + +export enum DeviceType { + mobile, + desktop +} + +export enum SizeType { + default, + large, + small +} +export const usetTheme = { + token: { + colorPrimary: '#2f6b98', + borderRadius: 2, + }, +}; +// setup +export const useAppStore = defineStore('app', () => { + // state + const device = useStorage('device', 'desktop'); + const size = ref(getSize() || 'default'); + const language = ref(getLanguage()); + const sidebar = reactive({ + withoutAnimation: false + }); + + const locale = computed(() => { + if (language?.value == 'en') { + return en; + } else { + return zhCn; + } + }); + + + function changeSize(val: string) { + size.value = val; + setSize(val); + } + + function changeLanguage(val: string) { + language.value = val; + setLanguage(val); + } + + return { + device, + sidebar, + language, + locale, + size, + changeSize, + changeLanguage, + }; +}); diff --git a/frontend-sjgl/src/store/modules/jidiSelectEvent.ts b/frontend-sjgl/src/store/modules/jidiSelectEvent.ts new file mode 100644 index 00000000..35bb918a --- /dev/null +++ b/frontend-sjgl/src/store/modules/jidiSelectEvent.ts @@ -0,0 +1,78 @@ +import { defineStore } from 'pinia'; +import { ref, onMounted,nextTick } from 'vue'; +import { wbsbGetKendoList } from '@/api/select'; +export const useJidiSelectEventStore = defineStore('jidiSelectEvent', () => { + const jidiData: any = ref([ + { + wbsCode: 'all', + wbsName: '当前全部', + selected: true + } + ]); + const loading = ref(false); + const selectedItem = ref(jidiData.value[0]); + const updataJidiData = (index: any) => { + if(jidiData.value.length == 1){ + return + } + selectedItem.value = jidiData.value[index]; + jidiData.value.forEach((item: any) => { + item.selected = false; + }); + jidiData.value[index].selected = true; + }; + const getJidiData = async () => { + loading.value = true; + const params = { + filter: { + logic: 'and', + filters: [ + { + field: 'wbsType', + operator: 'eq', + dataType: 'string', + value: 'PSB' + }, + { + field: 'treeLevel', + operator: 'eq', + dataType: 'string', + value: '1' + } + ] + }, + sort: [ + { + field: 'orderIndex', + dir: 'asc' + } + ], + select: ['wbsCode', 'wbsName', 'baseId'] + }; + const res = await wbsbGetKendoList(params); + const data = res?.data?.data || [ + { + wbsCode: 'all', + wbsName: '当前全部', + selected: true + } + ]; + jidiData.value = data.map((item: any) => { + return { + ...item, + selected: item.wbsCode == 'all' ? true : false + }; + }); + loading.value = false; + }; + onMounted(() => { + getJidiData(); + }); + + return { + jidiData, + selectedItem, + updataJidiData, + loading + }; +}); diff --git a/frontend-sjgl/src/store/modules/map.ts b/frontend-sjgl/src/store/modules/map.ts new file mode 100644 index 00000000..99cbd6c0 --- /dev/null +++ b/frontend-sjgl/src/store/modules/map.ts @@ -0,0 +1,1490 @@ +import { defineStore, storeToRefs } from 'pinia'; +import { ref } from 'vue'; +import dayjs from 'dayjs'; +import { MapClass } from '@/components/gis/map.class'; +import { getMapConfig } from '@/components/gis/gisUtils'; +import { applyLayerMutualExclusionRules } from '@/modules/map/domain/map-layer-rules'; +import { + applyEnvFacilityLegendRule, + buildLegendCheckedState, + buildLegendTree +} from '@/modules/map/domain/legend-deriver'; +import { attachNearbyPointRuntimeMeta } from '@/modules/map/domain/nearby-point-rules'; +import { useMapConfigStore } from '@/modules/map/stores/map-config.store'; +import { useMapDataStore } from '@/modules/map/stores/map-data.store'; +import { useMapViewStore } from '@/modules/map/stores/map-view.store'; +import request from '@/utils/request'; +const mapClass = MapClass.getInstance(); +const ENG_POINT_LAYER_KEY = 'eng_point'; +const ENG_ALARM_POINT_LAYER_KEY = 'eng_alarm_point'; +const YLFB_POINT_LAYER_KEY = 'ylfb_point'; +const ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5; +const ENG_POINT_LARGE_STATES = [ + 'large_eng_built', + 'large_eng_ubuilt', + 'large_eng_nbuilt' +]; +const ENG_POINT_MEDIUM_STATES = [ + 'mid_eng_built', + 'mid_eng_ubuilt', + 'mid_eng_nbuilt' +]; + +const isEngPointRuntimeItem = (item: any): boolean => { + const runtimeLayerKey = String( + item?.layerKey || item?.type || item?._layerKey || '' + ).toLowerCase(); + const sttpMap = String( + item?._sttpMap || item?.sttpMap || item?.popupSttpMap || '' + ).toUpperCase(); + const sttpCode = String(item?.sttpCode || item?.sttp || '').toUpperCase(); + + if (runtimeLayerKey) { + return runtimeLayerKey.includes(ENG_POINT_LAYER_KEY); + } + + return sttpMap === 'ENG' || sttpMap === 'ENG2' || sttpCode === 'ENG'; +}; + +const normalizeCachePayload = (value: any): any => { + if (Array.isArray(value)) { + return value.map(item => normalizeCachePayload(item)); + } + + if (value && typeof value === 'object') { + return Object.keys(value) + .sort() + .reduce>((acc, key) => { + acc[key] = normalizeCachePayload(value[key]); + return acc; + }, {}); + } + + return value; +}; + +const isCanceledRequestError = (error: unknown) => { + const message = error instanceof Error ? error.message : String(error || ''); + return ( + message.includes('canceled') || + message.includes('aborted') || + message.includes('AbortError') + ); +}; + +const buildFiltersFromParamsObject = ( + paramsObject: Record = {} +) => { + const filtersArray: any[] = []; + + Object.keys(paramsObject).forEach(paramKey => { + const value = paramsObject[paramKey]; + + if (Array.isArray(value)) { + value.forEach((filter: any) => { + filtersArray.push({ + ...filter, + dataType: filter?.dataType || 'string' + }); + }); + return; + } + + filtersArray.push({ + field: paramKey, + operator: 'eq', + dataType: 'string', + value + }); + }); + + return filtersArray; +}; + +const normalizeRequestParams = (rawParams: any) => { + if (!rawParams || !Object.keys(rawParams).length) { + return { logic: 'and', filters: [] }; + } + + if (Array.isArray(rawParams.filters)) { + return { + logic: rawParams.logic || 'and', + filters: rawParams.filters.map((filter: any) => ({ + ...filter, + dataType: filter?.dataType || 'string' + })) + }; + } + + return { + logic: 'and', + filters: buildFiltersFromParamsObject(rawParams) + }; +}; + +const parseAnchorParamJson = (anchorParamJson?: string) => { + const result: { filters: any[]; orders: any[] | null } = { + filters: [], + orders: null + }; + + if (!anchorParamJson) return result; + + try { + const parsed = JSON.parse(anchorParamJson); + if (!parsed || typeof parsed !== 'object') return result; + + // 解析 params -> filters(兼容旧格式:如果没有 params 字段,整个对象即为 params) + const paramsObj = parsed.params || parsed; + if ( + paramsObj && + typeof paramsObj === 'object' && + !Array.isArray(paramsObj) + ) { + result.filters = buildFiltersFromParamsObject(paramsObj); + } + + // 解析 orders -> sort 数组 + if (parsed.orders) { + let ordersObj: Record = {}; + if (typeof parsed.orders === 'string') { + ordersObj = JSON.parse(parsed.orders); + } else if (typeof parsed.orders === 'object') { + ordersObj = parsed.orders; + } + if (ordersObj && typeof ordersObj === 'object') { + result.orders = Object.entries(ordersObj).map(([field, dir]) => ({ + field, + dir + })); + } + } + + return result; + } catch (error) { + console.error('解析 anchorParamJson 失败:', error); + return result; + } +}; + +export const useMapStore = defineStore('map', () => { + const mapConfigStore = useMapConfigStore(); + const mapDataStore = useMapDataStore(); + const mapViewStore = useMapViewStore(); + const { + getLayerConfigByKey, + getLegendConfigByLayerCode, + getLegendConfigByNameEn + } = mapConfigStore; + const { hasPointLayerData, getPointLayerData } = mapDataStore; + const { + layerConfigTree: layerData, + legendConfigOriginal: legendDataOriginal, + pageLegendConfig + } = storeToRefs(mapConfigStore); + const { checkedLayerKeys, legendCheckedState, searchTimeRange } = + storeToRefs(mapViewStore); + const { pointData, pointDataCache, layerLoadState, loading } = + storeToRefs(mapDataStore); + + // 图例数据(经过筛选和排序的) + const legendData = ref([]); + // 选中的图例数据 + const legendDataSelected = ref([]); + const inFlightRequestMap = new Map< + string, + { + promise: Promise; + controller: AbortController; + layerKey: string; + sessionId: number; + } + >(); + const activeLayerRequestKeyMap = new Map(); + const backgroundPointLayerCache = new Map< + string, + { + checked: boolean; + data: any[]; + cacheKey?: string; + } + >(); + let loadSessionSeed = 0; + let activePageRenderToken = 0; + let activePageKey = ''; + let activePageLayerKeys = new Set(); + let activeLoadingPageToken: number | null = null; + let pendingPageNavigationKey = ''; + + const normalizeLegendNameEn = mapConfigStore.normalizeLegendNameEn; + + const filterPointLayerDataForDisplay = ( + layerKey: string, + sourceData: any[] = [], + currentZoom: number = mapViewStore.currentZoomLevel + ): any[] => { + if (layerKey !== ENG_POINT_LAYER_KEY || !Array.isArray(sourceData)) { + return sourceData; + } + + const allowMedium = currentZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM; + return sourceData.filter((item: any) => { + if (!isEngPointRuntimeItem(item)) { + return true; + } + + const state = String(item?.anchoPointState || ''); + if (ENG_POINT_LARGE_STATES.includes(state)) { + return true; + } + if (ENG_POINT_MEDIUM_STATES.includes(state)) { + return allowMedium; + } + return true; + }); + }; + + const refreshPointLayerDisplayData = (layerKey: string) => { + if (!layerKey) return; + + const layerItem = findLayerByKey(layerData.value, layerKey); + syncBackgroundCacheToReactiveStore(layerKey); + const rawData = + Array.isArray(layerItem?.data) && layerItem.data.length > 0 + ? layerItem.data + : getEffectivePointLayerData(layerKey); + const displayData = filterPointLayerDataForDisplay(layerKey, rawData); + const shouldRestoreVisible = + layerItem?.checked === 1 || checkedLayerKeys.value.includes(layerKey); + + mapClass.addInitDataLayer(displayData, layerKey); + if (!shouldRestoreVisible) { + mapClass.mdLayerTreeShowOrHidden(layerKey, false); + return; + } + restoreLayerLegendVisibility(layerKey); + mapClass.mdLayerTreeShowOrHidden(layerKey, true); + }; + + const getLegendItemsByLayerCode = (layerCode: string): any[] => { + return getLegendConfigByLayerCode(layerCode); + }; + + const getLegendChecked = (nameEn?: string): number => { + const normalizedNameEn = normalizeLegendNameEn(nameEn); + if (!normalizedNameEn) return 0; + return mapViewStore.getLegendChecked(normalizedNameEn); + }; + + const restoreLayerLegendVisibility = (layerKey: string): boolean => { + const layerLegendItems = getLegendItemsByLayerCode(layerKey); + if ( + legendDataOriginal.value.length === 0 || + layerLegendItems.length === 0 + ) { + return false; + } + + mapClass.setLegendPointVisible(layerKey, '', false); + layerLegendItems.forEach((legendItem: any) => { + if (getLegendChecked(legendItem.nameEn) === 1) { + applyLegendItemVisibility(legendItem, 1); + } + }); + + return true; + }; + + const buildRuntimeLegendTree = ( + items: any[] = [], + selectedLayerCodes?: Set + ): any[] => { + return buildLegendTree({ + items, + selectedLayerCodes, + getLegendChecked, + normalizeLegendNameEn + }); + }; + + const deriveSelectedLegendData = (layerKeys: string[]): any[] => { + const selectedLayerCodes = new Set( + layerKeys.filter( + key => + key && + key !== '-' && + key !== 'customBaseLayer' && + key !== 'powerBaseStation' + ) + ); + + let derivedLegend = buildRuntimeLegendTree( + legendDataOriginal.value, + selectedLayerCodes + ); + derivedLegend = applyEnvFacilityLegendRule( + derivedLegend, + Array.from(selectedLayerCodes), + legendDataOriginal.value, + items => buildRuntimeLegendTree(items) + ); + return sortByOrderIndex(derivedLegend); + }; + + const rebuildLegendRuntimeData = ( + layerKeys: string[] = checkedLayerKeys.value + ) => { + legendData.value = sortByOrderIndex( + buildRuntimeLegendTree(legendDataOriginal.value) + ); + legendDataSelected.value = deriveSelectedLegendData(layerKeys); + }; + + const getLayerBranchKeys = (rootKey: string): string[] => { + const rootLayer = getLayerConfigByKey(rootKey); + if (!rootLayer) return []; + + const branchKeys: string[] = []; + const walk = (node: any) => { + if (node?.key) { + branchKeys.push(node.key); + } + if (node?.children?.length > 0) { + node.children.forEach((child: any) => walk(child)); + } + }; + + walk(rootLayer); + return branchKeys; + }; + + const normalizeCheckedLayerKeys = ( + rawKeys: string[] = [], + triggerKey?: string, + isChecked?: boolean + ): string[] => { + return applyLayerMutualExclusionRules({ + rawKeys, + previousKeys: checkedLayerKeys.value, + triggerKey, + checked: isChecked, + getLayerBranchKeys + }); + }; + + const getRuntimeCheckedLayerKeys = (): string[] => { + return mapViewStore.getCheckedLayerKeys(); + }; + + const shouldSyncMergedPointData = (layerKey: string, pageToken?: number) => { + if (!layerKey) return false; + return ( + shouldApplyToActivePage(layerKey, pageToken) || + getRuntimeCheckedLayerKeys().includes(layerKey) + ); + }; + + const getEffectivePointLayerCache = (layerKey: string) => { + const reactiveCache = mapDataStore.getPointLayerCache(layerKey); + if (reactiveCache) { + return reactiveCache; + } + return backgroundPointLayerCache.get(layerKey); + }; + + const getEffectivePointLayerData = (layerKey: string): any[] => { + const reactiveCache = mapDataStore.getPointLayerCache(layerKey); + if (reactiveCache?.data) { + return reactiveCache.data; + } + return getEffectivePointLayerCache(layerKey)?.data || []; + }; + + const hasEffectivePointLayerCache = (layerKey: string, cacheKey: string) => { + const cache = getEffectivePointLayerCache(layerKey); + if (!cache || !cacheKey) return false; + return cache.cacheKey === cacheKey && Array.isArray(cache.data); + }; + + const setBackgroundPointLayerCache = ( + layerKey: string, + cache: { + checked: boolean; + data: any[]; + cacheKey?: string; + } + ) => { + if (!layerKey) return; + backgroundPointLayerCache.set(layerKey, cache); + }; + + const syncBackgroundCacheToReactiveStore = (layerKey: string) => { + const cache = backgroundPointLayerCache.get(layerKey); + if (!cache) return; + mapDataStore.setPointLayerCache(layerKey, cache); + backgroundPointLayerCache.delete(layerKey); + }; + + const syncPointDataForFilter = (layerKeys: string[] = []) => { + mapDataStore.rebuildPointDataFromCache(layerKeys); + }; + + const normalizePointLayerItems = (list: any[] = []) => { + return list + .map((item: any) => { + const iconType = item.anchoPointState; + const legendConfig = getLegendConfigByNameEn(iconType); + return { + ...item, + iconCode: item.iconCode || legendConfig?.icon || '', + code: item.code || legendConfig?.code || '', + tm: + item.sttpMap === 'WQ_ALARM' + ? item?.warnDataList?.[0]?.tm + : item?.tm, + _id: + item._id || `${item.sttpMap || iconType || 'point'}_${item.stcd}`, + layerKey: item.layerKey || YLFB_POINT_LAYER_KEY + }; + }) + .filter( + (item: any) => + (item.iconCode || item.code == 'colorLayer') && + !(item?.baseId == 'all' && item?.anchoPointState?.endsWith('_nbuilt')) + ); + }; + + const ensureGISLayerConfig = (layerItem: any) => { + if (!layerItem) return null; + + if (!layerItem.config && layerItem.paramJson) { + try { + const jsonObj = JSON.parse(layerItem.paramJson); + layerItem.config = getMapConfig(jsonObj); + } catch { + layerItem.config = null; + } + } + + if (!layerItem.config) { + return null; + } + + if (layerItem.config.key !== layerItem.key) { + layerItem.config = { + ...layerItem.config, + key: layerItem.key + }; + } + + return layerItem.config; + }; + + /** + * 设置图层数据 + */ + const setLayerData = (data: any[]) => { + mapConfigStore.setLayerConfigTree(data); + const nextCheckedLayerKeys = mapConfigStore.extractCheckedLayerKeys(data); + mapViewStore.setCheckedLayerKeys(nextCheckedLayerKeys); + rebuildLegendRuntimeData(nextCheckedLayerKeys); + }; + + /** + * 按照 orderIndex 排序图例数据(递归) + */ + const sortByOrderIndex = (items: any[]): any[] => { + return items + .map(item => { + if (item.childrenList && item.childrenList.length > 0) { + return { + ...item, + childrenList: sortByOrderIndex(item.childrenList) + }; + } + return item; + }) + .sort((a, b) => (a.orderIndex || 0) - (b.orderIndex || 0)); + }; + + /** + * 启动新的图层加载会话,供需要严格按最新查询条件收口的场景复用。 + */ + const startLoadSession = () => { + loadSessionSeed += 1; + return loadSessionSeed; + }; + + /** + * 判断当前请求是否仍属于最新加载会话,避免旧请求结果回写到最新页面。 + */ + const isCurrentLoadSession = (sessionId: number) => { + return loadSessionSeed === sessionId; + }; + + const activatePageContext = (pageKey: string, items: any[] = []) => { + activePageKey = pageKey; + pendingPageNavigationKey = ''; + activePageRenderToken += 1; + activePageLayerKeys = new Set(getAllLayerKeys(items)); + return activePageRenderToken; + }; + + const markPendingPageNavigation = (targetPageKey: string) => { + pendingPageNavigationKey = targetPageKey || '__route-change__'; + }; + + const hasPendingPageNavigationAwayFrom = (pageKey: string) => { + return !!pendingPageNavigationKey && pendingPageNavigationKey !== pageKey; + }; + + const shouldApplyToActivePage = (layerKey: string, pageToken?: number) => { + if (!layerKey) return false; + if (activePageKey && hasPendingPageNavigationAwayFrom(activePageKey)) { + return false; + } + if (pageToken === undefined) return true; + return ( + activePageRenderToken === pageToken && activePageLayerKeys.has(layerKey) + ); + }; + + const isActivePageToken = (pageToken?: number) => { + if (pageToken === undefined) return true; + return activePageRenderToken === pageToken; + }; + + const beginPageLoading = (pageToken?: number) => { + if (typeof pageToken === 'number') { + activeLoadingPageToken = pageToken; + } + mapDataStore.setLoading(true); + }; + + const finishPageLoading = (pageToken?: number) => { + if (typeof pageToken !== 'number') { + mapDataStore.setLoading(false); + return; + } + + if ( + activeLoadingPageToken === pageToken && + activePageRenderToken === pageToken + ) { + activeLoadingPageToken = null; + mapDataStore.setLoading(false); + } + }; + + /** + * 设置图例数据(过滤掉 name == '地图' 的项,ifShow == 0 时不显示) + * @param data - 全部图例数据 + * @param selectedData - 当前页面选中的图例数据(用于标记选中状态) + */ + const setLegendData = (data: any[], selectedData: any[] = []) => { + mapConfigStore.setLegendConfigOriginal(data); + mapConfigStore.setPageLegendConfig(selectedData); + mapViewStore.setLegendCheckedState( + buildLegendCheckedState(legendDataOriginal.value, normalizeLegendNameEn) + ); + rebuildLegendRuntimeData(checkedLayerKeys.value); + }; + + /** + * 设置选中的图例数据(在图层加载完成后调用) + */ + const setSelectedLegendData = () => { + rebuildLegendRuntimeData(checkedLayerKeys.value); + }; + + /** + * 设置描点数据 + */ + const setPointData = (data: any[]) => { + mapDataStore.setPointData(data); + }; + + const replacePointLayerData = ( + layerKey: string, + data: any[] = [], + visible = true + ) => { + if (!layerKey) return; + + const layerItem = findLayerByKey(layerData.value, layerKey); + const normalizedData = normalizePointLayerItems( + data.map((item: any) => ({ + ...item, + layerKey + })) + ); + + mapDataStore.setPointLayerCache(layerKey, { + checked: visible, + data: normalizedData, + cacheKey: `custom:${layerKey}:${normalizedData.length}` + }); + mapDataStore.rebuildPointDataFromCache(); + + if (layerItem) { + layerItem.data = normalizedData; + layerItem.checked = visible ? 1 : 0; + } + + if (!visible || normalizedData.length === 0) { + if (mapClass.hasLayer(layerKey)) { + mapClass.mdLayerTreeShowOrHidden(layerKey, false); + } + return; + } + + refreshPointLayerDisplayData(layerKey); + }; + + const applyLoadedPointLayerToMap = ( + layer: any, + layerKey: string, + list: any[] = [], + pageToken?: number + ) => { + if (!Array.isArray(list)) { + return; + } + + layer.data = list; + const isLayerChecked = layer.checked === 1; + + if (list.length === 0 || !shouldApplyToActivePage(layerKey, pageToken)) { + return; + } + + const displayData = filterPointLayerDataForDisplay(layerKey, list); + mapClass.addInitDataLayer(displayData, layerKey); + if (isLayerChecked) { + restoreLayerLegendVisibility(layerKey); + } + mapClass.mdLayerTreeShowOrHidden(layerKey, isLayerChecked); + }; + + /** + * 图例数据转对象 + */ + const legendData2Obj = (data: any[]): Record => { + const _tempData: Record = {}; + const f = (_data: any[]) => { + _data.forEach(item => { + if (item?.childrenList && item.childrenList?.length > 0) { + f(item.childrenList); + } else { + const normalizedNameEn = normalizeLegendNameEn(item.nameEn); + if (normalizedNameEn) { + _tempData[normalizedNameEn] = item; + } + } + }); + }; + f(data); + return _tempData; + }; + + /** + * 处理单个 pointMap 图层的显示/隐藏 + * 数据已在初始化时通过 loadLayerData 加载并存入 layer.data + */ + const handlePointMapLayer = async (layer: any, isChecked: boolean) => { + const { key } = layer; + + // 如果没有勾选,隐藏图层 + if (!isChecked) { + if (mapClass.hasLayer(key)) { + mapClass.mdLayerTreeShowOrHidden(key, false); + } + if (mapDataStore.getPointLayerCache(key)) { + mapDataStore.setPointLayerCacheChecked(key, false); + } + if (layer) { + layer.checked = 0; + } + return; + } + + // 使用初始化时已加载的数据(存入 layer.data) + const cachedData = + Array.isArray(layer?.data) && layer.data.length > 0 + ? layer.data + : getPointLayerData(key); + if (cachedData && cachedData.length > 0) { + layer.checked = 1; + const displayData = filterPointLayerDataForDisplay(key, cachedData); + mapClass.addInitDataLayer(displayData, key); + restoreLayerLegendVisibility(key); + if (mapDataStore.getPointLayerCache(key)) { + mapDataStore.setPointLayerCacheChecked(key, true); + } + } else { + console.warn(`图层 ${key} 没有缓存数据`); + } + }; + + /** + * 更新图层数据(联动图例和描点) + * @param checkKeys - 选中的图层 key 列表 + * @param isInit - 是否是初始化阶段(初始化时遍历所有图层) + */ + const updateLayerData = async (checkKeys: string[], isInit = false) => { + if (!isInit) { + checkKeys = normalizeCheckedLayerKeys(checkKeys); + } + + mapViewStore.setCheckedLayerKeys(checkKeys); + + // 收集变化的图层 key(新增选中 / 取消选中) + const newlyChecked: string[] = []; + const newlyUnchecked: string[] = []; + + // 更新图层的 checked 状态,并记录变化 + const updateCheckedStatus = (items: any[]) => { + items.forEach(item => { + if (item.key) { + const wasChecked = item.checked === 1; + const isChecked = checkKeys.includes(item.key); + item.checked = isChecked ? 1 : 0; + if (wasChecked !== isChecked) { + if (isChecked) { + newlyChecked.push(item.key); + } else { + newlyUnchecked.push(item.key); + } + } + } + + if (item.children && item.children.length > 0) { + updateCheckedStatus(item.children); + } + }); + }; + updateCheckedStatus(layerData.value); + + rebuildLegendRuntimeData(checkKeys); + + // 控制锚点显示隐藏:初始化时处理全部,否则只处理变化的图层 + const keysToProcess = isInit + ? getAllLayerKeys(layerData.value) + : [...newlyChecked, ...newlyUnchecked]; + + for (const key of keysToProcess) { + const layerItem = findLayerByKey(layerData.value, key); + if (layerItem && layerItem.type === 'pointMap' && layerItem.url) { + const shouldBeVisible = checkKeys.includes(key); + await handlePointMapLayer(layerItem, shouldBeVisible); + if (shouldBeVisible) { + restoreLayerLegendVisibility(key); + mapClass.mdLayerTreeShowOrHidden(key, true); + } + } else if (layerItem && layerItem.type === 'GISMap') { + // 处理 GISMap 类型的图层:勾选时若地图实例中不存在,则先重新加载再控制显隐。 + if (key && key !== '-' && key !== 'powerBaseStation') { + const shouldBeVisible = checkKeys.includes(key); + const layerConfig = ensureGISLayerConfig(layerItem); + if ( + shouldBeVisible && + layerConfig && + !mapClass.hasBaseLayer(layerItem.key) + ) { + mapClass.addBaseDataLayer(layerConfig, true); + } + mapClass.controlBaseLayerTreeShowAndHidden( + key, + layerItem.key, + shouldBeVisible + ); + } + } + } + }; + + /** + * 加载所有包含URL的图层数据 + * @param items 图层数据 + * @param checkedKeys 选中的图层 keys(用于优先加载) + */ + const loadAllLayerData = async ( + items: any[], + checkedKeys: string[] = [], + options: { + pageToken?: number; + skipSessionCheck?: boolean; + pageKey?: string; + } = {} + ) => { + beginPageLoading(options.pageToken); + const currentSessionId = options.skipSessionCheck + ? undefined + : startLoadSession(); + const checkedTasks: Array<() => Promise> = []; + const uncheckedTasks: Array<() => Promise> = []; + const processedKeys = new Set(); + const debugStart = Date.now(); + + const processItems = (itemList: any[]) => { + itemList.forEach(item => { + if ( + (item.type === 'pointMap' || item.url) && + item.key && + item.url && + !processedKeys.has(item.key) + ) { + processedKeys.add(item.key); + const task = () => + loadLayerData(item, { + sessionId: currentSessionId, + pageToken: options.pageToken, + skipSessionCheck: options.skipSessionCheck, + pageKey: options.pageKey + }); + if (checkedKeys.includes(item.key)) { + checkedTasks.push(task); + } else { + uncheckedTasks.push(task); + } + } + + if (item.children && item.children.length > 0) { + processItems(item.children); + } + }); + }; + + processItems(items); + + try { + // 首页初始化:所有图层接口一次性并发下发,避免分批串行等待。 + const loadResults = await Promise.allSettled( + [...checkedTasks, ...uncheckedTasks].map(task => task()) + ); + const failedResults = loadResults.filter( + result => result.status === 'rejected' + ); + + if (failedResults.length > 0) { + console.warn( + '部分图层数据加载失败,但不会阻断其他图层:', + failedResults + ); + } + + if ( + (typeof currentSessionId === 'number' && + !isCurrentLoadSession(currentSessionId)) || + !isActivePageToken(options.pageToken) + ) { + return; + } + + if ( + options.pageKey && + hasPendingPageNavigationAwayFrom(options.pageKey) + ) { + return; + } + + // 确保所有图层的数据都已经缓存到 pointDataCache 和 layer.data + const allLayerKeys = getAllLayerKeys(items); + for (const key of allLayerKeys) { + const layer = findLayerByKey(items, key); + if (layer && getEffectivePointLayerData(key).length > 0) { + syncBackgroundCacheToReactiveStore(key); + layer.data = getEffectivePointLayerData(key); + } + } + + const allPointData = mapDataStore.rebuildPointDataFromCache(allLayerKeys); + attachNearbyPointRuntimeMeta(allPointData); + const runtimeCheckedKeys = getRuntimeCheckedLayerKeys(); + const treeCheckedKeys = mapConfigStore.extractCheckedLayerKeys( + layerData.value.length > 0 ? layerData.value : items + ); + const finalCheckedKeys = + runtimeCheckedKeys.length > 0 ? runtimeCheckedKeys : treeCheckedKeys; + + // 备注:近邻点元数据需要基于全量点位统一识别,识别完成后同步刷新各图层 Feature。 + for (const key of allLayerKeys) { + const layer = findLayerByKey(items, key); + if (!layer || !hasPointLayerData(key)) { + continue; + } + + const layerPoints = getPointLayerData(key); + const displayData = filterPointLayerDataForDisplay(key, layerPoints); + const cacheChecked = mapDataStore.getPointLayerCache(key)?.checked; + const shouldRestoreVisible = + typeof cacheChecked === 'boolean' + ? cacheChecked + : layer.checked === 1 || finalCheckedKeys.includes(key); + layer.data = layerPoints; + mapClass.addInitDataLayer(displayData, key); + if (shouldRestoreVisible) { + restoreLayerLegendVisibility(key); + } + mapClass.mdLayerTreeShowOrHidden(key, shouldRestoreVisible); + } + + // 设置选中的图例数据(确保图例在所有锚点加载完成后才显示) + setSelectedLegendData(); + + // 备注:初始化 loading 期间用户可能已经手动改过图层勾选,这里必须以最新运行态收尾, + // 不能再回放 load 启动瞬间的默认 checked 快照。 + await updateLayerData(finalCheckedKeys, true); + } finally { + const shouldFinishLoading = + (typeof currentSessionId !== 'number' || + isCurrentLoadSession(currentSessionId)) && + (options.pageToken === undefined || + activePageRenderToken === options.pageToken); + if (shouldFinishLoading) { + finishPageLoading(options.pageToken); + } + } + }; + + const loadCurrentPageLayerData = async ( + items: any[], + checkedKeys: string[] = [], + options: { + pageToken?: number; + skipSessionCheck?: boolean; + } = {} + ) => { + const checkedLayerSet = new Set(checkedKeys); + const tasks: Array<() => Promise> = []; + const processedKeys = new Set(); + + const processItems = (itemList: any[]) => { + itemList.forEach(item => { + if ( + item.type === 'pointMap' && + item.key && + item.url && + checkedLayerSet.has(item.key) && + !processedKeys.has(item.key) + ) { + processedKeys.add(item.key); + tasks.push(() => + loadLayerData(item, { + sessionId: options.skipSessionCheck ? undefined : loadSessionSeed, + pageToken: options.pageToken, + skipSessionCheck: options.skipSessionCheck ?? true + }) + ); + } + + if (item.children && item.children.length > 0) { + processItems(item.children); + } + }); + }; + + processItems(items); + + if (tasks.length === 0) { + finishPageLoading(options.pageToken); + return; + } + + beginPageLoading(options.pageToken); + + try { + // 菜单切换:仅当前页的勾选图层一次性并发下发,旧请求在后台继续运行。 + await Promise.allSettled(tasks.map(task => task())); + } finally { + if (isActivePageToken(options.pageToken)) { + finishPageLoading(options.pageToken); + } + } + }; + + /** + * 根据 key 查找图层 + */ + const findLayerByKey = (items: any[], key: string): any | null => { + void items; + if (!key) return null; + return getLayerConfigByKey(key) || null; + }; + + /** + * 获取所有图层 keys + */ + const getAllLayerKeys = (data: any[]): string[] => { + const keys: string[] = []; + const f = (arr: any[] = []) => { + arr.forEach((item: any) => { + if (item.key) { + keys.push(item.key); + } + if (item.children && item.children.length > 0) { + f(item.children); + } + }); + }; + f(data); + return keys; + }; + + const getRuntimeLegendNames = ( + layerKey: string, + nameEn: string + ): string[] => { + const normalizedNameEn = normalizeLegendNameEn(nameEn); + if (!normalizedNameEn) { + return []; + } + + if (normalizedNameEn.includes('alarm_range_')) { + const candidates: string[] = []; + if (layerKey === ENG_ALARM_POINT_LAYER_KEY) { + candidates.push(`mid_eng_built_${normalizedNameEn}`); + candidates.push(`large_eng_built_${normalizedNameEn}`); + } else { + candidates.push(`large_eng_built_${normalizedNameEn}`); + candidates.push(`mid_eng_built_${normalizedNameEn}`); + } + return candidates; + } + + return [normalizedNameEn]; + }; + + const syncLegendCheckedInTree = ( + items: any[], + nameEn: string, + checked: number + ) => { + items.forEach((item: any) => { + if (item.nameEn === nameEn) { + item.checked = checked; + } + if (item.childrenList && item.childrenList.length > 0) { + syncLegendCheckedInTree(item.childrenList, nameEn, checked); + } + }); + }; + + const applyLegendItemVisibility = (legendItem: any, checked: number) => { + if (!legendItem?.nameEn || !legendItem?.layerCode) { + return; + } + + const layerKey = legendItem.layerCode; + const layerItem = getLayerConfigByKey(layerKey); + const shouldBeVisible = checked === 1; + const runtimeLegendNames = getRuntimeLegendNames( + layerKey, + legendItem.nameEn + ); + + if (layerItem?.type === 'GISMap') { + mapClass.controlBaseLayerTreeShowAndHidden( + layerKey, + layerItem.config?.id || layerKey, + shouldBeVisible + ); + return; + } + + runtimeLegendNames.forEach(runtimeLegendName => { + mapClass.setLegendPointVisible( + layerKey, + runtimeLegendName, + shouldBeVisible + ); + }); + }; + + /** + * 更新图例选中状态 + */ + const updateLegendChecked = (nameEn: string, checked: number) => { + const normalizedNameEn = normalizeLegendNameEn(nameEn); + const legendItem = getLegendConfigByNameEn(normalizedNameEn); + if (!legendItem) { + return; + } + + mapViewStore.setLegendChecked(normalizedNameEn, checked); + syncLegendCheckedInTree(legendData.value, normalizedNameEn, checked); + syncLegendCheckedInTree( + legendDataSelected.value, + normalizedNameEn, + checked + ); + rebuildLegendRuntimeData(checkedLayerKeys.value); + applyLegendItemVisibility(legendItem, checked); + }; + + const updateLegendCheckedBatch = (nameEns: string[], checked: number) => { + const nextState = { ...legendCheckedState.value }; + const changedLegendItems: any[] = []; + + nameEns.forEach(nameEn => { + const normalizedNameEn = normalizeLegendNameEn(nameEn); + const legendItem = getLegendConfigByNameEn(normalizedNameEn); + if (!legendItem) return; + + nextState[normalizedNameEn] = checked; + changedLegendItems.push(legendItem); + }); + + mapViewStore.setLegendCheckedState(nextState); + rebuildLegendRuntimeData(checkedLayerKeys.value); + changedLegendItems.forEach(legendItem => + applyLegendItemVisibility(legendItem, checked) + ); + }; + + /** + * 生成请求标识符,用于避免重复请求 + */ + const getRequestIdentifier = (url: string, params: any): string => { + const paramString = JSON.stringify(normalizeCachePayload(params)); + return `${url}?${encodeURIComponent(paramString)}`; + }; + + /** + * 加载单个图层数据 + */ + const loadLayerData = async ( + layer: any, + options: { + sessionId?: number; + pageToken?: number; + skipSessionCheck?: boolean; + pageKey?: string; + } = {} + ) => { + const { + sessionId = loadSessionSeed, + pageToken, + skipSessionCheck = false, + pageKey + } = options; + const { key, url, params = {}, paramJson, anchorParamJson } = layer; + + // 没有URL,跳过 + if (!url) { + return []; + } + const requestUrl = url; + let requestParams: any = params; + let requestOrders: any = null; + + const layerKey = layer?.key || ''; + + const ylfbKeys = ['ylfb_point']; + const timeRangeLayerKeys = ['ef_point']; + + const yearTime = dayjs().subtract(1, 'years'); + + requestParams = normalizeRequestParams(requestParams); + + const anchorParamResult = parseAnchorParamJson(anchorParamJson); + if (anchorParamResult.filters.length) { + requestParams.filters.push(...anchorParamResult.filters); + } + if (anchorParamResult.orders) { + requestOrders = anchorParamResult.orders; + } + + if (timeRangeLayerKeys.includes(layerKey)) { + requestParams.filters.push({ + field: 'tm', + operator: 'gte', + dataType: 'date', + value: dayjs(searchTimeRange.value[0]).format('YYYY-MM-DD HH:mm:ss') + }); + requestParams.filters.push({ + field: 'tm', + operator: 'lte', + dataType: 'date', + value: dayjs(searchTimeRange.value[1]).format('YYYY-MM-DD 23:59:59') + }); + } + if (ylfbKeys.includes(layerKey)) { + if (yearTime) { + requestParams.filters.push({ + field: 'startTime', + operator: 'eq', + dataType: 'date', + value: dayjs(yearTime).startOf('year').format('YYYY-MM-DD 00:00:00') + }); + requestParams.filters.push({ + field: 'endTime', + operator: 'eq', + dataType: 'date', + value: dayjs(yearTime).endOf('year').format('YYYY-MM-DD 23:59:59') + }); + } + } + + if (!requestOrders && layer?.orders) { + try { + const ordersObj = JSON.parse(layer.orders); + const ordersArray = Object.entries(ordersObj).map(([field, dir]) => ({ + field, + dir + })); + requestOrders = ordersArray; + } catch (e) { + console.error('解析 orders 失败:', e); + } + } + + if (!Object.keys(requestParams).length && paramJson) { + try { + const jsonObj = JSON.parse(paramJson); + if (jsonObj.params) { + requestParams = jsonObj.params; + } + } catch (e) { + console.error('解析 paramJson 失败:', e); + } + } + const requestData: any = { + filter: requestParams + }; + if (requestOrders) { + requestData.sort = requestOrders; + } + + const requestIdentifier = getRequestIdentifier(requestUrl, { + layerKey: key, + requestData + }); + + if (hasEffectivePointLayerCache(key, requestIdentifier)) { + syncBackgroundCacheToReactiveStore(key); + const cachedList = getEffectivePointLayerData(key); + layer.data = cachedList; + if (shouldSyncMergedPointData(key, pageToken)) { + syncPointDataForFilter(getRuntimeCheckedLayerKeys()); + } + applyLoadedPointLayerToMap(layer, key, cachedList, pageToken); + return cachedList; + } + + activeLayerRequestKeyMap.set(key, requestIdentifier); + const existingRequest = inFlightRequestMap.get(requestIdentifier); + if (existingRequest) { + mapDataStore.setLayerLoading(key); + return existingRequest.promise.then(list => { + if (Array.isArray(list) && list.length > 0) { + if (shouldSyncMergedPointData(key, pageToken)) { + syncPointDataForFilter(getRuntimeCheckedLayerKeys()); + } + applyLoadedPointLayerToMap(layer, key, list, pageToken); + } + return list; + }); + } + + mapDataStore.setLayerLoading(key); + + const controller = new AbortController(); + + const requestPromise = (async () => { + try { + const response = await request({ + url: requestUrl, + method: 'post', + data: requestData, + signal: controller.signal + }); + const resData = response?.data || response?.data?.data || []; + + if ( + controller.signal.aborted || + (!skipSessionCheck && !isCurrentLoadSession(sessionId)) + ) { + return []; + } + + let list: any[] = []; + if (resData) { + if (Array.isArray(resData)) { + list = resData; + } else if (Array.isArray(resData.data)) { + list = resData.data; + } else if (resData.data && Array.isArray(resData.data.data)) { + list = resData.data.data; + } else if ( + resData.data && + resData.data.data && + Array.isArray(resData.data.data.data) + ) { + list = resData.data.data.data; + } + } + + list = normalizePointLayerItems( + list.map((item: any) => ({ + ...item, + layerKey: item.layerKey || key + })) + ); + + if (activeLayerRequestKeyMap.get(key) !== requestIdentifier) { + return []; + } + + const isLayerChecked = layer.checked === 1; + const cachePayload = { + checked: isLayerChecked, + data: list, + cacheKey: requestIdentifier + }; + const shouldDeferToBackgroundCache = + !!pageKey && hasPendingPageNavigationAwayFrom(pageKey); + + if (shouldDeferToBackgroundCache) { + setBackgroundPointLayerCache(key, cachePayload); + layer.data = list; + return list; + } + + mapDataStore.setPointLayerCache(key, cachePayload); + if (shouldSyncMergedPointData(key, pageToken)) { + syncPointDataForFilter(getRuntimeCheckedLayerKeys()); + } + applyLoadedPointLayerToMap(layer, key, list, pageToken); + + mapDataStore.setLayerLoaded(key); + return list; + } catch (error) { + if ( + controller.signal.aborted || + isCanceledRequestError(error) || + (!skipSessionCheck && !isCurrentLoadSession(sessionId)) || + activeLayerRequestKeyMap.get(key) !== requestIdentifier + ) { + return []; + } + + console.error(`加载描点数据失败 [${key}]:`, error); + mapDataStore.setLayerLoadError(key, error); + throw error; + } finally { + const activeRequest = inFlightRequestMap.get(requestIdentifier); + if (activeRequest?.controller === controller) { + inFlightRequestMap.delete(requestIdentifier); + } + if (activeLayerRequestKeyMap.get(key) === requestIdentifier) { + activeLayerRequestKeyMap.delete(key); + } + } + })(); + + inFlightRequestMap.set(requestIdentifier, { + promise: requestPromise, + controller, + layerKey: key, + sessionId + }); + + return requestPromise; + }; + + /** + * 获取选中的图层 key + */ + const getCheckedKeys = (): string[] => { + return mapViewStore.getCheckedLayerKeys(); + }; + + /** + * 根据当前搜索时间范围重新加载描点数据 + */ + const reloadBySearchTimeRange = async () => { + mapDataStore.setLoading(true); + const currentSessionId = startLoadSession(); + + // 只处理和 searchTimeRange 相关的图层 + const timeRangeLayerKeys = ['ef_point']; + + try { + for (const key of timeRangeLayerKeys) { + // 如果描点图层存在于地图中,先删除旧图层 + mapClass.removePointLayer(key); + + // 清空缓存 + if (mapDataStore.getPointLayerCache(key)) { + mapDataStore.removePointLayerCache(key); + mapDataStore.clearLayerLoadState(key); + } + } + + // 重新加载需要时间搜索的图层数据 + if (layerData.value.length > 0) { + const currentCheckedKeys = getCheckedKeys(); + + for (const key of timeRangeLayerKeys) { + const layerItem = findLayerByKey(layerData.value, key); + if (layerItem && currentCheckedKeys.includes(key)) { + await loadLayerData(layerItem, { sessionId: currentSessionId }); + } + } + + if (!isCurrentLoadSession(currentSessionId)) { + return; + } + + const allPointData = mapDataStore.rebuildPointDataFromCache(); + // 更新地图锚点显示 + await updateLayerData(currentCheckedKeys, false); + } + } finally { + mapDataStore.setLoading(false); + } + }; + + /** + * 更新搜索时间范围并重新加载描点数据 + */ + const updateSearchTimeRange = async (newRange: [any, any]) => { + mapViewStore.setSearchTimeRange(newRange); + await reloadBySearchTimeRange(); + }; + + return { + layerData, + setLayerData, + loadAllLayerData, + loadCurrentPageLayerData, + loadLayerData, + setSelectedLegendData, + legendData, + setLegendData, + legendDataSelected, + pointData, + setPointData, + checkedLayerKeys, + updateLayerData, + updateLegendChecked, + updateLegendCheckedBatch, + replacePointLayerData, + getCheckedKeys, + legendData2Obj, + loading, + pointDataCache, + layerLoadState, + findLayerByKey, + getLegendItemsByLayerCode, + getLayerBranchKeys, + normalizeCheckedLayerKeys, + refreshPointLayerDisplayData, + activatePageContext, + markPendingPageNavigation, + searchTimeRange, + reloadBySearchTimeRange, + updateSearchTimeRange + }; +}); diff --git a/frontend-sjgl/src/store/modules/model.ts b/frontend-sjgl/src/store/modules/model.ts new file mode 100644 index 00000000..ada3f354 --- /dev/null +++ b/frontend-sjgl/src/store/modules/model.ts @@ -0,0 +1,80 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + +export const useModelStore = defineStore('model', () => { + // state + const modalVisible = ref(false); + const ylfbModalVisible = ref(false); // 鱼类分布弹窗显示状态 + const currentTabKey = ref('basicInfo'); + const tabList = ref([]); + const title = ref(''); + const isBasicEdit = ref(false); + const showStcdSelector = ref(false); // 是否显示下拉框 + const stcdOptions = ref>([]); // 可选测站列表 + + // 新增:功能迁移所需的状态字段 + const baseId = ref(''); // 当前基地 ID + const hasPowerStatData = ref(false); // 电站是否有专题数据 + const isPowerStatPage = ref(false); // 是否在电站专题页面 + const verticalWaterStcd = ref(''); // 垂向水温子站点编码 + const aiSites = ref([]); // AI 识别站点列表 + const wtConfig = ref<{ ioWtrv?: boolean; hasRstcdWtvt?: boolean }>({}); // 水温配置 + const wqShow = ref(false); // 水质 AI 预测显示 + const fishTabInfo = ref(null); // 鱼类监测数据信息 + + const params = ref<{ + sttp: string; + stcd: any; + date: any; + show: any; + enfc: any; + eqtp: any; + baseId?: string; // 新增:基地 ID + sttpCode?: string; // 新增:站点类型代码 + sttpMap?: string; // 新增:站点类型映射 + dtinType?: string; + bldstt: string; + bldsttCcode: string; + }>({ + sttp: 'eng', + stcd: '', + date: '', + show: true, + enfc: '0', + eqtp: '', + baseId: '', + sttpCode: '', + sttpMap: '', + dtinType: '', + bldstt: '', + bldsttCcode:'' + }); + const filter = ref({ + stllgzlx: '', // 生态流量 - 规则类型 + stllTmType: '', // 生态流量 - 时间类型 + tm: '', + rangeTm: [], + year:'', + }); + return { + params, + modalVisible, + ylfbModalVisible, // 鱼类分布弹窗显示状态 + currentTabKey, + tabList, + title, + isBasicEdit, + showStcdSelector, // 新增 + stcdOptions, // 新增 + filter, + // 新增返回字段 + baseId, + hasPowerStatData, + isPowerStatPage, + verticalWaterStcd, + aiSites, + wtConfig, + wqShow, + fishTabInfo + }; +}); diff --git a/frontend-sjgl/src/store/modules/permission.ts b/frontend-sjgl/src/store/modules/permission.ts new file mode 100644 index 00000000..058de331 --- /dev/null +++ b/frontend-sjgl/src/store/modules/permission.ts @@ -0,0 +1,77 @@ +import { RouteRecordRaw } from 'vue-router'; +import { defineStore } from 'pinia'; +import { constantRoutes } from '@/router'; +import { store } from '@/store'; +import { listRoutes } from '@/api/menu'; +import { ref } from 'vue'; + +const modules = import.meta.glob('../../views/**/**.vue'); +export const Layout = () => import('@/layout/index.vue'); + +const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => { + const res: RouteRecordRaw[] = []; + routes.forEach(route => { + const tmp = { ...route } as any; + // ✅ 保存原始名称到 meta,用于菜单显示 + tmp.meta = { + ...tmp.meta, + title: tmp.name || tmp.menuName, // 原始名称用于显示 + moduleId: tmp.id // 保存菜单ID,供地图模块使用 + }; + // ✅ name 使用路径生成唯一值 + tmp.name = tmp.path || tmp.opturl; + + // if (hasPermission(roles, tmp)) { + tmp.path = tmp.opturl; + if (tmp.type == '0') { + tmp.component = Layout; + } else { + const component = modules[`../../views${tmp.opturl}.vue`] as any; + if (component) { + tmp.component = component; + } else { + tmp.component = modules[`../../views/error-page/404.vue`]; + } + } + res.push(tmp); + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles); + } + // } + }); + return res; +}; + +// setup +export const usePermissionStore = defineStore('permission', () => { + // state + const routes = ref([]); + const addRoutes = ref([]); + + // actions + function setRoutes(newRoutes: RouteRecordRaw[]) { + addRoutes.value = newRoutes; + routes.value = constantRoutes.concat(newRoutes); + } + + function generateRoutes(roles: string[]) { + return new Promise((resolve, reject) => { + listRoutes() + .then(response => { + const asyncRoutes: any = response; + const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles); + setRoutes(accessedRoutes); + resolve(accessedRoutes); + }) + .catch(error => { + reject(error); + }); + }); + } + return { routes, setRoutes, generateRoutes }; +}); + +// 非setup +export function usePermissionStoreHook() { + return usePermissionStore(store); +} diff --git a/frontend-sjgl/src/store/modules/shuJuTianBao.ts b/frontend-sjgl/src/store/modules/shuJuTianBao.ts new file mode 100644 index 00000000..b1cec9a7 --- /dev/null +++ b/frontend-sjgl/src/store/modules/shuJuTianBao.ts @@ -0,0 +1,121 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; // 使用 ref 更简单直观 +import { + getBaseDropdown, + getSelectForDropdown, + getEngInfoDropdown, + getFpssDropdown +} from '@/api/select'; + +export const useShuJuTianBaoStore = defineStore('shuJuTianBao', () => { + // 水电基地下拉列表 + const baseLoading = ref(false); + const baseOption = ref([]); + // 流域下拉列表 + const lyLoading = ref(false); + const lyOption = ref([]); + // 电站下拉列表 + const engOption = ref([]); + const engLoading = ref(false); + // 流域下拉列表 + const fpssOption = ref([]); + const fpssLoading = ref(false); + // 鱼类名称下拉列表 + const fishOption = ref([]); + // 获取水电基地列表 + const getBaseOption = async () => { + try { + baseLoading.value = true; + const res = await getBaseDropdown({}); + // debugger + if (res.data && Array.isArray(res.data)) { + const list = [...res.data]; + // 直接赋值给 ref,触发响应式更新 + baseOption.value = list; + } + } catch (error) { + console.error('获取水电基地列表失败:', error); + } finally { + baseLoading.value = false; + } + }; + // 获取流域列表 + const getSelectForOption = async () => { + try { + lyLoading.value = true; + const res = await getSelectForDropdown({}); + if (res.data && Array.isArray(res.data)) { + const list = [ + { rvcd: 'all', rvnm: '当前全部', baseid: '01' }, + ...res.data + ]; + // 直接赋值给 ref,触发响应式更新 + lyOption.value = list; + } + } catch (error) { + console.error('获取流域列表失败:', error); + } finally { + lyLoading.value = false; + } + }; + // 获取电站列表 + const getEngOption = async (rvcd: string, type: string) => { + try { + engLoading.value = true; + let param:any + if (type == 'baseId') { + param = rvcd === 'all' ? {} : { baseId: rvcd }; + } else { + param = rvcd === 'all' ? {} : { rvcd: rvcd }; + } + const res = await getEngInfoDropdown(param); + if (res.data && Array.isArray(res.data)) { + // 直接赋值给 ref + engOption.value = res.data; + getFpssOption(rvcd, ''); + } + } catch (error) { + console.error('获取电站列表失败:', error); + } finally { + engLoading.value = false; + } + }; + // 获取过鱼设施列表 + const getFpssOption = async (rvcd: string, rstcd: string) => { + try { + fpssLoading.value = true; + const param = rvcd === 'all' ? {} : { rvcd }; + const res = await getFpssDropdown({ ...param, rstcd: rstcd }); + fpssOption.value = res.data; + } catch (error) { + console.log(error); + } finally { + // fpssLoading.value = false; + } + }; + const getFishOption = () => { + return fishOption.value; + }; + const setFishOption = (data: any[]) => { + fishOption.value = data; + }; + // 3. 直接返回 ref 和方法 + // 在组件中使用时:store.baseOption 会自动解包为数组 + return { + fpssOption, + lyOption, + baseOption, + engOption, + fishOption, + fpssLoading, + baseLoading, + lyLoading, + engLoading, + getBaseOption, + getSelectForOption, + getEngOption, + getFpssOption, + getFishOption, + setFishOption + }; +}); diff --git a/frontend-sjgl/src/store/modules/tagsView.ts b/frontend-sjgl/src/store/modules/tagsView.ts new file mode 100644 index 00000000..f8a69a23 --- /dev/null +++ b/frontend-sjgl/src/store/modules/tagsView.ts @@ -0,0 +1,214 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { RouteLocationNormalized } from 'vue-router'; + +export interface TagView extends Partial { + title?: string; +} + +// setup +export const useTagsViewStore = defineStore('tagsView', () => { + // state + const visitedViews = ref([]); + const cachedViews = ref([]); + + // actions + function addVisitedView(view: TagView) { + if (visitedViews.value.some(v => v.path === view.path)) return; + if (view.meta && view.meta.affix) { + visitedViews.value.unshift( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ); + } else { + visitedViews.value.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ); + } + } + + function addCachedView(view: TagView) { + const viewName = view.name as string; + if (cachedViews.value.includes(viewName)) return; + if (view.meta?.keepAlive) { + cachedViews.value.push(viewName); + } + } + + function delVisitedView(view: TagView) { + return new Promise(resolve => { + for (const [i, v] of visitedViews.value.entries()) { + if (v.path === view.path) { + visitedViews.value.splice(i, 1); + break; + } + } + resolve([...visitedViews.value]); + }); + } + + function delCachedView(view: TagView) { + const viewName = view.name as string; + return new Promise(resolve => { + const index = cachedViews.value.indexOf(viewName); + index > -1 && cachedViews.value.splice(index, 1); + resolve([...cachedViews.value]); + }); + } + + function delOtherVisitedViews(view: TagView) { + return new Promise(resolve => { + visitedViews.value = visitedViews.value.filter(v => { + return v.meta?.affix || v.path === view.path; + }); + resolve([...visitedViews.value]); + }); + } + + function delOtherCachedViews(view: TagView) { + const viewName = view.name as string; + return new Promise(resolve => { + const index = cachedViews.value.indexOf(viewName); + if (index > -1) { + cachedViews.value = cachedViews.value.slice(index, index + 1); + } else { + // if index = -1, there is no cached tags + cachedViews.value = []; + } + resolve([...cachedViews.value]); + }); + } + + function updateVisitedView(view: TagView) { + for (let v of visitedViews.value) { + if (v.path === view.path) { + v = Object.assign(v, view); + break; + } + } + } + + function addView(view: TagView) { + addVisitedView(view); + addCachedView(view); + } + + function delView(view: TagView) { + return new Promise(resolve => { + delVisitedView(view); + delCachedView(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delOtherViews(view: TagView) { + return new Promise(resolve => { + delOtherVisitedViews(view); + delOtherCachedViews(view); + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delLeftViews(view: TagView) { + return new Promise(resolve => { + const currIndex = visitedViews.value.findIndex(v => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + // affix:true 固定tag,例如“首页” + if (index >= currIndex || (item.meta && item.meta.affix)) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name as string); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value] + }); + }); + } + function delRightViews(view: TagView) { + return new Promise(resolve => { + const currIndex = visitedViews.value.findIndex(v => v.path === view.path); + if (currIndex === -1) { + return; + } + visitedViews.value = visitedViews.value.filter((item, index) => { + // affix:true 固定tag,例如“首页” + if (index <= currIndex || (item.meta && item.meta.affix)) { + return true; + } + + const cacheIndex = cachedViews.value.indexOf(item.name as string); + if (cacheIndex > -1) { + cachedViews.value.splice(cacheIndex, 1); + } + return false; + }); + resolve({ + visitedViews: [...visitedViews.value] + }); + }); + } + + function delAllViews() { + return new Promise(resolve => { + const affixTags = visitedViews.value.filter(tag => tag.meta?.affix); + visitedViews.value = affixTags; + cachedViews.value = []; + resolve({ + visitedViews: [...visitedViews.value], + cachedViews: [...cachedViews.value] + }); + }); + } + + function delAllVisitedViews() { + return new Promise(resolve => { + const affixTags = visitedViews.value.filter(tag => tag.meta?.affix); + visitedViews.value = affixTags; + resolve([...visitedViews.value]); + }); + } + + function delAllCachedViews() { + return new Promise(resolve => { + cachedViews.value = []; + resolve([...cachedViews.value]); + }); + } + + return { + visitedViews, + cachedViews, + addVisitedView, + addCachedView, + delVisitedView, + delCachedView, + delOtherVisitedViews, + delOtherCachedViews, + updateVisitedView, + addView, + delView, + delOtherViews, + delLeftViews, + delRightViews, + delAllViews, + delAllVisitedViews, + delAllCachedViews + }; +}); diff --git a/frontend-sjgl/src/store/modules/ui.ts b/frontend-sjgl/src/store/modules/ui.ts new file mode 100644 index 00000000..d629759e --- /dev/null +++ b/frontend-sjgl/src/store/modules/ui.ts @@ -0,0 +1,35 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + +export const useUiStore = defineStore('ui', () => { + // 右侧抽屉状态 + const drawerOpen = ref(true); + const mapType = ref('2D'); + const mapSwitchCompletedTick = ref(0); + // 3d 流域三维漫游 + const isRoaming = ref(false); + + // 切换抽屉状态 + const toggleDrawer = () => { + drawerOpen.value = !drawerOpen.value; + }; + + // 设置抽屉状态 + const setDrawerOpen = (open: boolean) => { + drawerOpen.value = open; + }; + + const markMapSwitchCompleted = () => { + mapSwitchCompletedTick.value += 1; + }; + + return { + drawerOpen, + isRoaming, + toggleDrawer, + setDrawerOpen, + mapType, + mapSwitchCompletedTick, + markMapSwitchCompleted + }; +}); diff --git a/frontend-sjgl/src/store/modules/user.ts b/frontend-sjgl/src/store/modules/user.ts new file mode 100644 index 00000000..d3e92e3b --- /dev/null +++ b/frontend-sjgl/src/store/modules/user.ts @@ -0,0 +1,109 @@ +import { defineStore } from 'pinia'; + +import { getToken, setToken, removeToken } from '@/utils/auth'; +import { loginApi, logoutApi } from '@/api/auth'; +import { getUserInfo } from '@/api/user'; +import { resetRouter } from '@/router'; +import { store } from '@/store'; +import { LoginData } from '@/api/auth/types'; +import { ref } from 'vue'; +import { UserInfo } from '@/api/user/types'; + +export const useUserStore = defineStore('user', () => { + // state + const Token = ref(getToken() || ''); + const username = ref(''); + const userid = ref(''); + const nickname = ref(''); + const avatar = ref(''); + const roles = ref>([]); // 用户角色编码集合 → 判断路由权限 + const perms = ref>([]); // 用户权限编码集合 → 判断按钮权限 + const badgeval = ref('') + + // actions + + // 登录 + function login(loginData: LoginData) { + return new Promise((resolve, reject) => { + loginApi(loginData) + .then(response => { + const { token } = response.data; + Token.value = token; + setToken(token); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 获取信息(用户昵称、头像、角色集合、权限集合) + function getInfo() { + return new Promise((resolve, reject) => { + getUserInfo() + .then(({ data }) => { + if (!data) { + return reject('Verification failed, please Login again.'); + } + if (!data.roles || data.roles.length <= 0) { + reject('getUserInfo: roles must be a non-null array!'); + } + username.value = data.userInfo.username; + userid.value = data.userInfo.id + nickname.value = data.userInfo.nickname; + avatar.value = data.userInfo.avatar; + roles.value = data.roles; + perms.value = data.permissions; + resolve(data); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 注销 + function logout() { + return new Promise((resolve, reject) => { + logoutApi() + .then(() => { + resetRouter(); + resetToken(); + resolve(); + }) + .catch(error => { + reject(error); + }); + }); + } + + // 重置 + function resetToken() { + removeToken(); + Token.value = ''; + nickname.value = ''; + avatar.value = ''; + roles.value = []; + perms.value = []; + } + return { + Token, + username, + userid, + nickname, + avatar, + roles, + perms, + login, + getInfo, + logout, + resetToken, + badgeval + }; +}); + +// 非setup +export function useUserStoreHook() { + return useUserStore(store); +} diff --git a/frontend-sjgl/src/styles/ant-design-vue.scss b/frontend-sjgl/src/styles/ant-design-vue.scss new file mode 100644 index 00000000..85123322 --- /dev/null +++ b/frontend-sjgl/src/styles/ant-design-vue.scss @@ -0,0 +1,44 @@ +.ant-modal { + .ant-modal-content { + border-radius: 2px; + padding: 0 !important; + .ant-modal-close-x { + color: #ffffff !important; + } + .ant-modal-body { + padding: 16px 24px !important; + } + .ant-modal-footer { + margin-top: 0 !important; + padding: 16px 24px !important; + padding-top: 0 !important; + } + } + .ant-modal-header { + padding: 16px 24px; + border-bottom: 1px solid #f0f0f0; + border-radius: 2px 2px 0 0; + background-color: #005293; + margin-bottom: 0; + .ant-modal-title { + color: #ffffff; + } + } +} +.ant-btn > span { + display: inline-flex; +} +.ant-image-preview-root { + .ant-image-preview-wrap { + z-index: 2005 !important; + } + .ant-image-preview-mask { + z-index: 2005 !important; + } +} +.ant-message { + z-index: 2005 !important; +} +.ant-modal-header { + cursor: move; +} diff --git a/frontend-sjgl/src/styles/element-plus.scss b/frontend-sjgl/src/styles/element-plus.scss new file mode 100644 index 00000000..3ccbefdb --- /dev/null +++ b/frontend-sjgl/src/styles/element-plus.scss @@ -0,0 +1,7 @@ +:root { + // 这里可以设置你自定义的颜色变量 + // 这个是element主要按钮:active的颜色,当主题更改后此变量的值也随之更改 + --el-color-primary-dark: #0d84ff; + // --el-font-size-base: 16px !important; +} + diff --git a/frontend-sjgl/src/styles/iconfont/demo.css b/frontend-sjgl/src/styles/iconfont/demo.css new file mode 100644 index 00000000..a67054a0 --- /dev/null +++ b/frontend-sjgl/src/styles/iconfont/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/frontend-sjgl/src/styles/iconfont/demo_index.html b/frontend-sjgl/src/styles/iconfont/demo_index.html new file mode 100644 index 00000000..bce56608 --- /dev/null +++ b/frontend-sjgl/src/styles/iconfont/demo_index.html @@ -0,0 +1,10815 @@ + + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    map-yldczz
    +
    &#xe601;
    +
  • + +
  • + +
    sxjc-fill
    +
    &#xe86d;
    +
  • + +
  • + +
    yunyuchuan2
    +
    &#xe86e;
    +
  • + +
  • + +
    ganyushan2
    +
    &#xe86f;
    +
  • + +
  • + +
    shengyudou2
    +
    &#xe870;
    +
  • + +
  • + +
    AGV2
    +
    &#xe871;
    +
  • + +
  • + +
    shipin-fill
    +
    &#xe86b;
    +
  • + +
  • + +
    yljc-fill
    +
    &#xe86c;
    +
  • + +
  • + +
    hjjc2-fill
    +
    &#xe86a;
    +
  • + +
  • + +
    star
    +
    &#xe863;
    +
  • + +
  • + +
    build
    +
    &#xe862;
    +
  • + +
  • + +
    zhatu
    +
    &#xe860;
    +
  • + +
  • + +
    dongwubaohu
    +
    &#xe85d;
    +
  • + +
  • + +
    zhiwubaohu
    +
    &#xe85c;
    +
  • + +
  • + +
    jingqu
    +
    &#xe85e;
    +
  • + +
  • + +
    guoyusheshi2
    +
    &#xe855;
    +
  • + +
  • + +
    shuiwen-line
    +
    &#xe854;
    +
  • + +
  • + +
    erjibaohu
    +
    &#xe853;
    +
  • + +
  • + +
    shengzhongdianbh
    +
    &#xe852;
    +
  • + +
  • + +
    qingpiao
    +
    &#xe84f;
    +
  • + +
  • + +
    yunxing
    +
    &#xe850;
    +
  • + +
  • + +
    fish
    +
    &#xe851;
    +
  • + +
  • + +
    shengtaibaohu-fill
    +
    &#xe84b;
    +
  • + +
  • + +
    kejichuangxin-fll
    +
    &#xe84d;
    +
  • + +
  • + +
    shuitubaochi-fill
    +
    &#xe849;
    +
  • + +
  • + +
    huanjingjiance-fill
    +
    &#xe84a;
    +
  • + +
  • + +
    rongyu-fill
    +
    &#xe84c;
    +
  • + +
  • + +
    zonglan-fll
    +
    &#xe848;
    +
  • + +
  • + +
    yuleibaohu-fill
    +
    &#xe84e;
    +
  • + +
  • + +
    aihezi
    +
    &#xe835;
    +
  • + +
  • + +
    yunyuche
    +
    &#xe82d;
    +
  • + +
  • + +
    yudaofangliu
    +
    &#xe82e;
    +
  • + +
  • + +
    calendar
    +
    &#xe82c;
    +
  • + +
  • + +
    fenbu
    +
    &#xe82a;
    +
  • + +
  • + +
    view6
    +
    &#xe82b;
    +
  • + +
  • + +
    play
    +
    &#xe827;
    +
  • + +
  • + +
    pause
    +
    &#xe828;
    +
  • + +
  • + +
    agvxiaoche
    +
    &#xe826;
    +
  • + +
  • + +
    video
    +
    &#xe825;
    +
  • + +
  • + +
    dieliangmen
    +
    &#xe821;
    +
  • + +
  • + +
    ganyushan
    +
    &#xe822;
    +
  • + +
  • + +
    liuliangjiancezhan
    +
    &#xe823;
    +
  • + +
  • + +
    yunyuchuan
    +
    &#xe824;
    +
  • + +
  • + +
    zengzhizhanshuizhizhan
    +
    &#xe820;
    +
  • + +
  • + +
    menuYuleiqixidihuanjingjiance
    +
    &#xe81f;
    +
  • + +
  • + +
    menuXitongshezhi
    +
    &#xe81e;
    +
  • + +
  • + +
    menuYuleiqixidi
    +
    &#xe81c;
    +
  • + +
  • + +
    menuFuzhugongneng
    +
    &#xe81d;
    +
  • + +
  • + +
    iconArrowL
    +
    &#xe81b;
    +
  • + +
  • + +
    yumiao
    +
    &#xe819;
    +
  • + +
  • + +
    qizhachuzhi
    +
    &#xe81a;
    +
  • + +
  • + +
    iconGlobal
    +
    &#xe818;
    +
  • + +
  • + +
    iconQuestion
    +
    &#xe817;
    +
  • + +
  • + +
    menuQixiangjiance
    +
    &#xe815;
    +
  • + +
  • + +
    menuShuiwenjiance2
    +
    &#xe816;
    +
  • + +
  • + +
    close
    +
    &#xe814;
    +
  • + +
  • + +
    iconArrowRight
    +
    &#xe813;
    +
  • + +
  • + +
    iconWubianhua
    +
    &#xe811;
    +
  • + +
  • + +
    iconXiajiang
    +
    &#xe812;
    +
  • + +
  • + +
    iconShangsheng
    +
    &#xe810;
    +
  • + +
  • + +
    iconWeiguifangmu
    +
    &#xe80e;
    +
  • + +
  • + +
    iconJiaoshuiyanghu
    +
    &#xe80f;
    +
  • + +
  • + +
    iconDaitianbao
    +
    &#xe80d;
    +
  • + +
  • + +
    iconDaishenhe
    +
    &#xe80c;
    +
  • + +
  • + +
    iconLindi
    +
    &#xe80a;
    +
  • + +
  • + +
    iconZongmianji
    +
    &#xe80b;
    +
  • + +
  • + +
    iconWarning
    +
    &#xe809;
    +
  • + +
  • + +
    iconNodata
    +
    &#xe806;
    +
  • + +
  • + +
    iconNormal
    +
    &#xe807;
    +
  • + +
  • + +
    iconYizai
    +
    &#xe804;
    +
  • + +
  • + +
    iconCaodi
    +
    &#xe805;
    +
  • + +
  • + +
    iconTitle
    +
    &#xe802;
    +
  • + +
  • + +
    iconTitle
    +
    &#xe7df;
    +
  • + +
  • + +
    iconUser
    +
    &#xe801;
    +
  • + +
  • + +
    menuDefault
    +
    &#xe800;
    +
  • + +
  • + +
    iconBell
    +
    &#xe7ff;
    +
  • + +
  • + +
    iconFunction
    +
    &#xe7fd;
    +
  • + +
  • + +
    iconRoaming
    +
    &#xe7fe;
    +
  • + +
  • + +
    menuZhinengfenxi
    +
    &#xe7fa;
    +
  • + +
  • + +
    menuShujvchaxun
    +
    &#xe7fb;
    +
  • + +
  • + +
    menuZhihuigaojing
    +
    &#xe7fc;
    +
  • + +
  • + +
    menuShuiwenjiance
    +
    &#xe7f0;
    +
  • + +
  • + +
    menuShuizhijiance
    +
    &#xe7f1;
    +
  • + +
  • + +
    menuZengzhifangliu
    +
    &#xe7f2;
    +
  • + +
  • + +
    menuDianzhanzhuanti
    +
    &#xe7f3;
    +
  • + +
  • + +
    menuSheshiyunxing
    +
    &#xe7f4;
    +
  • + +
  • + +
    menuShuishengdiaocha
    +
    &#xe7f5;
    +
  • + +
  • + +
    menuLushengdiaocha
    +
    &#xe7f6;
    +
  • + +
  • + +
    menuYuqingjiankong
    +
    &#xe7f7;
    +
  • + +
  • + +
    menuCuoshiluoshi
    +
    &#xe7f8;
    +
  • + +
  • + +
    menuHome
    +
    &#xe7f9;
    +
  • + +
  • + +
    iconRetract
    +
    &#xe7ee;
    +
  • + +
  • + +
    iconHide
    +
    &#xe7ed;
    +
  • + +
  • + +
    icon2D
    +
    &#xe7e7;
    +
  • + +
  • + +
    iconLayer
    +
    &#xe7e2;
    +
  • + +
  • + +
    iconSearch
    +
    &#xe7e8;
    +
  • + +
  • + +
    iconExpand
    +
    &#xe7e9;
    +
  • + +
  • + +
    iconDownload
    +
    &#xe7ea;
    +
  • + +
  • + +
    iconFillter
    +
    &#xe7eb;
    +
  • + +
  • + +
    icon3D
    +
    &#xe7ec;
    +
  • + +
  • + +
    iconZoomOut
    +
    &#xe7e3;
    +
  • + +
  • + +
    iconZoomIn
    +
    &#xe7e4;
    +
  • + +
  • + +
    iconReset
    +
    &#xe7e5;
    +
  • + +
  • + +
    iconMeasuringTool
    +
    &#xe7e6;
    +
  • + +
  • + +
    iconArrow
    +
    &#xe7e1;
    +
  • + +
  • + +
    iconArrowRightBig
    +
    &#xe7e0;
    +
  • + +
  • + +
    iconSetting
    +
    &#xe7de;
    +
  • + +
  • + +
    iconMore
    +
    &#xe7dd;
    +
  • + +
  • + +
    menuFold
    +
    &#xe7db;
    +
  • + +
  • + +
    menuUnfold
    +
    &#xe7dc;
    +
  • + +
  • + +
    list
    +
    &#xe7da;
    +
  • + +
  • + +
    arrowRight
    +
    &#xe61f;
    +
  • + +
  • + +
    menu
    +
    &#xe7d9;
    +
  • + +
  • + +
    Q2
    +
    &#xe7d5;
    +
  • + +
  • + +
    Q3
    +
    &#xe7d6;
    +
  • + +
  • + +
    Q4
    +
    &#xe7d7;
    +
  • + +
  • + +
    Q1
    +
    &#xe7d8;
    +
  • + +
  • + +
    jiankong
    +
    &#xe7d4;
    +
  • + +
  • + +
    jiankongFill
    +
    &#xe7d3;
    +
  • + +
  • + +
    noData
    +
    &#xe7d2;
    +
  • + +
  • + +
    wubianhua
    +
    &#xe7d1;
    +
  • + +
  • + +
    xiajiang
    +
    &#xe7d0;
    +
  • + +
  • + +
    gutifeiwu
    +
    &#xe7cf;
    +
  • + +
  • + +
    damianji
    +
    &#xe7cb;
    +
  • + +
  • + +
    xiaomianji
    +
    &#xe7cc;
    +
  • + +
  • + +
    jiance
    +
    &#xe7cd;
    +
  • + +
  • + +
    qingpiao
    +
    &#xe7ce;
    +
  • + +
  • + +
    shangxingguoyu
    +
    &#xe7c8;
    +
  • + +
  • + +
    xiaxingguoyu
    +
    &#xe7c9;
    +
  • + +
  • + +
    leijiyunxing
    +
    &#xe7ca;
    +
  • + +
  • + +
    bgCollapse
    +
    &#xe7c7;
    +
  • + +
  • + +
    downOutline
    +
    &#xe7c6;
    +
  • + +
  • + +
    wujiankong
    +
    &#xe7c2;
    +
  • + +
  • + +
    view4
    +
    &#xe7c3;
    +
  • + +
  • + +
    view1
    +
    &#xe7c4;
    +
  • + +
  • + +
    view9
    +
    &#xe7c5;
    +
  • + +
  • + +
    feishuipaifang
    +
    &#xe7bc;
    +
  • + +
  • + +
    shenhe
    +
    &#xe7bd;
    +
  • + +
  • + +
    shenghuolaji
    +
    &#xe7be;
    +
  • + +
  • + +
    feishuichuli
    +
    &#xe7bf;
    +
  • + +
  • + +
    weixianwu
    +
    &#xe7c0;
    +
  • + +
  • + +
    tianbao
    +
    &#xe7c1;
    +
  • + +
  • + +
    6
    +
    &#xe7b7;
    +
  • + +
  • + +
    2
    +
    &#xe7b8;
    +
  • + +
  • + +
    10
    +
    &#xe7b9;
    +
  • + +
  • + +
    11
    +
    &#xe7ba;
    +
  • + +
  • + +
    12
    +
    &#xe7bb;
    +
  • + +
  • + +
    7
    +
    &#xe7b6;
    +
  • + +
  • + +
    9
    +
    &#xe7b0;
    +
  • + +
  • + +
    5
    +
    &#xe7b1;
    +
  • + +
  • + +
    3
    +
    &#xe7b2;
    +
  • + +
  • + +
    8
    +
    &#xe7b3;
    +
  • + +
  • + +
    1
    +
    &#xe7b4;
    +
  • + +
  • + +
    4
    +
    &#xe7b5;
    +
  • + +
  • + +
    shangsheng
    +
    &#xe7a7;
    +
  • + +
  • + +
    siyu
    +
    &#xe7a8;
    +
  • + +
  • + +
    jiyunyu
    +
    &#xe7a9;
    +
  • + +
  • + +
    dieliangmen
    +
    &#xe7aa;
    +
  • + +
  • + +
    shuidianzhanGaojing
    +
    &#xe7ab;
    +
  • + +
  • + +
    biaoji
    +
    &#xe7ac;
    +
  • + +
  • + +
    shengyuji
    +
    &#xe7ad;
    +
  • + +
  • + +
    shuidianzhanWushujv
    +
    &#xe7ae;
    +
  • + +
  • + +
    yudao
    +
    &#xe7af;
    +
  • + +
  • + +
    piaofuwu
    +
    &#xe7a5;
    +
  • + +
  • + +
    shebeiLixian
    +
    &#xe7a6;
    +
  • + +
  • + +
    Android
    +
    &#xe7a3;
    +
  • + +
  • + +
    iOS
    +
    &#xe7a4;
    +
  • + +
  • + +
    rightB
    +
    &#xe7a1;
    +
  • + +
  • + +
    leftB
    +
    &#xe7a2;
    +
  • + +
  • + +
    bellOutlined
    +
    &#xe7a0;
    +
  • + +
  • + +
    shebeiZhengchang
    +
    &#xe79d;
    +
  • + +
  • + +
    shebeiZongshu
    +
    &#xe79e;
    +
  • + +
  • + +
    shebeiYichang
    +
    &#xe79f;
    +
  • + +
  • + +
    xushuiliang
    +
    &#xe79b;
    +
  • + +
  • + +
    time
    +
    &#xe79c;
    +
  • + +
  • + +
    fadianliang
    +
    &#xe79a;
    +
  • + +
  • + +
    zhuangji
    +
    &#xe799;
    +
  • + +
  • + +
    sheshiyunxing
    +
    &#xe791;
    +
  • + +
  • + +
    huanbaodiaocha
    +
    &#xe792;
    +
  • + +
  • + +
    shengtailiuliang2
    +
    &#xe793;
    +
  • + +
  • + +
    cuoshiluoshi
    +
    &#xe794;
    +
  • + +
  • + +
    huanbaofengmao
    +
    &#xe795;
    +
  • + +
  • + +
    huanjingjiance
    +
    &#xe796;
    +
  • + +
  • + +
    shuidianzhan
    +
    &#xe797;
    +
  • + +
  • + +
    zonglan
    +
    &#xe798;
    +
  • + +
  • + +
    设置
    +
    &#xe790;
    +
  • + +
  • + +
    下移
    +
    &#xe636;
    +
  • + +
  • + +
    上移
    +
    &#xe78f;
    +
  • + +
  • + +
    Save
    +
    &#xe662;
    +
  • + +
  • + +
    横杠
    +
    &#xe829;
    +
  • + +
  • + +
    mubiaoguoyushuliang
    +
    &#xe78c;
    +
  • + +
  • + +
    guojiaqixiangzhan
    +
    &#xe78d;
    +
  • + +
  • + +
    shijiguoyuzhonglei
    +
    &#xe78e;
    +
  • + +
  • + +
    shuidianzhan
    +
    &#xe78a;
    +
  • + +
  • + +
    zhuangjirongliang
    +
    &#xe78b;
    +
  • + +
  • + +
    graphItem
    +
    &#xe789;
    +
  • + +
  • + +
    icon_视频播放
    +
    &#xe788;
    +
  • + +
  • + +
    鱼种数量
    +
    &#xe783;
    +
  • + +
  • + +
    淘汰数量
    +
    &#xe784;
    +
  • + +
  • + +
    icon_更多
    +
    &#xe785;
    +
  • + +
  • + +
    icon_传感器
    +
    &#xe786;
    +
  • + +
  • + +
    icon_尾
    +
    &#xe787;
    +
  • + +
  • + +
    鱼苗数量
    +
    &#xe77a;
    +
  • + +
  • + +
    icon_行为预警
    +
    &#xe77b;
    +
  • + +
  • + +
    亲鱼死亡数量
    +
    &#xe77c;
    +
  • + +
  • + +
    产卵数量
    +
    &#xe77d;
    +
  • + +
  • + +
    放流数量
    +
    &#xe77e;
    +
  • + +
  • + +
    采集数量
    +
    &#xe77f;
    +
  • + +
  • + +
    鱼苗死亡数量
    +
    &#xe780;
    +
  • + +
  • + +
    站点数量
    +
    &#xe781;
    +
  • + +
  • + +
    icon_占比
    +
    &#xe782;
    +
  • + +
  • + +
    iconDaping
    +
    &#xe779;
    +
  • + +
  • + +
    iconShujvtianbao
    +
    &#xe772;
    +
  • + +
  • + +
    iconPingmian
    +
    &#xe773;
    +
  • + +
  • + +
    iconShujvguanli
    +
    &#xe774;
    +
  • + +
  • + +
    iconZengzhizhan
    +
    &#xe775;
    +
  • + +
  • + +
    iconZhihuijiance
    +
    &#xe776;
    +
  • + +
  • + +
    left
    +
    &#xe777;
    +
  • + +
  • + +
    right
    +
    &#xe778;
    +
  • + +
  • + +
    iconShujvcaiji
    +
    &#xe76f;
    +
  • + +
  • + +
    icon3D
    +
    &#xe770;
    +
  • + +
  • + +
    return
    +
    &#xe76e;
    +
  • + +
  • + +
    shuizhi
    +
    &#xe76b;
    +
  • + +
  • + +
    chuixiangshuiwen
    +
    &#xe76c;
    +
  • + +
  • + +
    home
    +
    &#xe76d;
    +
  • + +
  • + +
    icon-guanli
    +
    &#xe769;
    +
  • + +
  • + +
    icon-jiance
    +
    &#xe76a;
    +
  • + +
  • + +
    icon-peizhi
    +
    &#xe764;
    +
  • + +
  • + +
    icon-qingkuang
    +
    &#xe765;
    +
  • + +
  • + +
    icon-tongji
    +
    &#xe766;
    +
  • + +
  • + +
    icon-weihu
    +
    &#xe767;
    +
  • + +
  • + +
    icon-zidingyi
    +
    &#xe768;
    +
  • + +
  • + +
    mapPin
    +
    &#xe762;
    +
  • + +
  • + +
    fishMore
    +
    &#xe763;
    +
  • + +
  • + +
    shuizhiyaosushezhi
    +
    &#xe760;
    +
  • + +
  • + +
    rengongshuizhizhan
    +
    &#xe761;
    +
  • + +
  • + +
    closeCircle
    +
    &#xe75e;
    +
  • + +
  • + +
    checkboxCircle
    +
    &#xe75f;
    +
  • + +
  • + +
    stop
    +
    &#xe75d;
    +
  • + +
  • + +
    arrowUp
    +
    &#xe75b;
    +
  • + +
  • + +
    arrowDown
    +
    &#xe75c;
    +
  • + +
  • + +
    guojiashuiwenzhan
    +
    &#xe757;
    +
  • + +
  • + +
    guojiashuizhizhan
    +
    &#xe758;
    +
  • + +
  • + +
    qixiangzhan
    +
    &#xe759;
    +
  • + +
  • + +
    zijianshuiwenzhan
    +
    &#xe75a;
    +
  • + +
  • + +
    配置管理
    +
    &#xe756;
    +
  • + +
  • + +
    lindi
    +
    &#xe755;
    +
  • + +
  • + +
    clearMap
    +
    &#xe750;
    +
  • + +
  • + +
    startPoint
    +
    &#xe751;
    +
  • + +
  • + +
    equipment
    +
    &#xe752;
    +
  • + +
  • + +
    fund
    +
    &#xe753;
    +
  • + +
  • + +
    jiuzhu
    +
    &#xe754;
    +
  • + +
  • + +
    yulei
    +
    &#xe74e;
    +
  • + +
  • + +
    yuleizengzhizhan
    +
    &#xe74f;
    +
  • + +
  • + +
    play-circle
    +
    &#xe744;
    +
  • + +
  • + +
    pause-circle
    +
    &#xe745;
    +
  • + +
  • + +
    normal
    +
    &#xe746;
    +
  • + +
  • + +
    equipment
    +
    &#xe747;
    +
  • + +
  • + +
    people
    +
    &#xe748;
    +
  • + +
  • + +
    dam
    +
    &#xe749;
    +
  • + +
  • + +
    abnormal
    +
    &#xe74a;
    +
  • + +
  • + +
    chart
    +
    &#xe74b;
    +
  • + +
  • + +
    fund
    +
    &#xe74c;
    +
  • + +
  • + +
    waterReplenishing
    +
    &#xe74d;
    +
  • + +
  • + +
    删除
    +
    &#xe66b;
    +
  • + +
  • + +
    添加子节点
    +
    &#xe771;
    +
  • + +
  • + +
    三角上
    +
    &#xe803;
    +
  • + +
  • + +
    三角下
    +
    &#xe808;
    +
  • + +
  • + +
    重置
    +
    &#xe741;
    +
  • + +
  • + +
    搜索
    +
    &#xe742;
    +
  • + +
  • + +
    导航
    +
    &#xe743;
    +
  • + +
  • + +
    详情
    +
    &#xe653;
    +
  • + +
  • + +
    编辑
    +
    &#xe668;
    +
  • + +
  • + +
    接収
    +
    &#xe845;
    +
  • + +
  • + +
    导入
    +
    &#xe73f;
    +
  • + +
  • + +
    导出
    +
    &#xe740;
    +
  • + +
  • + +
    新增
    +
    &#xe667;
    +
  • + +
  • + +
    全屏
    +
    &#xe66d;
    +
  • + +
  • + +
    收起
    +
    &#xe670;
    +
  • + +
  • + +
    设置
    +
    &#xe73c;
    +
  • + +
  • + +
    选择
    +
    &#xe73d;
    +
  • + +
  • + +
    提示
    +
    &#xe73e;
    +
  • + +
  • + +
    预览
    +
    &#xe7ef;
    +
  • + +
  • + +
    添加
    +
    &#xe739;
    +
  • + +
  • + +
    减去
    +
    &#xe73a;
    +
  • + +
  • + +
    关闭
    +
    &#xe73b;
    +
  • + +
  • + +
    map-zidongshuiwenjiance
    +
    &#xe737;
    +
  • + +
  • + +
    map-rengongshuiwenjiance
    +
    &#xe738;
    +
  • + +
  • + +
    info
    +
    &#xe736;
    +
  • + +
  • + +
    map-qixidiyulei
    +
    &#xe735;
    +
  • + +
  • + +
    map-yuleifenbu
    +
    &#xe730;
    +
  • + +
  • + +
    map-rgszzDabiao
    +
    &#xe733;
    +
  • + +
  • + +
    map-rgszzBudabiao
    +
    &#xe734;
    +
  • + +
  • + +
    map-zxsdzGaojing
    +
    &#xe731;
    +
  • + +
  • + +
    map-dxsdzGaojing
    +
    &#xe732;
    +
  • + +
  • + +
    map-qixidi
    +
    &#xe72f;
    +
  • + +
  • + +
    qixidi
    +
    &#xe72e;
    +
  • + +
  • + +
    play
    +
    &#xe72d;
    +
  • + +
  • + +
    moreVideo
    +
    &#xe72c;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-6
    +
    &#xe72a;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-6
    +
    &#xe72b;
    +
  • + +
  • + +
    map-rgszzBudabiao
    +
    &#xe728;
    +
  • + +
  • + +
    map-rgszzDabiao
    +
    &#xe729;
    +
  • + +
  • + +
    map-shipinjiankongzhan
    +
    &#xe727;
    +
  • + +
  • + +
    ranging
    +
    &#xe724;
    +
  • + +
  • + +
    measure
    +
    &#xe725;
    +
  • + +
  • + +
    measuringTool
    +
    &#xe726;
    +
  • + +
  • + +
    poumianfenxi
    +
    &#xe722;
    +
  • + +
  • + +
    clear
    +
    &#xe723;
    +
  • + +
  • + +
    analysisTool
    +
    &#xe71d;
    +
  • + +
  • + +
    module
    +
    &#xe71e;
    +
  • + +
  • + +
    roaming
    +
    &#xe71f;
    +
  • + +
  • + +
    defaultView
    +
    &#xe720;
    +
  • + +
  • + +
    global
    +
    &#xe721;
    +
  • + +
  • + +
    obliquePhotography
    +
    &#xe71c;
    +
  • + +
  • + +
    people
    +
    &#xe71a;
    +
  • + +
  • + +
    sum
    +
    &#xe71b;
    +
  • + +
  • + +
    flowChart
    +
    &#xe719;
    +
  • + +
  • + +
    heduan-0
    +
    &#xe716;
    +
  • + +
  • + +
    map-zxsdzGuihua-light
    +
    &#xe712;
    +
  • + +
  • + +
    map-zxsdzZaijian-light
    +
    &#xe713;
    +
  • + +
  • + +
    map-zxsdzYijian-light
    +
    &#xe714;
    +
  • + +
  • + +
    map-dxsdzZaijian-light
    +
    &#xe715;
    +
  • + +
  • + +
    map-dxsdzYijian-light
    +
    &#xe717;
    +
  • + +
  • + +
    map-dxsdzGuihua-light
    +
    &#xe718;
    +
  • + +
  • + +
    check
    +
    &#xe711;
    +
  • + +
  • + +
    2D
    +
    &#xe710;
    +
  • + +
  • + +
    reset
    +
    &#xe70a;
    +
  • + +
  • + +
    fullScreen2
    +
    &#xe70b;
    +
  • + +
  • + +
    dataTable
    +
    &#xe70c;
    +
  • + +
  • + +
    chartTable
    +
    &#xe70d;
    +
  • + +
  • + +
    lineChart
    +
    &#xe70e;
    +
  • + +
  • + +
    fullScreenExit2
    +
    &#xe70f;
    +
  • + +
  • + +
    map-ssLushengshengtai
    +
    &#xe708;
    +
  • + +
  • + +
    map-ssShuishengshengtai
    +
    &#xe709;
    +
  • + +
  • + +
    shuizhi-3
    +
    &#xe703;
    +
  • + +
  • + +
    shuizhi-5
    +
    &#xe704;
    +
  • + +
  • + +
    shuizhi-4
    +
    &#xe705;
    +
  • + +
  • + +
    shuizhi-2
    +
    &#xe706;
    +
  • + +
  • + +
    shuizhi-1
    +
    &#xe707;
    +
  • + +
  • + +
    map-zxsdzgjShuizhi
    +
    &#xe6c4;
    +
  • + +
  • + +
    map-zxsdzgjShigongcuoshiluoshi
    +
    &#xe6c5;
    +
  • + +
  • + +
    map-zxsdzgjShuiwei
    +
    &#xe6c6;
    +
  • + +
  • + +
    map-zxsdzgjShengtailiuliang
    +
    &#xe702;
    +
  • + +
  • + +
    map-gyssQita
    +
    &#xe6c3;
    +
  • + +
  • + +
    map-qixidituli
    +
    &#xe6f4;
    +
  • + +
  • + +
    map-gyssShengyuji
    +
    &#xe6f5;
    +
  • + +
  • + +
    map-dwsjhQita
    +
    &#xe6f9;
    +
  • + +
  • + +
    map-gyssJiyunyuxitong
    +
    &#xe6fb;
    +
  • + +
  • + +
    map-gyssYudao
    +
    &#xe700;
    +
  • + +
  • + +
    map-gyssFangzirantongdao
    +
    &#xe701;
    +
  • + +
  • + +
    map-gjDongwujiuzhuzhan
    +
    &#xe6f0;
    +
  • + +
  • + +
    map-gjGengongchanluanchang
    +
    &#xe6f1;
    +
  • + +
  • + +
    map-gjQixidi
    +
    &#xe6f2;
    +
  • + +
  • + +
    map-gjYuleizengzhizhan
    +
    &#xe6f3;
    +
  • + +
  • + +
    map-gjZhenxizhiwuyuan
    +
    &#xe6f6;
    +
  • + +
  • + +
    map-gjDiwenshuijianhuan
    +
    &#xe6f7;
    +
  • + +
  • + +
    map-gjGuoyusheshi
    +
    &#xe6f8;
    +
  • + +
  • + +
    map-dxsdzgjShuiwei
    +
    &#xe6fa;
    +
  • + +
  • + +
    map-dxsdzgjShuizhi
    +
    &#xe6fc;
    +
  • + +
  • + +
    map-gjShengtailiuliang
    +
    &#xe6fd;
    +
  • + +
  • + +
    map-dxsdzgjShigongcuoshiluoshi
    +
    &#xe6fe;
    +
  • + +
  • + +
    map-dxsdzgjShengtailiuliang
    +
    &#xe6ff;
    +
  • + +
  • + +
    swap
    +
    &#xe6ef;
    +
  • + +
  • + +
    yaoganyingxiang
    +
    &#xe6ee;
    +
  • + +
  • + +
    liuliangjiancezhan
    +
    &#xe6ec;
    +
  • + +
  • + +
    gaojing
    +
    &#xe6e9;
    +
  • + +
  • + +
    shipinjiankongshebei
    +
    &#xe6ea;
    +
  • + +
  • + +
    xunjian
    +
    &#xe6eb;
    +
  • + +
  • + +
    shuizhijiancezhan
    +
    &#xe6ed;
    +
  • + +
  • + +
    batch
    +
    &#xe6e8;
    +
  • + +
  • + +
    contrast
    +
    &#xe6e7;
    +
  • + +
  • + +
    chengliu
    +
    &#xe6e6;
    +
  • + +
  • + +
    dwsjhGeshuimuqiang
    +
    &#xe6e2;
    +
  • + +
  • + +
    dwsjhDieliangmen
    +
    &#xe6e3;
    +
  • + +
  • + +
    dwsjhQita
    +
    &#xe6e4;
    +
  • + +
  • + +
    dwsjhQianzhidangqiang
    +
    &#xe6e5;
    +
  • + +
  • + +
    captchaOutlined
    +
    &#xe6df;
    +
  • + +
  • + +
    passwordOutlined
    +
    &#xe6e0;
    +
  • + +
  • + +
    userOutlined
    +
    &#xe6e1;
    +
  • + +
  • + +
    dongwujiuzhuzhan
    +
    &#xe6d9;
    +
  • + +
  • + +
    qixidi
    +
    &#xe6da;
    +
  • + +
  • + +
    zhenxizhiwuyuan
    +
    &#xe6db;
    +
  • + +
  • + +
    diwenshuijianhuan
    +
    &#xe6dc;
    +
  • + +
  • + +
    yuleizengzhizhan
    +
    &#xe6dd;
    +
  • + +
  • + +
    guoyusheshi
    +
    &#xe6de;
    +
  • + +
  • + +
    map-dwsjhQianzhidangqiang
    +
    &#xe6c2;
    +
  • + +
  • + +
    map-dwsjhDieliangmenshi
    +
    &#xe6c7;
    +
  • + +
  • + +
    map-dwsjhGeshuimuqiang
    +
    &#xe6c8;
    +
  • + +
  • + +
    map-stllxfssFangliuguan
    +
    &#xe6c9;
    +
  • + +
  • + +
    map-stllxfssFangliukong
    +
    &#xe6ca;
    +
  • + +
  • + +
    map-stllxfssJihefadian
    +
    &#xe6cb;
    +
  • + +
  • + +
    map-stllxfssXiehongzha
    +
    &#xe6cc;
    +
  • + +
  • + +
    map-stllxfssFangliudong
    +
    &#xe6cd;
    +
  • + +
  • + +
    map-stllxfssShengtaijizu
    +
    &#xe6ce;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-5
    +
    &#xe6cf;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-4
    +
    &#xe6d0;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-2
    +
    &#xe6d1;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-5
    +
    &#xe6d2;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-4
    +
    &#xe6d3;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-1
    +
    &#xe6d4;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-2
    +
    &#xe6d5;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-3
    +
    &#xe6d6;
    +
  • + +
  • + +
    map-dxsdzDabiaolv-1
    +
    &#xe6d7;
    +
  • + +
  • + +
    map-zxsdzDabiaolv-3
    +
    &#xe6d8;
    +
  • + +
  • + +
    bg-toggle
    +
    &#xe6c1;
    +
  • + +
  • + +
    map-diwenshuijianhuan
    +
    &#xe6b9;
    +
  • + +
  • + +
    map-qixidi
    +
    &#xe6ba;
    +
  • + +
  • + +
    map-yuleizengzhizhan
    +
    &#xe6bb;
    +
  • + +
  • + +
    map-rengongchanluanchang
    +
    &#xe6bc;
    +
  • + +
  • + +
    map-zhenxizhiwuyuan
    +
    &#xe6bd;
    +
  • + +
  • + +
    map-shengtailiuliang
    +
    &#xe6be;
    +
  • + +
  • + +
    map-dongwujiuzhuzhan
    +
    &#xe6bf;
    +
  • + +
  • + +
    map-guoyusheshi
    +
    &#xe6c0;
    +
  • + +
  • + +
    map-xzXian
    +
    &#xe6b5;
    +
  • + +
  • + +
    map-shengjie
    +
    &#xe6b6;
    +
  • + +
  • + +
    map-xzSheng
    +
    &#xe6b7;
    +
  • + +
  • + +
    map-xzShi
    +
    &#xe6b8;
    +
  • + +
  • + +
    hydroPower
    +
    &#xe6b4;
    +
  • + +
  • + +
    heduan-4
    +
    &#xe69a;
    +
  • + +
  • + +
    heduan-1
    +
    &#xe69b;
    +
  • + +
  • + +
    heduan-5
    +
    &#xe69c;
    +
  • + +
  • + +
    heduan-3
    +
    &#xe69d;
    +
  • + +
  • + +
    heduan-2
    +
    &#xe69e;
    +
  • + +
  • + +
    heliu-3
    +
    &#xe69f;
    +
  • + +
  • + +
    heliu-1
    +
    &#xe6a0;
    +
  • + +
  • + +
    heliu-2
    +
    &#xe6a1;
    +
  • + +
  • + +
    hupo
    +
    &#xe6a2;
    +
  • + +
  • + +
    shuidianjidi
    +
    &#xe6a3;
    +
  • + +
  • + +
    map-gjszzDabiao
    +
    &#xe6a4;
    +
  • + +
  • + +
    map-gjszzBudabiao
    +
    &#xe6a5;
    +
  • + +
  • + +
    map-zjszzDabiao
    +
    &#xe6a6;
    +
  • + +
  • + +
    map-dxsdzGuihua
    +
    &#xe6a7;
    +
  • + +
  • + +
    map-zxsdzZaijian
    +
    &#xe6a8;
    +
  • + +
  • + +
    map-zxsdzGuihua
    +
    &#xe6a9;
    +
  • + +
  • + +
    map-zxsdzYijian
    +
    &#xe6aa;
    +
  • + +
  • + +
    map-dzTushi
    +
    &#xe6ab;
    +
  • + +
  • + +
    map-dabiaolv-3
    +
    &#xe6ac;
    +
  • + +
  • + +
    map-zjszzBudabiao
    +
    &#xe6ad;
    +
  • + +
  • + +
    map-dabiaolv-5
    +
    &#xe6ae;
    +
  • + +
  • + +
    map-dabiaolv-2
    +
    &#xe6af;
    +
  • + +
  • + +
    map-dxsdzZaijian
    +
    &#xe6b0;
    +
  • + +
  • + +
    map-dxsdzYijian
    +
    &#xe6b1;
    +
  • + +
  • + +
    map-dabiaolv-4
    +
    &#xe6b2;
    +
  • + +
  • + +
    map-dabiaolv-1
    +
    &#xe6b3;
    +
  • + +
  • + +
    topOutline
    +
    &#xe697;
    +
  • + +
  • + +
    topFill
    +
    &#xe698;
    +
  • + +
  • + +
    locationSymbol
    +
    &#xe699;
    +
  • + +
  • + +
    right
    +
    &#xe694;
    +
  • + +
  • + +
    left
    +
    &#xe695;
    +
  • + +
  • + +
    search
    +
    &#xe696;
    +
  • + +
  • + +
    fold
    +
    &#xe692;
    +
  • + +
  • + +
    unFold
    +
    &#xe693;
    +
  • + +
  • + +
    tiji
    +
    &#xe689;
    +
  • + +
  • + +
    layer
    +
    &#xe68a;
    +
  • + +
  • + +
    zoomIn
    +
    &#xe68b;
    +
  • + +
  • + +
    3D
    +
    &#xe68c;
    +
  • + +
  • + +
    downLoad
    +
    &#xe68d;
    +
  • + +
  • + +
    zoomOut
    +
    &#xe68e;
    +
  • + +
  • + +
    exitFullScreen
    +
    &#xe68f;
    +
  • + +
  • + +
    topic
    +
    &#xe690;
    +
  • + +
  • + +
    fullScreen
    +
    &#xe691;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1759132832894') format('woff2'),
+       url('iconfont.woff?t=1759132832894') format('woff'),
+       url('iconfont.ttf?t=1759132832894') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + map-yldczz +
    +
    .icon-map-yldczz +
    +
  • + +
  • + +
    + sxjc-fill +
    +
    .icon-sxjc-fill +
    +
  • + +
  • + +
    + yunyuchuan2 +
    +
    .icon-yunyuchuan2 +
    +
  • + +
  • + +
    + ganyushan2 +
    +
    .icon-ganyushan2 +
    +
  • + +
  • + +
    + shengyudou2 +
    +
    .icon-shengyudou2 +
    +
  • + +
  • + +
    + AGV2 +
    +
    .icon-AGV2 +
    +
  • + +
  • + +
    + shipin-fill +
    +
    .icon-shipin-fill +
    +
  • + +
  • + +
    + yljc-fill +
    +
    .icon-yljc-fill +
    +
  • + +
  • + +
    + hjjc2-fill +
    +
    .icon-hjjc2-fill +
    +
  • + +
  • + +
    + star +
    +
    .icon-star +
    +
  • + +
  • + +
    + build +
    +
    .icon-build +
    +
  • + +
  • + +
    + zhatu +
    +
    .icon-zhatu +
    +
  • + +
  • + +
    + dongwubaohu +
    +
    .icon-dongwubaohu +
    +
  • + +
  • + +
    + zhiwubaohu +
    +
    .icon-zhiwubaohu +
    +
  • + +
  • + +
    + jingqu +
    +
    .icon-jingqu +
    +
  • + +
  • + +
    + guoyusheshi2 +
    +
    .icon-guoyusheshi2 +
    +
  • + +
  • + +
    + shuiwen-line +
    +
    .icon-shuiwen-line +
    +
  • + +
  • + +
    + erjibaohu +
    +
    .icon-erjibaohu +
    +
  • + +
  • + +
    + shengzhongdianbh +
    +
    .icon-shengzhongdianbh +
    +
  • + +
  • + +
    + qingpiao +
    +
    .icon-qingpiao1 +
    +
  • + +
  • + +
    + yunxing +
    +
    .icon-yunxing +
    +
  • + +
  • + +
    + fish +
    +
    .icon-fish +
    +
  • + +
  • + +
    + shengtaibaohu-fill +
    +
    .icon-shengtaibaohu-fill +
    +
  • + +
  • + +
    + kejichuangxin-fll +
    +
    .icon-kejichuangxin-fll +
    +
  • + +
  • + +
    + shuitubaochi-fill +
    +
    .icon-shuitubaochi-fill +
    +
  • + +
  • + +
    + huanjingjiance-fill +
    +
    .icon-huanjingjiance-fill +
    +
  • + +
  • + +
    + rongyu-fill +
    +
    .icon-rongyu-fill +
    +
  • + +
  • + +
    + zonglan-fll +
    +
    .icon-zonglan-fll +
    +
  • + +
  • + +
    + yuleibaohu-fill +
    +
    .icon-yuleibaohu-fill +
    +
  • + +
  • + +
    + aihezi +
    +
    .icon-aihezi +
    +
  • + +
  • + +
    + yunyuche +
    +
    .icon-yunyuche +
    +
  • + +
  • + +
    + yudaofangliu +
    +
    .icon-yudaofangliu +
    +
  • + +
  • + +
    + calendar +
    +
    .icon-calendar +
    +
  • + +
  • + +
    + fenbu +
    +
    .icon-fenbu +
    +
  • + +
  • + +
    + view6 +
    +
    .icon-view6 +
    +
  • + +
  • + +
    + play +
    +
    .icon-play1 +
    +
  • + +
  • + +
    + pause +
    +
    .icon-pause +
    +
  • + +
  • + +
    + agvxiaoche +
    +
    .icon-agvxiaoche +
    +
  • + +
  • + +
    + video +
    +
    .icon-video +
    +
  • + +
  • + +
    + dieliangmen +
    +
    .icon-dieliangmen1 +
    +
  • + +
  • + +
    + ganyushan +
    +
    .icon-ganyushan +
    +
  • + +
  • + +
    + liuliangjiancezhan +
    +
    .icon-liuliangjiancezhan1 +
    +
  • + +
  • + +
    + yunyuchuan +
    +
    .icon-yunyuchuan +
    +
  • + +
  • + +
    + zengzhizhanshuizhizhan +
    +
    .icon-zengzhizhanshuizhizhan +
    +
  • + +
  • + +
    + menuYuleiqixidihuanjingjiance +
    +
    .icon-menuYuleiqixidihuanjingjiance +
    +
  • + +
  • + +
    + menuXitongshezhi +
    +
    .icon-menuXitongshezhi +
    +
  • + +
  • + +
    + menuYuleiqixidi +
    +
    .icon-menuYuleiqixidi +
    +
  • + +
  • + +
    + menuFuzhugongneng +
    +
    .icon-menuFuzhugongneng +
    +
  • + +
  • + +
    + iconArrowL +
    +
    .icon-iconArrowL +
    +
  • + +
  • + +
    + yumiao +
    +
    .icon-yumiao +
    +
  • + +
  • + +
    + qizhachuzhi +
    +
    .icon-qizhachuzhi +
    +
  • + +
  • + +
    + iconGlobal +
    +
    .icon-iconGlobal +
    +
  • + +
  • + +
    + iconQuestion +
    +
    .icon-iconQuestion +
    +
  • + +
  • + +
    + menuQixiangjiance +
    +
    .icon-menuQixiangjiance +
    +
  • + +
  • + +
    + menuShuiwenjiance2 +
    +
    .icon-menuShuiwenjiance2 +
    +
  • + +
  • + +
    + close +
    +
    .icon-close +
    +
  • + +
  • + +
    + iconArrowRight +
    +
    .icon-iconArrowRight +
    +
  • + +
  • + +
    + iconWubianhua +
    +
    .icon-iconWubianhua +
    +
  • + +
  • + +
    + iconXiajiang +
    +
    .icon-iconXiajiang +
    +
  • + +
  • + +
    + iconShangsheng +
    +
    .icon-iconShangsheng +
    +
  • + +
  • + +
    + iconWeiguifangmu +
    +
    .icon-iconWeiguifangmu +
    +
  • + +
  • + +
    + iconJiaoshuiyanghu +
    +
    .icon-iconJiaoshuiyanghu +
    +
  • + +
  • + +
    + iconDaitianbao +
    +
    .icon-iconDaitianbao +
    +
  • + +
  • + +
    + iconDaishenhe +
    +
    .icon-iconDaishenhe +
    +
  • + +
  • + +
    + iconLindi +
    +
    .icon-iconLindi +
    +
  • + +
  • + +
    + iconZongmianji +
    +
    .icon-iconZongmianji +
    +
  • + +
  • + +
    + iconWarning +
    +
    .icon-iconWarning +
    +
  • + +
  • + +
    + iconNodata +
    +
    .icon-iconNodata +
    +
  • + +
  • + +
    + iconNormal +
    +
    .icon-iconNormal +
    +
  • + +
  • + +
    + iconYizai +
    +
    .icon-iconYizai +
    +
  • + +
  • + +
    + iconCaodi +
    +
    .icon-iconCaodi +
    +
  • + +
  • + +
    + iconTitle +
    +
    .icon-iconTitle1 +
    +
  • + +
  • + +
    + iconTitle +
    +
    .icon-iconTitle +
    +
  • + +
  • + +
    + iconUser +
    +
    .icon-iconUser1 +
    +
  • + +
  • + +
    + menuDefault +
    +
    .icon-menuDefault +
    +
  • + +
  • + +
    + iconBell +
    +
    .icon-iconBell +
    +
  • + +
  • + +
    + iconFunction +
    +
    .icon-iconFunction +
    +
  • + +
  • + +
    + iconRoaming +
    +
    .icon-iconRoaming +
    +
  • + +
  • + +
    + menuZhinengfenxi +
    +
    .icon-menuZhinengfenxi +
    +
  • + +
  • + +
    + menuShujvchaxun +
    +
    .icon-menuShujvchaxun +
    +
  • + +
  • + +
    + menuZhihuigaojing +
    +
    .icon-menuZhihuigaojing +
    +
  • + +
  • + +
    + menuShuiwenjiance +
    +
    .icon-menuShuiwenjiance +
    +
  • + +
  • + +
    + menuShuizhijiance +
    +
    .icon-menuShuizhijiance +
    +
  • + +
  • + +
    + menuZengzhifangliu +
    +
    .icon-menuZengzhifangliu +
    +
  • + +
  • + +
    + menuDianzhanzhuanti +
    +
    .icon-menuDianzhanzhuanti +
    +
  • + +
  • + +
    + menuSheshiyunxing +
    +
    .icon-menuSheshiyunxing +
    +
  • + +
  • + +
    + menuShuishengdiaocha +
    +
    .icon-menuShuishengdiaocha +
    +
  • + +
  • + +
    + menuLushengdiaocha +
    +
    .icon-menuLushengdiaocha +
    +
  • + +
  • + +
    + menuYuqingjiankong +
    +
    .icon-menuYuqingjiankong +
    +
  • + +
  • + +
    + menuCuoshiluoshi +
    +
    .icon-menuCuoshiluoshi +
    +
  • + +
  • + +
    + menuHome +
    +
    .icon-menuHome +
    +
  • + +
  • + +
    + iconRetract +
    +
    .icon-iconRetract +
    +
  • + +
  • + +
    + iconHide +
    +
    .icon-iconHide +
    +
  • + +
  • + +
    + icon2D +
    +
    .icon-icon2D +
    +
  • + +
  • + +
    + iconLayer +
    +
    .icon-iconLayer +
    +
  • + +
  • + +
    + iconSearch +
    +
    .icon-iconSearch +
    +
  • + +
  • + +
    + iconExpand +
    +
    .icon-iconExpand +
    +
  • + +
  • + +
    + iconDownload +
    +
    .icon-iconDownload +
    +
  • + +
  • + +
    + iconFillter +
    +
    .icon-iconFillter +
    +
  • + +
  • + +
    + icon3D +
    +
    .icon-icon3D1 +
    +
  • + +
  • + +
    + iconZoomOut +
    +
    .icon-iconZoomOut +
    +
  • + +
  • + +
    + iconZoomIn +
    +
    .icon-iconZoomIn +
    +
  • + +
  • + +
    + iconReset +
    +
    .icon-iconReset +
    +
  • + +
  • + +
    + iconMeasuringTool +
    +
    .icon-iconMeasuringTool +
    +
  • + +
  • + +
    + iconArrow +
    +
    .icon-iconArrow +
    +
  • + +
  • + +
    + iconArrowRightBig +
    +
    .icon-iconArrowRightBig +
    +
  • + +
  • + +
    + iconSetting +
    +
    .icon-iconSetting +
    +
  • + +
  • + +
    + iconMore +
    +
    .icon-iconMore +
    +
  • + +
  • + +
    + menuFold +
    +
    .icon-menuFold +
    +
  • + +
  • + +
    + menuUnfold +
    +
    .icon-menuUnfold +
    +
  • + +
  • + +
    + list +
    +
    .icon-list +
    +
  • + +
  • + +
    + arrowRight +
    +
    .icon-tuxing +
    +
  • + +
  • + +
    + menu +
    +
    .icon-menu +
    +
  • + +
  • + +
    + Q2 +
    +
    .icon-Q2 +
    +
  • + +
  • + +
    + Q3 +
    +
    .icon-Q3 +
    +
  • + +
  • + +
    + Q4 +
    +
    .icon-Q4 +
    +
  • + +
  • + +
    + Q1 +
    +
    .icon-Q1 +
    +
  • + +
  • + +
    + jiankong +
    +
    .icon-jiankong +
    +
  • + +
  • + +
    + jiankongFill +
    +
    .icon-jiankongFill +
    +
  • + +
  • + +
    + noData +
    +
    .icon-noData +
    +
  • + +
  • + +
    + wubianhua +
    +
    .icon-wubianhua +
    +
  • + +
  • + +
    + xiajiang +
    +
    .icon-xiajiang +
    +
  • + +
  • + +
    + gutifeiwu +
    +
    .icon-gutifeiwu +
    +
  • + +
  • + +
    + damianji +
    +
    .icon-damianji +
    +
  • + +
  • + +
    + xiaomianji +
    +
    .icon-xiaomianji +
    +
  • + +
  • + +
    + jiance +
    +
    .icon-jiance +
    +
  • + +
  • + +
    + qingpiao +
    +
    .icon-qingpiao +
    +
  • + +
  • + +
    + shangxingguoyu +
    +
    .icon-shangxingguoyu +
    +
  • + +
  • + +
    + xiaxingguoyu +
    +
    .icon-xiaxingguoyu +
    +
  • + +
  • + +
    + leijiyunxing +
    +
    .icon-leijiyunxing +
    +
  • + +
  • + +
    + bgCollapse +
    +
    .icon-bgCollapse +
    +
  • + +
  • + +
    + downOutline +
    +
    .icon-downOutline +
    +
  • + +
  • + +
    + wujiankong +
    +
    .icon-wujiankong +
    +
  • + +
  • + +
    + view4 +
    +
    .icon-view4 +
    +
  • + +
  • + +
    + view1 +
    +
    .icon-view1 +
    +
  • + +
  • + +
    + view9 +
    +
    .icon-view9 +
    +
  • + +
  • + +
    + feishuipaifang +
    +
    .icon-feishuipaifang +
    +
  • + +
  • + +
    + shenhe +
    +
    .icon-shenhe +
    +
  • + +
  • + +
    + shenghuolaji +
    +
    .icon-shenghuolaji +
    +
  • + +
  • + +
    + feishuichuli +
    +
    .icon-feishuichuli +
    +
  • + +
  • + +
    + weixianwu +
    +
    .icon-weixianwu +
    +
  • + +
  • + +
    + tianbao +
    +
    .icon-tianbao +
    +
  • + +
  • + +
    + 6 +
    +
    .icon-a-6 +
    +
  • + +
  • + +
    + 2 +
    +
    .icon-a-2 +
    +
  • + +
  • + +
    + 10 +
    +
    .icon-a-10 +
    +
  • + +
  • + +
    + 11 +
    +
    .icon-a-11 +
    +
  • + +
  • + +
    + 12 +
    +
    .icon-a-12 +
    +
  • + +
  • + +
    + 7 +
    +
    .icon-a-7 +
    +
  • + +
  • + +
    + 9 +
    +
    .icon-a-9 +
    +
  • + +
  • + +
    + 5 +
    +
    .icon-a-5 +
    +
  • + +
  • + +
    + 3 +
    +
    .icon-a-3 +
    +
  • + +
  • + +
    + 8 +
    +
    .icon-a-8 +
    +
  • + +
  • + +
    + 1 +
    +
    .icon-a-1 +
    +
  • + +
  • + +
    + 4 +
    +
    .icon-a-4 +
    +
  • + +
  • + +
    + shangsheng +
    +
    .icon-shangsheng +
    +
  • + +
  • + +
    + siyu +
    +
    .icon-siyu +
    +
  • + +
  • + +
    + jiyunyu +
    +
    .icon-jiyunyu +
    +
  • + +
  • + +
    + dieliangmen +
    +
    .icon-dieliangmen +
    +
  • + +
  • + +
    + shuidianzhanGaojing +
    +
    .icon-shuidianzhanGaojing +
    +
  • + +
  • + +
    + biaoji +
    +
    .icon-biaoji +
    +
  • + +
  • + +
    + shengyuji +
    +
    .icon-shengyuji +
    +
  • + +
  • + +
    + shuidianzhanWushujv +
    +
    .icon-shuidianzhanWushujv +
    +
  • + +
  • + +
    + yudao +
    +
    .icon-yudao +
    +
  • + +
  • + +
    + piaofuwu +
    +
    .icon-piaofuwu +
    +
  • + +
  • + +
    + shebeiLixian +
    +
    .icon-shebeiLixian +
    +
  • + +
  • + +
    + Android +
    +
    .icon-Android +
    +
  • + +
  • + +
    + iOS +
    +
    .icon-iOS +
    +
  • + +
  • + +
    + rightB +
    +
    .icon-rightB +
    +
  • + +
  • + +
    + leftB +
    +
    .icon-leftB +
    +
  • + +
  • + +
    + bellOutlined +
    +
    .icon-bellOutlined +
    +
  • + +
  • + +
    + shebeiZhengchang +
    +
    .icon-shebeiZhengchang +
    +
  • + +
  • + +
    + shebeiZongshu +
    +
    .icon-shebeiZongshu +
    +
  • + +
  • + +
    + shebeiYichang +
    +
    .icon-shebeiYichang +
    +
  • + +
  • + +
    + xushuiliang +
    +
    .icon-xushuiliang +
    +
  • + +
  • + +
    + time +
    +
    .icon-time +
    +
  • + +
  • + +
    + fadianliang +
    +
    .icon-fadianliang +
    +
  • + +
  • + +
    + zhuangji +
    +
    .icon-zhuangji +
    +
  • + +
  • + +
    + sheshiyunxing +
    +
    .icon-sheshiyunxing +
    +
  • + +
  • + +
    + huanbaodiaocha +
    +
    .icon-huanbaodiaocha +
    +
  • + +
  • + +
    + shengtailiuliang2 +
    +
    .icon-shengtailiuliang2 +
    +
  • + +
  • + +
    + cuoshiluoshi +
    +
    .icon-cuoshiluoshi +
    +
  • + +
  • + +
    + huanbaofengmao +
    +
    .icon-huanbaofengmao +
    +
  • + +
  • + +
    + huanjingjiance +
    +
    .icon-huanjingjiance +
    +
  • + +
  • + +
    + shuidianzhan +
    +
    .icon-shuidianzhan1 +
    +
  • + +
  • + +
    + zonglan +
    +
    .icon-zonglan +
    +
  • + +
  • + +
    + 设置 +
    +
    .icon-SetUp +
    +
  • + +
  • + +
    + 下移 +
    +
    .icon-xiayi +
    +
  • + +
  • + +
    + 上移 +
    +
    .icon-shangyi +
    +
  • + +
  • + +
    + Save +
    +
    .icon-Save +
    +
  • + +
  • + +
    + 横杠 +
    +
    .icon-icon_horizontal_bar +
    +
  • + +
  • + +
    + mubiaoguoyushuliang +
    +
    .icon-mubiaoguoyushuliang +
    +
  • + +
  • + +
    + guojiaqixiangzhan +
    +
    .icon-guojiaqixiangzhan +
    +
  • + +
  • + +
    + shijiguoyuzhonglei +
    +
    .icon-shijiguoyuzhonglei +
    +
  • + +
  • + +
    + shuidianzhan +
    +
    .icon-shuidianzhan +
    +
  • + +
  • + +
    + zhuangjirongliang +
    +
    .icon-zhuangjirongliang +
    +
  • + +
  • + +
    + graphItem +
    +
    .icon-graphItem +
    +
  • + +
  • + +
    + icon_视频播放 +
    +
    .icon-icon_shipinbofang +
    +
  • + +
  • + +
    + 鱼种数量 +
    +
    .icon-yuzhongshuliang +
    +
  • + +
  • + +
    + 淘汰数量 +
    +
    .icon-taotaishuliang +
    +
  • + +
  • + +
    + icon_更多 +
    +
    .icon-icon_gengduo +
    +
  • + +
  • + +
    + icon_传感器 +
    +
    .icon-icon_chuanganqi +
    +
  • + +
  • + +
    + icon_尾 +
    +
    .icon-icon_wei +
    +
  • + +
  • + +
    + 鱼苗数量 +
    +
    .icon-yumiaoshuliang +
    +
  • + +
  • + +
    + icon_行为预警 +
    +
    .icon-icon_hangweiyujing +
    +
  • + +
  • + +
    + 亲鱼死亡数量 +
    +
    .icon-qinyusiwangshuliang +
    +
  • + +
  • + +
    + 产卵数量 +
    +
    .icon-chanluanshuliang +
    +
  • + +
  • + +
    + 放流数量 +
    +
    .icon-fangliushuliang +
    +
  • + +
  • + +
    + 采集数量 +
    +
    .icon-caijishuliang +
    +
  • + +
  • + +
    + 鱼苗死亡数量 +
    +
    .icon-yumiaosiwangshuliang +
    +
  • + +
  • + +
    + 站点数量 +
    +
    .icon-zhandianshuliang +
    +
  • + +
  • + +
    + icon_占比 +
    +
    .icon-icon_zhanbi +
    +
  • + +
  • + +
    + iconDaping +
    +
    .icon-iconDaping +
    +
  • + +
  • + +
    + iconShujvtianbao +
    +
    .icon-iconShujvtianbao +
    +
  • + +
  • + +
    + iconPingmian +
    +
    .icon-iconPingmian +
    +
  • + +
  • + +
    + iconShujvguanli +
    +
    .icon-iconShujvguanli +
    +
  • + +
  • + +
    + iconZengzhizhan +
    +
    .icon-iconZengzhizhan +
    +
  • + +
  • + +
    + iconZhihuijiance +
    +
    .icon-iconZhihuijiance +
    +
  • + +
  • + +
    + left +
    +
    .icon-left1 +
    +
  • + +
  • + +
    + right +
    +
    .icon-right1 +
    +
  • + +
  • + +
    + iconShujvcaiji +
    +
    .icon-iconShujvcaiji +
    +
  • + +
  • + +
    + icon3D +
    +
    .icon-icon3D +
    +
  • + +
  • + +
    + return +
    +
    .icon-return +
    +
  • + +
  • + +
    + shuizhi +
    +
    .icon-shuizhi +
    +
  • + +
  • + +
    + chuixiangshuiwen +
    +
    .icon-chuixiangshuiwen +
    +
  • + +
  • + +
    + home +
    +
    .icon-home +
    +
  • + +
  • + +
    + icon-guanli +
    +
    .icon-icon-guanli +
    +
  • + +
  • + +
    + icon-jiance +
    +
    .icon-icon-jiance +
    +
  • + +
  • + +
    + icon-peizhi +
    +
    .icon-icon-peizhi +
    +
  • + +
  • + +
    + icon-qingkuang +
    +
    .icon-icon-qingkuang +
    +
  • + +
  • + +
    + icon-tongji +
    +
    .icon-icon-tongji +
    +
  • + +
  • + +
    + icon-weihu +
    +
    .icon-icon-weihu +
    +
  • + +
  • + +
    + icon-zidingyi +
    +
    .icon-icon-zidingyi +
    +
  • + +
  • + +
    + mapPin +
    +
    .icon-mapPin +
    +
  • + +
  • + +
    + fishMore +
    +
    .icon-fishMore +
    +
  • + +
  • + +
    + shuizhiyaosushezhi +
    +
    .icon-shuizhiyaosushezhi +
    +
  • + +
  • + +
    + rengongshuizhizhan +
    +
    .icon-rengongshuizhizhan +
    +
  • + +
  • + +
    + closeCircle +
    +
    .icon-closeCircle +
    +
  • + +
  • + +
    + checkboxCircle +
    +
    .icon-checkboxCircle +
    +
  • + +
  • + +
    + stop +
    +
    .icon-stop +
    +
  • + +
  • + +
    + arrowUp +
    +
    .icon-arrowUp +
    +
  • + +
  • + +
    + arrowDown +
    +
    .icon-arrowDown +
    +
  • + +
  • + +
    + guojiashuiwenzhan +
    +
    .icon-guojiashuiwenzhan +
    +
  • + +
  • + +
    + guojiashuizhizhan +
    +
    .icon-guojiashuizhizhan +
    +
  • + +
  • + +
    + qixiangzhan +
    +
    .icon-qixiangzhan +
    +
  • + +
  • + +
    + zijianshuiwenzhan +
    +
    .icon-zijianshuiwenzhan +
    +
  • + +
  • + +
    + 配置管理 +
    +
    .icon-Dispose +
    +
  • + +
  • + +
    + lindi +
    +
    .icon-lindi +
    +
  • + +
  • + +
    + clearMap +
    +
    .icon-clearMap +
    +
  • + +
  • + +
    + startPoint +
    +
    .icon-startPoint +
    +
  • + +
  • + +
    + equipment +
    +
    .icon-equipment1 +
    +
  • + +
  • + +
    + fund +
    +
    .icon-fund1 +
    +
  • + +
  • + +
    + jiuzhu +
    +
    .icon-jiuzhu +
    +
  • + +
  • + +
    + yulei +
    +
    .icon-yulei +
    +
  • + +
  • + +
    + yuleizengzhizhan +
    +
    .icon-yuleizengzhizhan1 +
    +
  • + +
  • + +
    + play-circle +
    +
    .icon-play-circle +
    +
  • + +
  • + +
    + pause-circle +
    +
    .icon-pause-circle +
    +
  • + +
  • + +
    + normal +
    +
    .icon-normal +
    +
  • + +
  • + +
    + equipment +
    +
    .icon-equipment +
    +
  • + +
  • + +
    + people +
    +
    .icon-people1 +
    +
  • + +
  • + +
    + dam +
    +
    .icon-dam +
    +
  • + +
  • + +
    + abnormal +
    +
    .icon-abnormal +
    +
  • + +
  • + +
    + chart +
    +
    .icon-chart +
    +
  • + +
  • + +
    + fund +
    +
    .icon-fund +
    +
  • + +
  • + +
    + waterReplenishing +
    +
    .icon-waterReplenishing +
    +
  • + +
  • + +
    + 删除 +
    +
    .icon-Delete1 +
    +
  • + +
  • + +
    + 添加子节点 +
    +
    .icon-AddChildNode +
    +
  • + +
  • + +
    + 三角上 +
    +
    .icon-icon_small_up +
    +
  • + +
  • + +
    + 三角下 +
    +
    .icon-icon_small_down +
    +
  • + +
  • + +
    + 重置 +
    +
    .icon-Redo +
    +
  • + +
  • + +
    + 搜索 +
    +
    .icon-Search +
    +
  • + +
  • + +
    + 导航 +
    +
    .icon-daohang +
    +
  • + +
  • + +
    + 详情 +
    +
    .icon-Details +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-Edit +
    +
  • + +
  • + +
    + 接収 +
    +
    .icon-icon_receiving +
    +
  • + +
  • + +
    + 导入 +
    +
    .icon-Import1 +
    +
  • + +
  • + +
    + 导出 +
    +
    .icon-Export +
    +
  • + +
  • + +
    + 新增 +
    +
    .icon-Add1 +
    +
  • + +
  • + +
    + 全屏 +
    +
    .icon-FullScreen +
    +
  • + +
  • + +
    + 收起 +
    +
    .icon-PutAway +
    +
  • + +
  • + +
    + 设置 +
    +
    .icon-Install +
    +
  • + +
  • + +
    + 选择 +
    +
    .icon-Determine +
    +
  • + +
  • + +
    + 提示 +
    +
    .icon-InfoCircle +
    +
  • + +
  • + +
    + 预览 +
    +
    .icon-Preview +
    +
  • + +
  • + +
    + 添加 +
    +
    .icon-AddTo +
    +
  • + +
  • + +
    + 减去 +
    +
    .icon-Subtract +
    +
  • + +
  • + +
    + 关闭 +
    +
    .icon-Close +
    +
  • + +
  • + +
    + map-zidongshuiwenjiance +
    +
    .icon-map-zidongshuiwenjiance +
    +
  • + +
  • + +
    + map-rengongshuiwenjiance +
    +
    .icon-map-rengongshuiwenjiance +
    +
  • + +
  • + +
    + info +
    +
    .icon-info +
    +
  • + +
  • + +
    + map-qixidiyulei +
    +
    .icon-map-qixidiyulei +
    +
  • + +
  • + +
    + map-yuleifenbu +
    +
    .icon-map-yuleifenbu +
    +
  • + +
  • + +
    + map-rgszzDabiao +
    +
    .icon-map-rgszzDabiao1 +
    +
  • + +
  • + +
    + map-rgszzBudabiao +
    +
    .icon-map-rgszzBudabiao1 +
    +
  • + +
  • + +
    + map-zxsdzGaojing +
    +
    .icon-map-zxsdzGaojing +
    +
  • + +
  • + +
    + map-dxsdzGaojing +
    +
    .icon-map-dxsdzGaojing +
    +
  • + +
  • + +
    + map-qixidi +
    +
    .icon-map-qixidituli +
    +
  • + +
  • + +
    + qixidi +
    +
    .icon-qixidi +
    +
  • + +
  • + +
    + play +
    +
    .icon-play +
    +
  • + +
  • + +
    + moreVideo +
    +
    .icon-moreVideo +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-6 +
    +
    .icon-map-zxsdzDabiaolv-6 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-6 +
    +
    .icon-map-dxsdzDabiaolv-6 +
    +
  • + +
  • + +
    + map-rgszzBudabiao +
    +
    .icon-map-rgszzBudabiao +
    +
  • + +
  • + +
    + map-rgszzDabiao +
    +
    .icon-map-rgszzDabiao +
    +
  • + +
  • + +
    + map-shipinjiankongzhan +
    +
    .icon-map-shipinjiankongzhan +
    +
  • + +
  • + +
    + ranging +
    +
    .icon-ranging +
    +
  • + +
  • + +
    + measure +
    +
    .icon-measure +
    +
  • + +
  • + +
    + measuringTool +
    +
    .icon-measuringTool +
    +
  • + +
  • + +
    + poumianfenxi +
    +
    .icon-poumianfenxi +
    +
  • + +
  • + +
    + clear +
    +
    .icon-clear +
    +
  • + +
  • + +
    + analysisTool +
    +
    .icon-analysisTool +
    +
  • + +
  • + +
    + module +
    +
    .icon-module +
    +
  • + +
  • + +
    + roaming +
    +
    .icon-roaming +
    +
  • + +
  • + +
    + defaultView +
    +
    .icon-defaultView +
    +
  • + +
  • + +
    + global +
    +
    .icon-global +
    +
  • + +
  • + +
    + obliquePhotography +
    +
    .icon-obliquePhotography +
    +
  • + +
  • + +
    + people +
    +
    .icon-people +
    +
  • + +
  • + +
    + sum +
    +
    .icon-sum +
    +
  • + +
  • + +
    + flowChart +
    +
    .icon-flowChart +
    +
  • + +
  • + +
    + heduan-0 +
    +
    .icon-heduan-0 +
    +
  • + +
  • + +
    + map-zxsdzGuihua-light +
    +
    .icon-map-zxsdzGuihua-light +
    +
  • + +
  • + +
    + map-zxsdzZaijian-light +
    +
    .icon-map-zxsdzZaijian-light +
    +
  • + +
  • + +
    + map-zxsdzYijian-light +
    +
    .icon-map-zxsdzYijian-light +
    +
  • + +
  • + +
    + map-dxsdzZaijian-light +
    +
    .icon-map-dxsdzZaijian-light +
    +
  • + +
  • + +
    + map-dxsdzYijian-light +
    +
    .icon-map-dxsdzYijian-light +
    +
  • + +
  • + +
    + map-dxsdzGuihua-light +
    +
    .icon-map-dxsdzGuihua-light +
    +
  • + +
  • + +
    + check +
    +
    .icon-check +
    +
  • + +
  • + +
    + 2D +
    +
    .icon-a-2D +
    +
  • + +
  • + +
    + reset +
    +
    .icon-reset +
    +
  • + +
  • + +
    + fullScreen2 +
    +
    .icon-fullScreen2 +
    +
  • + +
  • + +
    + dataTable +
    +
    .icon-dataTable +
    +
  • + +
  • + +
    + chartTable +
    +
    .icon-chartTable +
    +
  • + +
  • + +
    + lineChart +
    +
    .icon-lineChart +
    +
  • + +
  • + +
    + fullScreenExit2 +
    +
    .icon-fullScreenExit2 +
    +
  • + +
  • + +
    + map-ssLushengshengtai +
    +
    .icon-map-ssLushengshengtai +
    +
  • + +
  • + +
    + map-ssShuishengshengtai +
    +
    .icon-map-ssShuishengshengtai +
    +
  • + +
  • + +
    + shuizhi-3 +
    +
    .icon-shuizhi-3 +
    +
  • + +
  • + +
    + shuizhi-5 +
    +
    .icon-shuizhi-5 +
    +
  • + +
  • + +
    + shuizhi-4 +
    +
    .icon-shuizhi-4 +
    +
  • + +
  • + +
    + shuizhi-2 +
    +
    .icon-shuizhi-2 +
    +
  • + +
  • + +
    + shuizhi-1 +
    +
    .icon-shuizhi-1 +
    +
  • + +
  • + +
    + map-zxsdzgjShuizhi +
    +
    .icon-map-zxsdzgjShuizhi +
    +
  • + +
  • + +
    + map-zxsdzgjShigongcuoshiluoshi +
    +
    .icon-map-zxsdzgjShigongcuoshiluoshi +
    +
  • + +
  • + +
    + map-zxsdzgjShuiwei +
    +
    .icon-map-zxsdzgjShuiwei +
    +
  • + +
  • + +
    + map-zxsdzgjShengtailiuliang +
    +
    .icon-map-zxsdzgjShengtailiuliang +
    +
  • + +
  • + +
    + map-gyssQita +
    +
    .icon-map-gyssQita +
    +
  • + +
  • + +
    + map-qixidituli +
    +
    .icon-map-qixidituli_v1 +
    +
  • + +
  • + +
    + map-gyssShengyuji +
    +
    .icon-map-gyssShengyuji +
    +
  • + +
  • + +
    + map-dwsjhQita +
    +
    .icon-map-dwsjhQita1 +
    +
  • + +
  • + +
    + map-gyssJiyunyuxitong +
    +
    .icon-map-gyssJiyunyuxitong +
    +
  • + +
  • + +
    + map-gyssYudao +
    +
    .icon-map-gyssYudao +
    +
  • + +
  • + +
    + map-gyssFangzirantongdao +
    +
    .icon-map-gyssFangzirantongdao +
    +
  • + +
  • + +
    + map-gjDongwujiuzhuzhan +
    +
    .icon-map-gjDongwujiuzhuzhan +
    +
  • + +
  • + +
    + map-gjGengongchanluanchang +
    +
    .icon-map-gjGengongchanluanchang +
    +
  • + +
  • + +
    + map-gjQixidi +
    +
    .icon-map-gjQixidi_v1 +
    +
  • + +
  • + +
    + map-gjYuleizengzhizhan +
    +
    .icon-map-gjYuleizengzhizhan +
    +
  • + +
  • + +
    + map-gjZhenxizhiwuyuan +
    +
    .icon-map-gjZhenxizhiwuyuan +
    +
  • + +
  • + +
    + map-gjDiwenshuijianhuan +
    +
    .icon-map-gjDiwenshuijianhuan +
    +
  • + +
  • + +
    + map-gjGuoyusheshi +
    +
    .icon-map-gjGuoyusheshi +
    +
  • + +
  • + +
    + map-dxsdzgjShuiwei +
    +
    .icon-map-dxsdzgjShuiwei +
    +
  • + +
  • + +
    + map-dxsdzgjShuizhi +
    +
    .icon-map-dxsdzgjShuizhi +
    +
  • + +
  • + +
    + map-gjShengtailiuliang +
    +
    .icon-map-gjShengtailiuliang +
    +
  • + +
  • + +
    + map-dxsdzgjShigongcuoshiluoshi +
    +
    .icon-map-dxsdzgjShigongcuoshiluoshi +
    +
  • + +
  • + +
    + map-dxsdzgjShengtailiuliang +
    +
    .icon-map-dxsdzgjShengtailiuliang +
    +
  • + +
  • + +
    + swap +
    +
    .icon-swap +
    +
  • + +
  • + +
    + yaoganyingxiang +
    +
    .icon-yaoganyingxiang +
    +
  • + +
  • + +
    + liuliangjiancezhan +
    +
    .icon-liuliangjiancezhan +
    +
  • + +
  • + +
    + gaojing +
    +
    .icon-gaojing +
    +
  • + +
  • + +
    + shipinjiankongshebei +
    +
    .icon-shipinjiankongshebei +
    +
  • + +
  • + +
    + xunjian +
    +
    .icon-xunjian +
    +
  • + +
  • + +
    + shuizhijiancezhan +
    +
    .icon-shuizhijiancezhan +
    +
  • + +
  • + +
    + batch +
    +
    .icon-batch +
    +
  • + +
  • + +
    + contrast +
    +
    .icon-contrast +
    +
  • + +
  • + +
    + chengliu +
    +
    .icon-chengliu +
    +
  • + +
  • + +
    + dwsjhGeshuimuqiang +
    +
    .icon-dwsjhGeshuimuqiang +
    +
  • + +
  • + +
    + dwsjhDieliangmen +
    +
    .icon-dwsjhDieliangmen +
    +
  • + +
  • + +
    + dwsjhQita +
    +
    .icon-dwsjhQita +
    +
  • + +
  • + +
    + dwsjhQianzhidangqiang +
    +
    .icon-dwsjhQianzhidangqiang +
    +
  • + +
  • + +
    + captchaOutlined +
    +
    .icon-captchaOutlined +
    +
  • + +
  • + +
    + passwordOutlined +
    +
    .icon-passwordOutlined +
    +
  • + +
  • + +
    + userOutlined +
    +
    .icon-userOutlined +
    +
  • + +
  • + +
    + dongwujiuzhuzhan +
    +
    .icon-dongwujiuzhuzhan +
    +
  • + +
  • + +
    + qixidi +
    +
    .icon-qixidi_v1 +
    +
  • + +
  • + +
    + zhenxizhiwuyuan +
    +
    .icon-zhenxizhiwuyuan +
    +
  • + +
  • + +
    + diwenshuijianhuan +
    +
    .icon-diwenshuijianhuan +
    +
  • + +
  • + +
    + yuleizengzhizhan +
    +
    .icon-yuleizengzhizhan +
    +
  • + +
  • + +
    + guoyusheshi +
    +
    .icon-guoyusheshi +
    +
  • + +
  • + +
    + map-dwsjhQianzhidangqiang +
    +
    .icon-map-dwsjhQianzhidangqiang +
    +
  • + +
  • + +
    + map-dwsjhDieliangmenshi +
    +
    .icon-map-dwsjhDieliangmenshi +
    +
  • + +
  • + +
    + map-dwsjhGeshuimuqiang +
    +
    .icon-map-dwsjhGeshuimuqiang +
    +
  • + +
  • + +
    + map-stllxfssFangliuguan +
    +
    .icon-map-stllxfssFangliuguan +
    +
  • + +
  • + +
    + map-stllxfssFangliukong +
    +
    .icon-map-stllxfssFangliukong +
    +
  • + +
  • + +
    + map-stllxfssJihefadian +
    +
    .icon-map-stllxfssJihefadian +
    +
  • + +
  • + +
    + map-stllxfssXiehongzha +
    +
    .icon-map-stllxfssXiehongzha +
    +
  • + +
  • + +
    + map-stllxfssFangliudong +
    +
    .icon-map-stllxfssFangliudong +
    +
  • + +
  • + +
    + map-stllxfssShengtaijizu +
    +
    .icon-map-stllxfssShengtaijizu +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-5 +
    +
    .icon-map-zxsdzDabiaolv-5 +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-4 +
    +
    .icon-map-zxsdzDabiaolv-4 +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-2 +
    +
    .icon-map-zxsdzDabiaolv-2 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-5 +
    +
    .icon-map-dxsdzDabiaolv-5 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-4 +
    +
    .icon-map-dxsdzDabiaolv-4 +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-1 +
    +
    .icon-map-zxsdzDabiaolv-1 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-2 +
    +
    .icon-map-dxsdzDabiaolv-2 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-3 +
    +
    .icon-map-dxsdzDabiaolv-3 +
    +
  • + +
  • + +
    + map-dxsdzDabiaolv-1 +
    +
    .icon-map-dxsdzDabiaolv-1 +
    +
  • + +
  • + +
    + map-zxsdzDabiaolv-3 +
    +
    .icon-map-zxsdzDabiaolv-3 +
    +
  • + +
  • + +
    + bg-toggle +
    +
    .icon-bg-toggle +
    +
  • + +
  • + +
    + map-diwenshuijianhuan +
    +
    .icon-map-diwenshuijianhuan +
    +
  • + +
  • + +
    + map-qixidi +
    +
    .icon-map-qixidi +
    +
  • + +
  • + +
    + map-yuleizengzhizhan +
    +
    .icon-map-yuleizengzhizhan +
    +
  • + +
  • + +
    + map-rengongchanluanchang +
    +
    .icon-map-rengongchanluanchang +
    +
  • + +
  • + +
    + map-zhenxizhiwuyuan +
    +
    .icon-map-zhenxizhiwuyuan +
    +
  • + +
  • + +
    + map-shengtailiuliang +
    +
    .icon-map-shengtailiuliang +
    +
  • + +
  • + +
    + map-dongwujiuzhuzhan +
    +
    .icon-map-dongwujiuzhuzhan +
    +
  • + +
  • + +
    + map-guoyusheshi +
    +
    .icon-map-guoyusheshi +
    +
  • + +
  • + +
    + map-xzXian +
    +
    .icon-map-xzXian +
    +
  • + +
  • + +
    + map-shengjie +
    +
    .icon-map-shengjie +
    +
  • + +
  • + +
    + map-xzSheng +
    +
    .icon-map-xzSheng +
    +
  • + +
  • + +
    + map-xzShi +
    +
    .icon-map-xzShi +
    +
  • + +
  • + +
    + hydroPower +
    +
    .icon-hydroPower +
    +
  • + +
  • + +
    + heduan-4 +
    +
    .icon-heduan-4 +
    +
  • + +
  • + +
    + heduan-1 +
    +
    .icon-heduan-1 +
    +
  • + +
  • + +
    + heduan-5 +
    +
    .icon-heduan-5 +
    +
  • + +
  • + +
    + heduan-3 +
    +
    .icon-heduan-3 +
    +
  • + +
  • + +
    + heduan-2 +
    +
    .icon-heduan-2 +
    +
  • + +
  • + +
    + heliu-3 +
    +
    .icon-heliu-3 +
    +
  • + +
  • + +
    + heliu-1 +
    +
    .icon-heliu-1 +
    +
  • + +
  • + +
    + heliu-2 +
    +
    .icon-heliu-2 +
    +
  • + +
  • + +
    + hupo +
    +
    .icon-hupo +
    +
  • + +
  • + +
    + shuidianjidi +
    +
    .icon-shuidianjidi +
    +
  • + +
  • + +
    + map-gjszzDabiao +
    +
    .icon-map-gjszzDabiao +
    +
  • + +
  • + +
    + map-gjszzBudabiao +
    +
    .icon-map-gjszzBudabiao +
    +
  • + +
  • + +
    + map-zjszzDabiao +
    +
    .icon-map-zjszzDabiao +
    +
  • + +
  • + +
    + map-dxsdzGuihua +
    +
    .icon-map-dxsdzGuihua +
    +
  • + +
  • + +
    + map-zxsdzZaijian +
    +
    .icon-map-zxsdzZaijian +
    +
  • + +
  • + +
    + map-zxsdzGuihua +
    +
    .icon-map-zxsdzGuihua +
    +
  • + +
  • + +
    + map-zxsdzYijian +
    +
    .icon-map-zxsdzYijian +
    +
  • + +
  • + +
    + map-dzTushi +
    +
    .icon-map-dzTushi +
    +
  • + +
  • + +
    + map-dabiaolv-3 +
    +
    .icon-map-dabiaolv-3 +
    +
  • + +
  • + +
    + map-zjszzBudabiao +
    +
    .icon-map-zjszzBudabiao +
    +
  • + +
  • + +
    + map-dabiaolv-5 +
    +
    .icon-map-dabiaolv-5 +
    +
  • + +
  • + +
    + map-dabiaolv-2 +
    +
    .icon-map-dabiaolv-2 +
    +
  • + +
  • + +
    + map-dxsdzZaijian +
    +
    .icon-map-dxsdzZaijian +
    +
  • + +
  • + +
    + map-dxsdzYijian +
    +
    .icon-map-dxsdzYijian +
    +
  • + +
  • + +
    + map-dabiaolv-4 +
    +
    .icon-map-dabiaolv-4 +
    +
  • + +
  • + +
    + map-dabiaolv-1 +
    +
    .icon-map-dabiaolv-1 +
    +
  • + +
  • + +
    + topOutline +
    +
    .icon-topOutline +
    +
  • + +
  • + +
    + topFill +
    +
    .icon-topFill +
    +
  • + +
  • + +
    + locationSymbol +
    +
    .icon-locationSymbol +
    +
  • + +
  • + +
    + right +
    +
    .icon-right +
    +
  • + +
  • + +
    + left +
    +
    .icon-left +
    +
  • + +
  • + +
    + search +
    +
    .icon-search +
    +
  • + +
  • + +
    + fold +
    +
    .icon-fold +
    +
  • + +
  • + +
    + unFold +
    +
    .icon-unFold +
    +
  • + +
  • + +
    + tiji +
    +
    .icon-tiji +
    +
  • + +
  • + +
    + layer +
    +
    .icon-layer +
    +
  • + +
  • + +
    + zoomIn +
    +
    .icon-zoomIn +
    +
  • + +
  • + +
    + 3D +
    +
    .icon-a-3D +
    +
  • + +
  • + +
    + downLoad +
    +
    .icon-downLoad +
    +
  • + +
  • + +
    + zoomOut +
    +
    .icon-zoomOut +
    +
  • + +
  • + +
    + exitFullScreen +
    +
    .icon-exitFullScreen +
    +
  • + +
  • + +
    + topic +
    +
    .icon-topic +
    +
  • + +
  • + +
    + fullScreen +
    +
    .icon-fullScreen +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    map-yldczz
    +
    #icon-map-yldczz
    +
  • + +
  • + +
    sxjc-fill
    +
    #icon-sxjc-fill
    +
  • + +
  • + +
    yunyuchuan2
    +
    #icon-yunyuchuan2
    +
  • + +
  • + +
    ganyushan2
    +
    #icon-ganyushan2
    +
  • + +
  • + +
    shengyudou2
    +
    #icon-shengyudou2
    +
  • + +
  • + +
    AGV2
    +
    #icon-AGV2
    +
  • + +
  • + +
    shipin-fill
    +
    #icon-shipin-fill
    +
  • + +
  • + +
    yljc-fill
    +
    #icon-yljc-fill
    +
  • + +
  • + +
    hjjc2-fill
    +
    #icon-hjjc2-fill
    +
  • + +
  • + +
    star
    +
    #icon-star
    +
  • + +
  • + +
    build
    +
    #icon-build
    +
  • + +
  • + +
    zhatu
    +
    #icon-zhatu
    +
  • + +
  • + +
    dongwubaohu
    +
    #icon-dongwubaohu
    +
  • + +
  • + +
    zhiwubaohu
    +
    #icon-zhiwubaohu
    +
  • + +
  • + +
    jingqu
    +
    #icon-jingqu
    +
  • + +
  • + +
    guoyusheshi2
    +
    #icon-guoyusheshi2
    +
  • + +
  • + +
    shuiwen-line
    +
    #icon-shuiwen-line
    +
  • + +
  • + +
    erjibaohu
    +
    #icon-erjibaohu
    +
  • + +
  • + +
    shengzhongdianbh
    +
    #icon-shengzhongdianbh
    +
  • + +
  • + +
    qingpiao
    +
    #icon-qingpiao1
    +
  • + +
  • + +
    yunxing
    +
    #icon-yunxing
    +
  • + +
  • + +
    fish
    +
    #icon-fish
    +
  • + +
  • + +
    shengtaibaohu-fill
    +
    #icon-shengtaibaohu-fill
    +
  • + +
  • + +
    kejichuangxin-fll
    +
    #icon-kejichuangxin-fll
    +
  • + +
  • + +
    shuitubaochi-fill
    +
    #icon-shuitubaochi-fill
    +
  • + +
  • + +
    huanjingjiance-fill
    +
    #icon-huanjingjiance-fill
    +
  • + +
  • + +
    rongyu-fill
    +
    #icon-rongyu-fill
    +
  • + +
  • + +
    zonglan-fll
    +
    #icon-zonglan-fll
    +
  • + +
  • + +
    yuleibaohu-fill
    +
    #icon-yuleibaohu-fill
    +
  • + +
  • + +
    aihezi
    +
    #icon-aihezi
    +
  • + +
  • + +
    yunyuche
    +
    #icon-yunyuche
    +
  • + +
  • + +
    yudaofangliu
    +
    #icon-yudaofangliu
    +
  • + +
  • + +
    calendar
    +
    #icon-calendar
    +
  • + +
  • + +
    fenbu
    +
    #icon-fenbu
    +
  • + +
  • + +
    view6
    +
    #icon-view6
    +
  • + +
  • + +
    play
    +
    #icon-play1
    +
  • + +
  • + +
    pause
    +
    #icon-pause
    +
  • + +
  • + +
    agvxiaoche
    +
    #icon-agvxiaoche
    +
  • + +
  • + +
    video
    +
    #icon-video
    +
  • + +
  • + +
    dieliangmen
    +
    #icon-dieliangmen1
    +
  • + +
  • + +
    ganyushan
    +
    #icon-ganyushan
    +
  • + +
  • + +
    liuliangjiancezhan
    +
    #icon-liuliangjiancezhan1
    +
  • + +
  • + +
    yunyuchuan
    +
    #icon-yunyuchuan
    +
  • + +
  • + +
    zengzhizhanshuizhizhan
    +
    #icon-zengzhizhanshuizhizhan
    +
  • + +
  • + +
    menuYuleiqixidihuanjingjiance
    +
    #icon-menuYuleiqixidihuanjingjiance
    +
  • + +
  • + +
    menuXitongshezhi
    +
    #icon-menuXitongshezhi
    +
  • + +
  • + +
    menuYuleiqixidi
    +
    #icon-menuYuleiqixidi
    +
  • + +
  • + +
    menuFuzhugongneng
    +
    #icon-menuFuzhugongneng
    +
  • + +
  • + +
    iconArrowL
    +
    #icon-iconArrowL
    +
  • + +
  • + +
    yumiao
    +
    #icon-yumiao
    +
  • + +
  • + +
    qizhachuzhi
    +
    #icon-qizhachuzhi
    +
  • + +
  • + +
    iconGlobal
    +
    #icon-iconGlobal
    +
  • + +
  • + +
    iconQuestion
    +
    #icon-iconQuestion
    +
  • + +
  • + +
    menuQixiangjiance
    +
    #icon-menuQixiangjiance
    +
  • + +
  • + +
    menuShuiwenjiance2
    +
    #icon-menuShuiwenjiance2
    +
  • + +
  • + +
    close
    +
    #icon-close
    +
  • + +
  • + +
    iconArrowRight
    +
    #icon-iconArrowRight
    +
  • + +
  • + +
    iconWubianhua
    +
    #icon-iconWubianhua
    +
  • + +
  • + +
    iconXiajiang
    +
    #icon-iconXiajiang
    +
  • + +
  • + +
    iconShangsheng
    +
    #icon-iconShangsheng
    +
  • + +
  • + +
    iconWeiguifangmu
    +
    #icon-iconWeiguifangmu
    +
  • + +
  • + +
    iconJiaoshuiyanghu
    +
    #icon-iconJiaoshuiyanghu
    +
  • + +
  • + +
    iconDaitianbao
    +
    #icon-iconDaitianbao
    +
  • + +
  • + +
    iconDaishenhe
    +
    #icon-iconDaishenhe
    +
  • + +
  • + +
    iconLindi
    +
    #icon-iconLindi
    +
  • + +
  • + +
    iconZongmianji
    +
    #icon-iconZongmianji
    +
  • + +
  • + +
    iconWarning
    +
    #icon-iconWarning
    +
  • + +
  • + +
    iconNodata
    +
    #icon-iconNodata
    +
  • + +
  • + +
    iconNormal
    +
    #icon-iconNormal
    +
  • + +
  • + +
    iconYizai
    +
    #icon-iconYizai
    +
  • + +
  • + +
    iconCaodi
    +
    #icon-iconCaodi
    +
  • + +
  • + +
    iconTitle
    +
    #icon-iconTitle1
    +
  • + +
  • + +
    iconTitle
    +
    #icon-iconTitle
    +
  • + +
  • + +
    iconUser
    +
    #icon-iconUser1
    +
  • + +
  • + +
    menuDefault
    +
    #icon-menuDefault
    +
  • + +
  • + +
    iconBell
    +
    #icon-iconBell
    +
  • + +
  • + +
    iconFunction
    +
    #icon-iconFunction
    +
  • + +
  • + +
    iconRoaming
    +
    #icon-iconRoaming
    +
  • + +
  • + +
    menuZhinengfenxi
    +
    #icon-menuZhinengfenxi
    +
  • + +
  • + +
    menuShujvchaxun
    +
    #icon-menuShujvchaxun
    +
  • + +
  • + +
    menuZhihuigaojing
    +
    #icon-menuZhihuigaojing
    +
  • + +
  • + +
    menuShuiwenjiance
    +
    #icon-menuShuiwenjiance
    +
  • + +
  • + +
    menuShuizhijiance
    +
    #icon-menuShuizhijiance
    +
  • + +
  • + +
    menuZengzhifangliu
    +
    #icon-menuZengzhifangliu
    +
  • + +
  • + +
    menuDianzhanzhuanti
    +
    #icon-menuDianzhanzhuanti
    +
  • + +
  • + +
    menuSheshiyunxing
    +
    #icon-menuSheshiyunxing
    +
  • + +
  • + +
    menuShuishengdiaocha
    +
    #icon-menuShuishengdiaocha
    +
  • + +
  • + +
    menuLushengdiaocha
    +
    #icon-menuLushengdiaocha
    +
  • + +
  • + +
    menuYuqingjiankong
    +
    #icon-menuYuqingjiankong
    +
  • + +
  • + +
    menuCuoshiluoshi
    +
    #icon-menuCuoshiluoshi
    +
  • + +
  • + +
    menuHome
    +
    #icon-menuHome
    +
  • + +
  • + +
    iconRetract
    +
    #icon-iconRetract
    +
  • + +
  • + +
    iconHide
    +
    #icon-iconHide
    +
  • + +
  • + +
    icon2D
    +
    #icon-icon2D
    +
  • + +
  • + +
    iconLayer
    +
    #icon-iconLayer
    +
  • + +
  • + +
    iconSearch
    +
    #icon-iconSearch
    +
  • + +
  • + +
    iconExpand
    +
    #icon-iconExpand
    +
  • + +
  • + +
    iconDownload
    +
    #icon-iconDownload
    +
  • + +
  • + +
    iconFillter
    +
    #icon-iconFillter
    +
  • + +
  • + +
    icon3D
    +
    #icon-icon3D1
    +
  • + +
  • + +
    iconZoomOut
    +
    #icon-iconZoomOut
    +
  • + +
  • + +
    iconZoomIn
    +
    #icon-iconZoomIn
    +
  • + +
  • + +
    iconReset
    +
    #icon-iconReset
    +
  • + +
  • + +
    iconMeasuringTool
    +
    #icon-iconMeasuringTool
    +
  • + +
  • + +
    iconArrow
    +
    #icon-iconArrow
    +
  • + +
  • + +
    iconArrowRightBig
    +
    #icon-iconArrowRightBig
    +
  • + +
  • + +
    iconSetting
    +
    #icon-iconSetting
    +
  • + +
  • + +
    iconMore
    +
    #icon-iconMore
    +
  • + +
  • + +
    menuFold
    +
    #icon-menuFold
    +
  • + +
  • + +
    menuUnfold
    +
    #icon-menuUnfold
    +
  • + +
  • + +
    list
    +
    #icon-list
    +
  • + +
  • + +
    arrowRight
    +
    #icon-tuxing
    +
  • + +
  • + +
    menu
    +
    #icon-menu
    +
  • + +
  • + +
    Q2
    +
    #icon-Q2
    +
  • + +
  • + +
    Q3
    +
    #icon-Q3
    +
  • + +
  • + +
    Q4
    +
    #icon-Q4
    +
  • + +
  • + +
    Q1
    +
    #icon-Q1
    +
  • + +
  • + +
    jiankong
    +
    #icon-jiankong
    +
  • + +
  • + +
    jiankongFill
    +
    #icon-jiankongFill
    +
  • + +
  • + +
    noData
    +
    #icon-noData
    +
  • + +
  • + +
    wubianhua
    +
    #icon-wubianhua
    +
  • + +
  • + +
    xiajiang
    +
    #icon-xiajiang
    +
  • + +
  • + +
    gutifeiwu
    +
    #icon-gutifeiwu
    +
  • + +
  • + +
    damianji
    +
    #icon-damianji
    +
  • + +
  • + +
    xiaomianji
    +
    #icon-xiaomianji
    +
  • + +
  • + +
    jiance
    +
    #icon-jiance
    +
  • + +
  • + +
    qingpiao
    +
    #icon-qingpiao
    +
  • + +
  • + +
    shangxingguoyu
    +
    #icon-shangxingguoyu
    +
  • + +
  • + +
    xiaxingguoyu
    +
    #icon-xiaxingguoyu
    +
  • + +
  • + +
    leijiyunxing
    +
    #icon-leijiyunxing
    +
  • + +
  • + +
    bgCollapse
    +
    #icon-bgCollapse
    +
  • + +
  • + +
    downOutline
    +
    #icon-downOutline
    +
  • + +
  • + +
    wujiankong
    +
    #icon-wujiankong
    +
  • + +
  • + +
    view4
    +
    #icon-view4
    +
  • + +
  • + +
    view1
    +
    #icon-view1
    +
  • + +
  • + +
    view9
    +
    #icon-view9
    +
  • + +
  • + +
    feishuipaifang
    +
    #icon-feishuipaifang
    +
  • + +
  • + +
    shenhe
    +
    #icon-shenhe
    +
  • + +
  • + +
    shenghuolaji
    +
    #icon-shenghuolaji
    +
  • + +
  • + +
    feishuichuli
    +
    #icon-feishuichuli
    +
  • + +
  • + +
    weixianwu
    +
    #icon-weixianwu
    +
  • + +
  • + +
    tianbao
    +
    #icon-tianbao
    +
  • + +
  • + +
    6
    +
    #icon-a-6
    +
  • + +
  • + +
    2
    +
    #icon-a-2
    +
  • + +
  • + +
    10
    +
    #icon-a-10
    +
  • + +
  • + +
    11
    +
    #icon-a-11
    +
  • + +
  • + +
    12
    +
    #icon-a-12
    +
  • + +
  • + +
    7
    +
    #icon-a-7
    +
  • + +
  • + +
    9
    +
    #icon-a-9
    +
  • + +
  • + +
    5
    +
    #icon-a-5
    +
  • + +
  • + +
    3
    +
    #icon-a-3
    +
  • + +
  • + +
    8
    +
    #icon-a-8
    +
  • + +
  • + +
    1
    +
    #icon-a-1
    +
  • + +
  • + +
    4
    +
    #icon-a-4
    +
  • + +
  • + +
    shangsheng
    +
    #icon-shangsheng
    +
  • + +
  • + +
    siyu
    +
    #icon-siyu
    +
  • + +
  • + +
    jiyunyu
    +
    #icon-jiyunyu
    +
  • + +
  • + +
    dieliangmen
    +
    #icon-dieliangmen
    +
  • + +
  • + +
    shuidianzhanGaojing
    +
    #icon-shuidianzhanGaojing
    +
  • + +
  • + +
    biaoji
    +
    #icon-biaoji
    +
  • + +
  • + +
    shengyuji
    +
    #icon-shengyuji
    +
  • + +
  • + +
    shuidianzhanWushujv
    +
    #icon-shuidianzhanWushujv
    +
  • + +
  • + +
    yudao
    +
    #icon-yudao
    +
  • + +
  • + +
    piaofuwu
    +
    #icon-piaofuwu
    +
  • + +
  • + +
    shebeiLixian
    +
    #icon-shebeiLixian
    +
  • + +
  • + +
    Android
    +
    #icon-Android
    +
  • + +
  • + +
    iOS
    +
    #icon-iOS
    +
  • + +
  • + +
    rightB
    +
    #icon-rightB
    +
  • + +
  • + +
    leftB
    +
    #icon-leftB
    +
  • + +
  • + +
    bellOutlined
    +
    #icon-bellOutlined
    +
  • + +
  • + +
    shebeiZhengchang
    +
    #icon-shebeiZhengchang
    +
  • + +
  • + +
    shebeiZongshu
    +
    #icon-shebeiZongshu
    +
  • + +
  • + +
    shebeiYichang
    +
    #icon-shebeiYichang
    +
  • + +
  • + +
    xushuiliang
    +
    #icon-xushuiliang
    +
  • + +
  • + +
    time
    +
    #icon-time
    +
  • + +
  • + +
    fadianliang
    +
    #icon-fadianliang
    +
  • + +
  • + +
    zhuangji
    +
    #icon-zhuangji
    +
  • + +
  • + +
    sheshiyunxing
    +
    #icon-sheshiyunxing
    +
  • + +
  • + +
    huanbaodiaocha
    +
    #icon-huanbaodiaocha
    +
  • + +
  • + +
    shengtailiuliang2
    +
    #icon-shengtailiuliang2
    +
  • + +
  • + +
    cuoshiluoshi
    +
    #icon-cuoshiluoshi
    +
  • + +
  • + +
    huanbaofengmao
    +
    #icon-huanbaofengmao
    +
  • + +
  • + +
    huanjingjiance
    +
    #icon-huanjingjiance
    +
  • + +
  • + +
    shuidianzhan
    +
    #icon-shuidianzhan1
    +
  • + +
  • + +
    zonglan
    +
    #icon-zonglan
    +
  • + +
  • + +
    设置
    +
    #icon-SetUp
    +
  • + +
  • + +
    下移
    +
    #icon-xiayi
    +
  • + +
  • + +
    上移
    +
    #icon-shangyi
    +
  • + +
  • + +
    Save
    +
    #icon-Save
    +
  • + +
  • + +
    横杠
    +
    #icon-icon_horizontal_bar
    +
  • + +
  • + +
    mubiaoguoyushuliang
    +
    #icon-mubiaoguoyushuliang
    +
  • + +
  • + +
    guojiaqixiangzhan
    +
    #icon-guojiaqixiangzhan
    +
  • + +
  • + +
    shijiguoyuzhonglei
    +
    #icon-shijiguoyuzhonglei
    +
  • + +
  • + +
    shuidianzhan
    +
    #icon-shuidianzhan
    +
  • + +
  • + +
    zhuangjirongliang
    +
    #icon-zhuangjirongliang
    +
  • + +
  • + +
    graphItem
    +
    #icon-graphItem
    +
  • + +
  • + +
    icon_视频播放
    +
    #icon-icon_shipinbofang
    +
  • + +
  • + +
    鱼种数量
    +
    #icon-yuzhongshuliang
    +
  • + +
  • + +
    淘汰数量
    +
    #icon-taotaishuliang
    +
  • + +
  • + +
    icon_更多
    +
    #icon-icon_gengduo
    +
  • + +
  • + +
    icon_传感器
    +
    #icon-icon_chuanganqi
    +
  • + +
  • + +
    icon_尾
    +
    #icon-icon_wei
    +
  • + +
  • + +
    鱼苗数量
    +
    #icon-yumiaoshuliang
    +
  • + +
  • + +
    icon_行为预警
    +
    #icon-icon_hangweiyujing
    +
  • + +
  • + +
    亲鱼死亡数量
    +
    #icon-qinyusiwangshuliang
    +
  • + +
  • + +
    产卵数量
    +
    #icon-chanluanshuliang
    +
  • + +
  • + +
    放流数量
    +
    #icon-fangliushuliang
    +
  • + +
  • + +
    采集数量
    +
    #icon-caijishuliang
    +
  • + +
  • + +
    鱼苗死亡数量
    +
    #icon-yumiaosiwangshuliang
    +
  • + +
  • + +
    站点数量
    +
    #icon-zhandianshuliang
    +
  • + +
  • + +
    icon_占比
    +
    #icon-icon_zhanbi
    +
  • + +
  • + +
    iconDaping
    +
    #icon-iconDaping
    +
  • + +
  • + +
    iconShujvtianbao
    +
    #icon-iconShujvtianbao
    +
  • + +
  • + +
    iconPingmian
    +
    #icon-iconPingmian
    +
  • + +
  • + +
    iconShujvguanli
    +
    #icon-iconShujvguanli
    +
  • + +
  • + +
    iconZengzhizhan
    +
    #icon-iconZengzhizhan
    +
  • + +
  • + +
    iconZhihuijiance
    +
    #icon-iconZhihuijiance
    +
  • + +
  • + +
    left
    +
    #icon-left1
    +
  • + +
  • + +
    right
    +
    #icon-right1
    +
  • + +
  • + +
    iconShujvcaiji
    +
    #icon-iconShujvcaiji
    +
  • + +
  • + +
    icon3D
    +
    #icon-icon3D
    +
  • + +
  • + +
    return
    +
    #icon-return
    +
  • + +
  • + +
    shuizhi
    +
    #icon-shuizhi
    +
  • + +
  • + +
    chuixiangshuiwen
    +
    #icon-chuixiangshuiwen
    +
  • + +
  • + +
    home
    +
    #icon-home
    +
  • + +
  • + +
    icon-guanli
    +
    #icon-icon-guanli
    +
  • + +
  • + +
    icon-jiance
    +
    #icon-icon-jiance
    +
  • + +
  • + +
    icon-peizhi
    +
    #icon-icon-peizhi
    +
  • + +
  • + +
    icon-qingkuang
    +
    #icon-icon-qingkuang
    +
  • + +
  • + +
    icon-tongji
    +
    #icon-icon-tongji
    +
  • + +
  • + +
    icon-weihu
    +
    #icon-icon-weihu
    +
  • + +
  • + +
    icon-zidingyi
    +
    #icon-icon-zidingyi
    +
  • + +
  • + +
    mapPin
    +
    #icon-mapPin
    +
  • + +
  • + +
    fishMore
    +
    #icon-fishMore
    +
  • + +
  • + +
    shuizhiyaosushezhi
    +
    #icon-shuizhiyaosushezhi
    +
  • + +
  • + +
    rengongshuizhizhan
    +
    #icon-rengongshuizhizhan
    +
  • + +
  • + +
    closeCircle
    +
    #icon-closeCircle
    +
  • + +
  • + +
    checkboxCircle
    +
    #icon-checkboxCircle
    +
  • + +
  • + +
    stop
    +
    #icon-stop
    +
  • + +
  • + +
    arrowUp
    +
    #icon-arrowUp
    +
  • + +
  • + +
    arrowDown
    +
    #icon-arrowDown
    +
  • + +
  • + +
    guojiashuiwenzhan
    +
    #icon-guojiashuiwenzhan
    +
  • + +
  • + +
    guojiashuizhizhan
    +
    #icon-guojiashuizhizhan
    +
  • + +
  • + +
    qixiangzhan
    +
    #icon-qixiangzhan
    +
  • + +
  • + +
    zijianshuiwenzhan
    +
    #icon-zijianshuiwenzhan
    +
  • + +
  • + +
    配置管理
    +
    #icon-Dispose
    +
  • + +
  • + +
    lindi
    +
    #icon-lindi
    +
  • + +
  • + +
    clearMap
    +
    #icon-clearMap
    +
  • + +
  • + +
    startPoint
    +
    #icon-startPoint
    +
  • + +
  • + +
    equipment
    +
    #icon-equipment1
    +
  • + +
  • + +
    fund
    +
    #icon-fund1
    +
  • + +
  • + +
    jiuzhu
    +
    #icon-jiuzhu
    +
  • + +
  • + +
    yulei
    +
    #icon-yulei
    +
  • + +
  • + +
    yuleizengzhizhan
    +
    #icon-yuleizengzhizhan1
    +
  • + +
  • + +
    play-circle
    +
    #icon-play-circle
    +
  • + +
  • + +
    pause-circle
    +
    #icon-pause-circle
    +
  • + +
  • + +
    normal
    +
    #icon-normal
    +
  • + +
  • + +
    equipment
    +
    #icon-equipment
    +
  • + +
  • + +
    people
    +
    #icon-people1
    +
  • + +
  • + +
    dam
    +
    #icon-dam
    +
  • + +
  • + +
    abnormal
    +
    #icon-abnormal
    +
  • + +
  • + +
    chart
    +
    #icon-chart
    +
  • + +
  • + +
    fund
    +
    #icon-fund
    +
  • + +
  • + +
    waterReplenishing
    +
    #icon-waterReplenishing
    +
  • + +
  • + +
    删除
    +
    #icon-Delete1
    +
  • + +
  • + +
    添加子节点
    +
    #icon-AddChildNode
    +
  • + +
  • + +
    三角上
    +
    #icon-icon_small_up
    +
  • + +
  • + +
    三角下
    +
    #icon-icon_small_down
    +
  • + +
  • + +
    重置
    +
    #icon-Redo
    +
  • + +
  • + +
    搜索
    +
    #icon-Search
    +
  • + +
  • + +
    导航
    +
    #icon-daohang
    +
  • + +
  • + +
    详情
    +
    #icon-Details
    +
  • + +
  • + +
    编辑
    +
    #icon-Edit
    +
  • + +
  • + +
    接収
    +
    #icon-icon_receiving
    +
  • + +
  • + +
    导入
    +
    #icon-Import1
    +
  • + +
  • + +
    导出
    +
    #icon-Export
    +
  • + +
  • + +
    新增
    +
    #icon-Add1
    +
  • + +
  • + +
    全屏
    +
    #icon-FullScreen
    +
  • + +
  • + +
    收起
    +
    #icon-PutAway
    +
  • + +
  • + +
    设置
    +
    #icon-Install
    +
  • + +
  • + +
    选择
    +
    #icon-Determine
    +
  • + +
  • + +
    提示
    +
    #icon-InfoCircle
    +
  • + +
  • + +
    预览
    +
    #icon-Preview
    +
  • + +
  • + +
    添加
    +
    #icon-AddTo
    +
  • + +
  • + +
    减去
    +
    #icon-Subtract
    +
  • + +
  • + +
    关闭
    +
    #icon-Close
    +
  • + +
  • + +
    map-zidongshuiwenjiance
    +
    #icon-map-zidongshuiwenjiance
    +
  • + +
  • + +
    map-rengongshuiwenjiance
    +
    #icon-map-rengongshuiwenjiance
    +
  • + +
  • + +
    info
    +
    #icon-info
    +
  • + +
  • + +
    map-qixidiyulei
    +
    #icon-map-qixidiyulei
    +
  • + +
  • + +
    map-yuleifenbu
    +
    #icon-map-yuleifenbu
    +
  • + +
  • + +
    map-rgszzDabiao
    +
    #icon-map-rgszzDabiao1
    +
  • + +
  • + +
    map-rgszzBudabiao
    +
    #icon-map-rgszzBudabiao1
    +
  • + +
  • + +
    map-zxsdzGaojing
    +
    #icon-map-zxsdzGaojing
    +
  • + +
  • + +
    map-dxsdzGaojing
    +
    #icon-map-dxsdzGaojing
    +
  • + +
  • + +
    map-qixidi
    +
    #icon-map-qixidituli
    +
  • + +
  • + +
    qixidi
    +
    #icon-qixidi
    +
  • + +
  • + +
    play
    +
    #icon-play
    +
  • + +
  • + +
    moreVideo
    +
    #icon-moreVideo
    +
  • + +
  • + +
    map-zxsdzDabiaolv-6
    +
    #icon-map-zxsdzDabiaolv-6
    +
  • + +
  • + +
    map-dxsdzDabiaolv-6
    +
    #icon-map-dxsdzDabiaolv-6
    +
  • + +
  • + +
    map-rgszzBudabiao
    +
    #icon-map-rgszzBudabiao
    +
  • + +
  • + +
    map-rgszzDabiao
    +
    #icon-map-rgszzDabiao
    +
  • + +
  • + +
    map-shipinjiankongzhan
    +
    #icon-map-shipinjiankongzhan
    +
  • + +
  • + +
    ranging
    +
    #icon-ranging
    +
  • + +
  • + +
    measure
    +
    #icon-measure
    +
  • + +
  • + +
    measuringTool
    +
    #icon-measuringTool
    +
  • + +
  • + +
    poumianfenxi
    +
    #icon-poumianfenxi
    +
  • + +
  • + +
    clear
    +
    #icon-clear
    +
  • + +
  • + +
    analysisTool
    +
    #icon-analysisTool
    +
  • + +
  • + +
    module
    +
    #icon-module
    +
  • + +
  • + +
    roaming
    +
    #icon-roaming
    +
  • + +
  • + +
    defaultView
    +
    #icon-defaultView
    +
  • + +
  • + +
    global
    +
    #icon-global
    +
  • + +
  • + +
    obliquePhotography
    +
    #icon-obliquePhotography
    +
  • + +
  • + +
    people
    +
    #icon-people
    +
  • + +
  • + +
    sum
    +
    #icon-sum
    +
  • + +
  • + +
    flowChart
    +
    #icon-flowChart
    +
  • + +
  • + +
    heduan-0
    +
    #icon-heduan-0
    +
  • + +
  • + +
    map-zxsdzGuihua-light
    +
    #icon-map-zxsdzGuihua-light
    +
  • + +
  • + +
    map-zxsdzZaijian-light
    +
    #icon-map-zxsdzZaijian-light
    +
  • + +
  • + +
    map-zxsdzYijian-light
    +
    #icon-map-zxsdzYijian-light
    +
  • + +
  • + +
    map-dxsdzZaijian-light
    +
    #icon-map-dxsdzZaijian-light
    +
  • + +
  • + +
    map-dxsdzYijian-light
    +
    #icon-map-dxsdzYijian-light
    +
  • + +
  • + +
    map-dxsdzGuihua-light
    +
    #icon-map-dxsdzGuihua-light
    +
  • + +
  • + +
    check
    +
    #icon-check
    +
  • + +
  • + +
    2D
    +
    #icon-a-2D
    +
  • + +
  • + +
    reset
    +
    #icon-reset
    +
  • + +
  • + +
    fullScreen2
    +
    #icon-fullScreen2
    +
  • + +
  • + +
    dataTable
    +
    #icon-dataTable
    +
  • + +
  • + +
    chartTable
    +
    #icon-chartTable
    +
  • + +
  • + +
    lineChart
    +
    #icon-lineChart
    +
  • + +
  • + +
    fullScreenExit2
    +
    #icon-fullScreenExit2
    +
  • + +
  • + +
    map-ssLushengshengtai
    +
    #icon-map-ssLushengshengtai
    +
  • + +
  • + +
    map-ssShuishengshengtai
    +
    #icon-map-ssShuishengshengtai
    +
  • + +
  • + +
    shuizhi-3
    +
    #icon-shuizhi-3
    +
  • + +
  • + +
    shuizhi-5
    +
    #icon-shuizhi-5
    +
  • + +
  • + +
    shuizhi-4
    +
    #icon-shuizhi-4
    +
  • + +
  • + +
    shuizhi-2
    +
    #icon-shuizhi-2
    +
  • + +
  • + +
    shuizhi-1
    +
    #icon-shuizhi-1
    +
  • + +
  • + +
    map-zxsdzgjShuizhi
    +
    #icon-map-zxsdzgjShuizhi
    +
  • + +
  • + +
    map-zxsdzgjShigongcuoshiluoshi
    +
    #icon-map-zxsdzgjShigongcuoshiluoshi
    +
  • + +
  • + +
    map-zxsdzgjShuiwei
    +
    #icon-map-zxsdzgjShuiwei
    +
  • + +
  • + +
    map-zxsdzgjShengtailiuliang
    +
    #icon-map-zxsdzgjShengtailiuliang
    +
  • + +
  • + +
    map-gyssQita
    +
    #icon-map-gyssQita
    +
  • + +
  • + +
    map-qixidituli
    +
    #icon-map-qixidituli_v1
    +
  • + +
  • + +
    map-gyssShengyuji
    +
    #icon-map-gyssShengyuji
    +
  • + +
  • + +
    map-dwsjhQita
    +
    #icon-map-dwsjhQita1
    +
  • + +
  • + +
    map-gyssJiyunyuxitong
    +
    #icon-map-gyssJiyunyuxitong
    +
  • + +
  • + +
    map-gyssYudao
    +
    #icon-map-gyssYudao
    +
  • + +
  • + +
    map-gyssFangzirantongdao
    +
    #icon-map-gyssFangzirantongdao
    +
  • + +
  • + +
    map-gjDongwujiuzhuzhan
    +
    #icon-map-gjDongwujiuzhuzhan
    +
  • + +
  • + +
    map-gjGengongchanluanchang
    +
    #icon-map-gjGengongchanluanchang
    +
  • + +
  • + +
    map-gjQixidi
    +
    #icon-map-gjQixidi_v1
    +
  • + +
  • + +
    map-gjYuleizengzhizhan
    +
    #icon-map-gjYuleizengzhizhan
    +
  • + +
  • + +
    map-gjZhenxizhiwuyuan
    +
    #icon-map-gjZhenxizhiwuyuan
    +
  • + +
  • + +
    map-gjDiwenshuijianhuan
    +
    #icon-map-gjDiwenshuijianhuan
    +
  • + +
  • + +
    map-gjGuoyusheshi
    +
    #icon-map-gjGuoyusheshi
    +
  • + +
  • + +
    map-dxsdzgjShuiwei
    +
    #icon-map-dxsdzgjShuiwei
    +
  • + +
  • + +
    map-dxsdzgjShuizhi
    +
    #icon-map-dxsdzgjShuizhi
    +
  • + +
  • + +
    map-gjShengtailiuliang
    +
    #icon-map-gjShengtailiuliang
    +
  • + +
  • + +
    map-dxsdzgjShigongcuoshiluoshi
    +
    #icon-map-dxsdzgjShigongcuoshiluoshi
    +
  • + +
  • + +
    map-dxsdzgjShengtailiuliang
    +
    #icon-map-dxsdzgjShengtailiuliang
    +
  • + +
  • + +
    swap
    +
    #icon-swap
    +
  • + +
  • + +
    yaoganyingxiang
    +
    #icon-yaoganyingxiang
    +
  • + +
  • + +
    liuliangjiancezhan
    +
    #icon-liuliangjiancezhan
    +
  • + +
  • + +
    gaojing
    +
    #icon-gaojing
    +
  • + +
  • + +
    shipinjiankongshebei
    +
    #icon-shipinjiankongshebei
    +
  • + +
  • + +
    xunjian
    +
    #icon-xunjian
    +
  • + +
  • + +
    shuizhijiancezhan
    +
    #icon-shuizhijiancezhan
    +
  • + +
  • + +
    batch
    +
    #icon-batch
    +
  • + +
  • + +
    contrast
    +
    #icon-contrast
    +
  • + +
  • + +
    chengliu
    +
    #icon-chengliu
    +
  • + +
  • + +
    dwsjhGeshuimuqiang
    +
    #icon-dwsjhGeshuimuqiang
    +
  • + +
  • + +
    dwsjhDieliangmen
    +
    #icon-dwsjhDieliangmen
    +
  • + +
  • + +
    dwsjhQita
    +
    #icon-dwsjhQita
    +
  • + +
  • + +
    dwsjhQianzhidangqiang
    +
    #icon-dwsjhQianzhidangqiang
    +
  • + +
  • + +
    captchaOutlined
    +
    #icon-captchaOutlined
    +
  • + +
  • + +
    passwordOutlined
    +
    #icon-passwordOutlined
    +
  • + +
  • + +
    userOutlined
    +
    #icon-userOutlined
    +
  • + +
  • + +
    dongwujiuzhuzhan
    +
    #icon-dongwujiuzhuzhan
    +
  • + +
  • + +
    qixidi
    +
    #icon-qixidi_v1
    +
  • + +
  • + +
    zhenxizhiwuyuan
    +
    #icon-zhenxizhiwuyuan
    +
  • + +
  • + +
    diwenshuijianhuan
    +
    #icon-diwenshuijianhuan
    +
  • + +
  • + +
    yuleizengzhizhan
    +
    #icon-yuleizengzhizhan
    +
  • + +
  • + +
    guoyusheshi
    +
    #icon-guoyusheshi
    +
  • + +
  • + +
    map-dwsjhQianzhidangqiang
    +
    #icon-map-dwsjhQianzhidangqiang
    +
  • + +
  • + +
    map-dwsjhDieliangmenshi
    +
    #icon-map-dwsjhDieliangmenshi
    +
  • + +
  • + +
    map-dwsjhGeshuimuqiang
    +
    #icon-map-dwsjhGeshuimuqiang
    +
  • + +
  • + +
    map-stllxfssFangliuguan
    +
    #icon-map-stllxfssFangliuguan
    +
  • + +
  • + +
    map-stllxfssFangliukong
    +
    #icon-map-stllxfssFangliukong
    +
  • + +
  • + +
    map-stllxfssJihefadian
    +
    #icon-map-stllxfssJihefadian
    +
  • + +
  • + +
    map-stllxfssXiehongzha
    +
    #icon-map-stllxfssXiehongzha
    +
  • + +
  • + +
    map-stllxfssFangliudong
    +
    #icon-map-stllxfssFangliudong
    +
  • + +
  • + +
    map-stllxfssShengtaijizu
    +
    #icon-map-stllxfssShengtaijizu
    +
  • + +
  • + +
    map-zxsdzDabiaolv-5
    +
    #icon-map-zxsdzDabiaolv-5
    +
  • + +
  • + +
    map-zxsdzDabiaolv-4
    +
    #icon-map-zxsdzDabiaolv-4
    +
  • + +
  • + +
    map-zxsdzDabiaolv-2
    +
    #icon-map-zxsdzDabiaolv-2
    +
  • + +
  • + +
    map-dxsdzDabiaolv-5
    +
    #icon-map-dxsdzDabiaolv-5
    +
  • + +
  • + +
    map-dxsdzDabiaolv-4
    +
    #icon-map-dxsdzDabiaolv-4
    +
  • + +
  • + +
    map-zxsdzDabiaolv-1
    +
    #icon-map-zxsdzDabiaolv-1
    +
  • + +
  • + +
    map-dxsdzDabiaolv-2
    +
    #icon-map-dxsdzDabiaolv-2
    +
  • + +
  • + +
    map-dxsdzDabiaolv-3
    +
    #icon-map-dxsdzDabiaolv-3
    +
  • + +
  • + +
    map-dxsdzDabiaolv-1
    +
    #icon-map-dxsdzDabiaolv-1
    +
  • + +
  • + +
    map-zxsdzDabiaolv-3
    +
    #icon-map-zxsdzDabiaolv-3
    +
  • + +
  • + +
    bg-toggle
    +
    #icon-bg-toggle
    +
  • + +
  • + +
    map-diwenshuijianhuan
    +
    #icon-map-diwenshuijianhuan
    +
  • + +
  • + +
    map-qixidi
    +
    #icon-map-qixidi
    +
  • + +
  • + +
    map-yuleizengzhizhan
    +
    #icon-map-yuleizengzhizhan
    +
  • + +
  • + +
    map-rengongchanluanchang
    +
    #icon-map-rengongchanluanchang
    +
  • + +
  • + +
    map-zhenxizhiwuyuan
    +
    #icon-map-zhenxizhiwuyuan
    +
  • + +
  • + +
    map-shengtailiuliang
    +
    #icon-map-shengtailiuliang
    +
  • + +
  • + +
    map-dongwujiuzhuzhan
    +
    #icon-map-dongwujiuzhuzhan
    +
  • + +
  • + +
    map-guoyusheshi
    +
    #icon-map-guoyusheshi
    +
  • + +
  • + +
    map-xzXian
    +
    #icon-map-xzXian
    +
  • + +
  • + +
    map-shengjie
    +
    #icon-map-shengjie
    +
  • + +
  • + +
    map-xzSheng
    +
    #icon-map-xzSheng
    +
  • + +
  • + +
    map-xzShi
    +
    #icon-map-xzShi
    +
  • + +
  • + +
    hydroPower
    +
    #icon-hydroPower
    +
  • + +
  • + +
    heduan-4
    +
    #icon-heduan-4
    +
  • + +
  • + +
    heduan-1
    +
    #icon-heduan-1
    +
  • + +
  • + +
    heduan-5
    +
    #icon-heduan-5
    +
  • + +
  • + +
    heduan-3
    +
    #icon-heduan-3
    +
  • + +
  • + +
    heduan-2
    +
    #icon-heduan-2
    +
  • + +
  • + +
    heliu-3
    +
    #icon-heliu-3
    +
  • + +
  • + +
    heliu-1
    +
    #icon-heliu-1
    +
  • + +
  • + +
    heliu-2
    +
    #icon-heliu-2
    +
  • + +
  • + +
    hupo
    +
    #icon-hupo
    +
  • + +
  • + +
    shuidianjidi
    +
    #icon-shuidianjidi
    +
  • + +
  • + +
    map-gjszzDabiao
    +
    #icon-map-gjszzDabiao
    +
  • + +
  • + +
    map-gjszzBudabiao
    +
    #icon-map-gjszzBudabiao
    +
  • + +
  • + +
    map-zjszzDabiao
    +
    #icon-map-zjszzDabiao
    +
  • + +
  • + +
    map-dxsdzGuihua
    +
    #icon-map-dxsdzGuihua
    +
  • + +
  • + +
    map-zxsdzZaijian
    +
    #icon-map-zxsdzZaijian
    +
  • + +
  • + +
    map-zxsdzGuihua
    +
    #icon-map-zxsdzGuihua
    +
  • + +
  • + +
    map-zxsdzYijian
    +
    #icon-map-zxsdzYijian
    +
  • + +
  • + +
    map-dzTushi
    +
    #icon-map-dzTushi
    +
  • + +
  • + +
    map-dabiaolv-3
    +
    #icon-map-dabiaolv-3
    +
  • + +
  • + +
    map-zjszzBudabiao
    +
    #icon-map-zjszzBudabiao
    +
  • + +
  • + +
    map-dabiaolv-5
    +
    #icon-map-dabiaolv-5
    +
  • + +
  • + +
    map-dabiaolv-2
    +
    #icon-map-dabiaolv-2
    +
  • + +
  • + +
    map-dxsdzZaijian
    +
    #icon-map-dxsdzZaijian
    +
  • + +
  • + +
    map-dxsdzYijian
    +
    #icon-map-dxsdzYijian
    +
  • + +
  • + +
    map-dabiaolv-4
    +
    #icon-map-dabiaolv-4
    +
  • + +
  • + +
    map-dabiaolv-1
    +
    #icon-map-dabiaolv-1
    +
  • + +
  • + +
    topOutline
    +
    #icon-topOutline
    +
  • + +
  • + +
    topFill
    +
    #icon-topFill
    +
  • + +
  • + +
    locationSymbol
    +
    #icon-locationSymbol
    +
  • + +
  • + +
    right
    +
    #icon-right
    +
  • + +
  • + +
    left
    +
    #icon-left
    +
  • + +
  • + +
    search
    +
    #icon-search
    +
  • + +
  • + +
    fold
    +
    #icon-fold
    +
  • + +
  • + +
    unFold
    +
    #icon-unFold
    +
  • + +
  • + +
    tiji
    +
    #icon-tiji
    +
  • + +
  • + +
    layer
    +
    #icon-layer
    +
  • + +
  • + +
    zoomIn
    +
    #icon-zoomIn
    +
  • + +
  • + +
    3D
    +
    #icon-a-3D
    +
  • + +
  • + +
    downLoad
    +
    #icon-downLoad
    +
  • + +
  • + +
    zoomOut
    +
    #icon-zoomOut
    +
  • + +
  • + +
    exitFullScreen
    +
    #icon-exitFullScreen
    +
  • + +
  • + +
    topic
    +
    #icon-topic
    +
  • + +
  • + +
    fullScreen
    +
    #icon-fullScreen
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.css b/frontend-sjgl/src/styles/iconfont/iconfont.css new file mode 100644 index 00000000..09993c44 --- /dev/null +++ b/frontend-sjgl/src/styles/iconfont/iconfont.css @@ -0,0 +1,1862 @@ +@font-face { + font-family: "iconfont"; /* Project id 3714772 */ + src: url('iconfont.woff2?t=1759132832894') format('woff2'), + url('iconfont.woff?t=1759132832894') format('woff'), + url('iconfont.ttf?t=1759132832894') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-map-yldczz:before { + content: "\e601"; +} + +.icon-sxjc-fill:before { + content: "\e86d"; +} + +.icon-yunyuchuan2:before { + content: "\e86e"; +} + +.icon-ganyushan2:before { + content: "\e86f"; +} + +.icon-shengyudou2:before { + content: "\e870"; +} + +.icon-AGV2:before { + content: "\e871"; +} + +.icon-shipin-fill:before { + content: "\e86b"; +} + +.icon-yljc-fill:before { + content: "\e86c"; +} + +.icon-hjjc2-fill:before { + content: "\e86a"; +} + +.icon-star:before { + content: "\e863"; +} + +.icon-build:before { + content: "\e862"; +} + +.icon-zhatu:before { + content: "\e860"; +} + +.icon-dongwubaohu:before { + content: "\e85d"; +} + +.icon-zhiwubaohu:before { + content: "\e85c"; +} + +.icon-jingqu:before { + content: "\e85e"; +} + +.icon-guoyusheshi2:before { + content: "\e855"; +} + +.icon-shuiwen-line:before { + content: "\e854"; +} + +.icon-erjibaohu:before { + content: "\e853"; +} + +.icon-shengzhongdianbh:before { + content: "\e852"; +} + +.icon-qingpiao1:before { + content: "\e84f"; +} + +.icon-yunxing:before { + content: "\e850"; +} + +.icon-fish:before { + content: "\e851"; +} + +.icon-shengtaibaohu-fill:before { + content: "\e84b"; +} + +.icon-kejichuangxin-fll:before { + content: "\e84d"; +} + +.icon-shuitubaochi-fill:before { + content: "\e849"; +} + +.icon-huanjingjiance-fill:before { + content: "\e84a"; +} + +.icon-rongyu-fill:before { + content: "\e84c"; +} + +.icon-zonglan-fll:before { + content: "\e848"; +} + +.icon-yuleibaohu-fill:before { + content: "\e84e"; +} + +.icon-aihezi:before { + content: "\e835"; +} + +.icon-yunyuche:before { + content: "\e82d"; +} + +.icon-yudaofangliu:before { + content: "\e82e"; +} + +.icon-calendar:before { + content: "\e82c"; +} + +.icon-fenbu:before { + content: "\e82a"; +} + +.icon-view6:before { + content: "\e82b"; +} + +.icon-play1:before { + content: "\e827"; +} + +.icon-pause:before { + content: "\e828"; +} + +.icon-agvxiaoche:before { + content: "\e826"; +} + +.icon-video:before { + content: "\e825"; +} + +.icon-dieliangmen1:before { + content: "\e821"; +} + +.icon-ganyushan:before { + content: "\e822"; +} + +.icon-liuliangjiancezhan1:before { + content: "\e823"; +} + +.icon-yunyuchuan:before { + content: "\e824"; +} + +.icon-zengzhizhanshuizhizhan:before { + content: "\e820"; +} + +.icon-menuYuleiqixidihuanjingjiance:before { + content: "\e81f"; +} + +.icon-menuXitongshezhi:before { + content: "\e81e"; +} + +.icon-menuYuleiqixidi:before { + content: "\e81c"; +} + +.icon-menuFuzhugongneng:before { + content: "\e81d"; +} + +.icon-iconArrowL:before { + content: "\e81b"; +} + +.icon-yumiao:before { + content: "\e819"; +} + +.icon-qizhachuzhi:before { + content: "\e81a"; +} + +.icon-iconGlobal:before { + content: "\e818"; +} + +.icon-iconQuestion:before { + content: "\e817"; +} + +.icon-menuQixiangjiance:before { + content: "\e815"; +} + +.icon-menuShuiwenjiance2:before { + content: "\e816"; +} + +.icon-close:before { + content: "\e814"; +} + +.icon-iconArrowRight:before { + content: "\e813"; +} + +.icon-iconWubianhua:before { + content: "\e811"; +} + +.icon-iconXiajiang:before { + content: "\e812"; +} + +.icon-iconShangsheng:before { + content: "\e810"; +} + +.icon-iconWeiguifangmu:before { + content: "\e80e"; +} + +.icon-iconJiaoshuiyanghu:before { + content: "\e80f"; +} + +.icon-iconDaitianbao:before { + content: "\e80d"; +} + +.icon-iconDaishenhe:before { + content: "\e80c"; +} + +.icon-iconLindi:before { + content: "\e80a"; +} + +.icon-iconZongmianji:before { + content: "\e80b"; +} + +.icon-iconWarning:before { + content: "\e809"; +} + +.icon-iconNodata:before { + content: "\e806"; +} + +.icon-iconNormal:before { + content: "\e807"; +} + +.icon-iconYizai:before { + content: "\e804"; +} + +.icon-iconCaodi:before { + content: "\e805"; +} + +.icon-iconTitle1:before { + content: "\e802"; +} + +.icon-iconTitle:before { + content: "\e7df"; +} + +.icon-iconUser1:before { + content: "\e801"; +} + +.icon-menuDefault:before { + content: "\e800"; +} + +.icon-iconBell:before { + content: "\e7ff"; +} + +.icon-iconFunction:before { + content: "\e7fd"; +} + +.icon-iconRoaming:before { + content: "\e7fe"; +} + +.icon-menuZhinengfenxi:before { + content: "\e7fa"; +} + +.icon-menuShujvchaxun:before { + content: "\e7fb"; +} + +.icon-menuZhihuigaojing:before { + content: "\e7fc"; +} + +.icon-menuShuiwenjiance:before { + content: "\e7f0"; +} + +.icon-menuShuizhijiance:before { + content: "\e7f1"; +} + +.icon-menuZengzhifangliu:before { + content: "\e7f2"; +} + +.icon-menuDianzhanzhuanti:before { + content: "\e7f3"; +} + +.icon-menuSheshiyunxing:before { + content: "\e7f4"; +} + +.icon-menuShuishengdiaocha:before { + content: "\e7f5"; +} + +.icon-menuLushengdiaocha:before { + content: "\e7f6"; +} + +.icon-menuYuqingjiankong:before { + content: "\e7f7"; +} + +.icon-menuCuoshiluoshi:before { + content: "\e7f8"; +} + +.icon-menuHome:before { + content: "\e7f9"; +} + +.icon-iconRetract:before { + content: "\e7ee"; +} + +.icon-iconHide:before { + content: "\e7ed"; +} + +.icon-icon2D:before { + content: "\e7e7"; +} + +.icon-iconLayer:before { + content: "\e7e2"; +} + +.icon-iconSearch:before { + content: "\e7e8"; +} + +.icon-iconExpand:before { + content: "\e7e9"; +} + +.icon-iconDownload:before { + content: "\e7ea"; +} + +.icon-iconFillter:before { + content: "\e7eb"; +} + +.icon-icon3D1:before { + content: "\e7ec"; +} + +.icon-iconZoomOut:before { + content: "\e7e3"; +} + +.icon-iconZoomIn:before { + content: "\e7e4"; +} + +.icon-iconReset:before { + content: "\e7e5"; +} + +.icon-iconMeasuringTool:before { + content: "\e7e6"; +} + +.icon-iconArrow:before { + content: "\e7e1"; +} + +.icon-iconArrowRightBig:before { + content: "\e7e0"; +} + +.icon-iconSetting:before { + content: "\e7de"; +} + +.icon-iconMore:before { + content: "\e7dd"; +} + +.icon-menuFold:before { + content: "\e7db"; +} + +.icon-menuUnfold:before { + content: "\e7dc"; +} + +.icon-list:before { + content: "\e7da"; +} + +.icon-tuxing:before { + content: "\e61f"; +} + +.icon-menu:before { + content: "\e7d9"; +} + +.icon-Q2:before { + content: "\e7d5"; +} + +.icon-Q3:before { + content: "\e7d6"; +} + +.icon-Q4:before { + content: "\e7d7"; +} + +.icon-Q1:before { + content: "\e7d8"; +} + +.icon-jiankong:before { + content: "\e7d4"; +} + +.icon-jiankongFill:before { + content: "\e7d3"; +} + +.icon-noData:before { + content: "\e7d2"; +} + +.icon-wubianhua:before { + content: "\e7d1"; +} + +.icon-xiajiang:before { + content: "\e7d0"; +} + +.icon-gutifeiwu:before { + content: "\e7cf"; +} + +.icon-damianji:before { + content: "\e7cb"; +} + +.icon-xiaomianji:before { + content: "\e7cc"; +} + +.icon-jiance:before { + content: "\e7cd"; +} + +.icon-qingpiao:before { + content: "\e7ce"; +} + +.icon-shangxingguoyu:before { + content: "\e7c8"; +} + +.icon-xiaxingguoyu:before { + content: "\e7c9"; +} + +.icon-leijiyunxing:before { + content: "\e7ca"; +} + +.icon-bgCollapse:before { + content: "\e7c7"; +} + +.icon-downOutline:before { + content: "\e7c6"; +} + +.icon-wujiankong:before { + content: "\e7c2"; +} + +.icon-view4:before { + content: "\e7c3"; +} + +.icon-view1:before { + content: "\e7c4"; +} + +.icon-view9:before { + content: "\e7c5"; +} + +.icon-feishuipaifang:before { + content: "\e7bc"; +} + +.icon-shenhe:before { + content: "\e7bd"; +} + +.icon-shenghuolaji:before { + content: "\e7be"; +} + +.icon-feishuichuli:before { + content: "\e7bf"; +} + +.icon-weixianwu:before { + content: "\e7c0"; +} + +.icon-tianbao:before { + content: "\e7c1"; +} + +.icon-a-6:before { + content: "\e7b7"; +} + +.icon-a-2:before { + content: "\e7b8"; +} + +.icon-a-10:before { + content: "\e7b9"; +} + +.icon-a-11:before { + content: "\e7ba"; +} + +.icon-a-12:before { + content: "\e7bb"; +} + +.icon-a-7:before { + content: "\e7b6"; +} + +.icon-a-9:before { + content: "\e7b0"; +} + +.icon-a-5:before { + content: "\e7b1"; +} + +.icon-a-3:before { + content: "\e7b2"; +} + +.icon-a-8:before { + content: "\e7b3"; +} + +.icon-a-1:before { + content: "\e7b4"; +} + +.icon-a-4:before { + content: "\e7b5"; +} + +.icon-shangsheng:before { + content: "\e7a7"; +} + +.icon-siyu:before { + content: "\e7a8"; +} + +.icon-jiyunyu:before { + content: "\e7a9"; +} + +.icon-dieliangmen:before { + content: "\e7aa"; +} + +.icon-shuidianzhanGaojing:before { + content: "\e7ab"; +} + +.icon-biaoji:before { + content: "\e7ac"; +} + +.icon-shengyuji:before { + content: "\e7ad"; +} + +.icon-shuidianzhanWushujv:before { + content: "\e7ae"; +} + +.icon-yudao:before { + content: "\e7af"; +} + +.icon-piaofuwu:before { + content: "\e7a5"; +} + +.icon-shebeiLixian:before { + content: "\e7a6"; +} + +.icon-Android:before { + content: "\e7a3"; +} + +.icon-iOS:before { + content: "\e7a4"; +} + +.icon-rightB:before { + content: "\e7a1"; +} + +.icon-leftB:before { + content: "\e7a2"; +} + +.icon-bellOutlined:before { + content: "\e7a0"; +} + +.icon-shebeiZhengchang:before { + content: "\e79d"; +} + +.icon-shebeiZongshu:before { + content: "\e79e"; +} + +.icon-shebeiYichang:before { + content: "\e79f"; +} + +.icon-xushuiliang:before { + content: "\e79b"; +} + +.icon-time:before { + content: "\e79c"; +} + +.icon-fadianliang:before { + content: "\e79a"; +} + +.icon-zhuangji:before { + content: "\e799"; +} + +.icon-sheshiyunxing:before { + content: "\e791"; +} + +.icon-huanbaodiaocha:before { + content: "\e792"; +} + +.icon-shengtailiuliang2:before { + content: "\e793"; +} + +.icon-cuoshiluoshi:before { + content: "\e794"; +} + +.icon-huanbaofengmao:before { + content: "\e795"; +} + +.icon-huanjingjiance:before { + content: "\e796"; +} + +.icon-shuidianzhan1:before { + content: "\e797"; +} + +.icon-zonglan:before { + content: "\e798"; +} + +.icon-SetUp:before { + content: "\e790"; +} + +.icon-xiayi:before { + content: "\e636"; +} + +.icon-shangyi:before { + content: "\e78f"; +} + +.icon-Save:before { + content: "\e662"; +} + +.icon-icon_horizontal_bar:before { + content: "\e829"; +} + +.icon-mubiaoguoyushuliang:before { + content: "\e78c"; +} + +.icon-guojiaqixiangzhan:before { + content: "\e78d"; +} + +.icon-shijiguoyuzhonglei:before { + content: "\e78e"; +} + +.icon-shuidianzhan:before { + content: "\e78a"; +} + +.icon-zhuangjirongliang:before { + content: "\e78b"; +} + +.icon-graphItem:before { + content: "\e789"; +} + +.icon-icon_shipinbofang:before { + content: "\e788"; +} + +.icon-yuzhongshuliang:before { + content: "\e783"; +} + +.icon-taotaishuliang:before { + content: "\e784"; +} + +.icon-icon_gengduo:before { + content: "\e785"; +} + +.icon-icon_chuanganqi:before { + content: "\e786"; +} + +.icon-icon_wei:before { + content: "\e787"; +} + +.icon-yumiaoshuliang:before { + content: "\e77a"; +} + +.icon-icon_hangweiyujing:before { + content: "\e77b"; +} + +.icon-qinyusiwangshuliang:before { + content: "\e77c"; +} + +.icon-chanluanshuliang:before { + content: "\e77d"; +} + +.icon-fangliushuliang:before { + content: "\e77e"; +} + +.icon-caijishuliang:before { + content: "\e77f"; +} + +.icon-yumiaosiwangshuliang:before { + content: "\e780"; +} + +.icon-zhandianshuliang:before { + content: "\e781"; +} + +.icon-icon_zhanbi:before { + content: "\e782"; +} + +.icon-iconDaping:before { + content: "\e779"; +} + +.icon-iconShujvtianbao:before { + content: "\e772"; +} + +.icon-iconPingmian:before { + content: "\e773"; +} + +.icon-iconShujvguanli:before { + content: "\e774"; +} + +.icon-iconZengzhizhan:before { + content: "\e775"; +} + +.icon-iconZhihuijiance:before { + content: "\e776"; +} + +.icon-left1:before { + content: "\e777"; +} + +.icon-right1:before { + content: "\e778"; +} + +.icon-iconShujvcaiji:before { + content: "\e76f"; +} + +.icon-icon3D:before { + content: "\e770"; +} + +.icon-return:before { + content: "\e76e"; +} + +.icon-shuizhi:before { + content: "\e76b"; +} + +.icon-chuixiangshuiwen:before { + content: "\e76c"; +} + +.icon-home:before { + content: "\e76d"; +} + +.icon-icon-guanli:before { + content: "\e769"; +} + +.icon-icon-jiance:before { + content: "\e76a"; +} + +.icon-icon-peizhi:before { + content: "\e764"; +} + +.icon-icon-qingkuang:before { + content: "\e765"; +} + +.icon-icon-tongji:before { + content: "\e766"; +} + +.icon-icon-weihu:before { + content: "\e767"; +} + +.icon-icon-zidingyi:before { + content: "\e768"; +} + +.icon-mapPin:before { + content: "\e762"; +} + +.icon-fishMore:before { + content: "\e763"; +} + +.icon-shuizhiyaosushezhi:before { + content: "\e760"; +} + +.icon-rengongshuizhizhan:before { + content: "\e761"; +} + +.icon-closeCircle:before { + content: "\e75e"; +} + +.icon-checkboxCircle:before { + content: "\e75f"; +} + +.icon-stop:before { + content: "\e75d"; +} + +.icon-arrowUp:before { + content: "\e75b"; +} + +.icon-arrowDown:before { + content: "\e75c"; +} + +.icon-guojiashuiwenzhan:before { + content: "\e757"; +} + +.icon-guojiashuizhizhan:before { + content: "\e758"; +} + +.icon-qixiangzhan:before { + content: "\e759"; +} + +.icon-zijianshuiwenzhan:before { + content: "\e75a"; +} + +.icon-Dispose:before { + content: "\e756"; +} + +.icon-lindi:before { + content: "\e755"; +} + +.icon-clearMap:before { + content: "\e750"; +} + +.icon-startPoint:before { + content: "\e751"; +} + +.icon-equipment1:before { + content: "\e752"; +} + +.icon-fund1:before { + content: "\e753"; +} + +.icon-jiuzhu:before { + content: "\e754"; +} + +.icon-yulei:before { + content: "\e74e"; +} + +.icon-yuleizengzhizhan1:before { + content: "\e74f"; +} + +.icon-play-circle:before { + content: "\e744"; +} + +.icon-pause-circle:before { + content: "\e745"; +} + +.icon-normal:before { + content: "\e746"; +} + +.icon-equipment:before { + content: "\e747"; +} + +.icon-people1:before { + content: "\e748"; +} + +.icon-dam:before { + content: "\e749"; +} + +.icon-abnormal:before { + content: "\e74a"; +} + +.icon-chart:before { + content: "\e74b"; +} + +.icon-fund:before { + content: "\e74c"; +} + +.icon-waterReplenishing:before { + content: "\e74d"; +} + +.icon-Delete1:before { + content: "\e66b"; +} + +.icon-AddChildNode:before { + content: "\e771"; +} + +.icon-icon_small_up:before { + content: "\e803"; +} + +.icon-icon_small_down:before { + content: "\e808"; +} + +.icon-Redo:before { + content: "\e741"; +} + +.icon-Search:before { + content: "\e742"; +} + +.icon-daohang:before { + content: "\e743"; +} + +.icon-Details:before { + content: "\e653"; +} + +.icon-Edit:before { + content: "\e668"; +} + +.icon-icon_receiving:before { + content: "\e845"; +} + +.icon-Import1:before { + content: "\e73f"; +} + +.icon-Export:before { + content: "\e740"; +} + +.icon-Add1:before { + content: "\e667"; +} + +.icon-FullScreen:before { + content: "\e66d"; +} + +.icon-PutAway:before { + content: "\e670"; +} + +.icon-Install:before { + content: "\e73c"; +} + +.icon-Determine:before { + content: "\e73d"; +} + +.icon-InfoCircle:before { + content: "\e73e"; +} + +.icon-Preview:before { + content: "\e7ef"; +} + +.icon-AddTo:before { + content: "\e739"; +} + +.icon-Subtract:before { + content: "\e73a"; +} + +.icon-Close:before { + content: "\e73b"; +} + +.icon-map-zidongshuiwenjiance:before { + content: "\e737"; +} + +.icon-map-rengongshuiwenjiance:before { + content: "\e738"; +} + +.icon-info:before { + content: "\e736"; +} + +.icon-map-qixidiyulei:before { + content: "\e735"; +} + +.icon-map-yuleifenbu:before { + content: "\e730"; +} + +.icon-map-rgszzDabiao1:before { + content: "\e733"; +} + +.icon-map-rgszzBudabiao1:before { + content: "\e734"; +} + +.icon-map-zxsdzGaojing:before { + content: "\e731"; +} + +.icon-map-dxsdzGaojing:before { + content: "\e732"; +} + +.icon-map-qixidituli:before { + content: "\e72f"; +} + +.icon-qixidi:before { + content: "\e72e"; +} + +.icon-play:before { + content: "\e72d"; +} + +.icon-moreVideo:before { + content: "\e72c"; +} + +.icon-map-zxsdzDabiaolv-6:before { + content: "\e72a"; +} + +.icon-map-dxsdzDabiaolv-6:before { + content: "\e72b"; +} + +.icon-map-rgszzBudabiao:before { + content: "\e728"; +} + +.icon-map-rgszzDabiao:before { + content: "\e729"; +} + +.icon-map-shipinjiankongzhan:before { + content: "\e727"; +} + +.icon-ranging:before { + content: "\e724"; +} + +.icon-measure:before { + content: "\e725"; +} + +.icon-measuringTool:before { + content: "\e726"; +} + +.icon-poumianfenxi:before { + content: "\e722"; +} + +.icon-clear:before { + content: "\e723"; +} + +.icon-analysisTool:before { + content: "\e71d"; +} + +.icon-module:before { + content: "\e71e"; +} + +.icon-roaming:before { + content: "\e71f"; +} + +.icon-defaultView:before { + content: "\e720"; +} + +.icon-global:before { + content: "\e721"; +} + +.icon-obliquePhotography:before { + content: "\e71c"; +} + +.icon-people:before { + content: "\e71a"; +} + +.icon-sum:before { + content: "\e71b"; +} + +.icon-flowChart:before { + content: "\e719"; +} + +.icon-heduan-0:before { + content: "\e716"; +} + +.icon-map-zxsdzGuihua-light:before { + content: "\e712"; +} + +.icon-map-zxsdzZaijian-light:before { + content: "\e713"; +} + +.icon-map-zxsdzYijian-light:before { + content: "\e714"; +} + +.icon-map-dxsdzZaijian-light:before { + content: "\e715"; +} + +.icon-map-dxsdzYijian-light:before { + content: "\e717"; +} + +.icon-map-dxsdzGuihua-light:before { + content: "\e718"; +} + +.icon-check:before { + content: "\e711"; +} + +.icon-a-2D:before { + content: "\e710"; +} + +.icon-reset:before { + content: "\e70a"; +} + +.icon-fullScreen2:before { + content: "\e70b"; +} + +.icon-dataTable:before { + content: "\e70c"; +} + +.icon-chartTable:before { + content: "\e70d"; +} + +.icon-lineChart:before { + content: "\e70e"; +} + +.icon-fullScreenExit2:before { + content: "\e70f"; +} + +.icon-map-ssLushengshengtai:before { + content: "\e708"; +} + +.icon-map-ssShuishengshengtai:before { + content: "\e709"; +} + +.icon-shuizhi-3:before { + content: "\e703"; +} + +.icon-shuizhi-5:before { + content: "\e704"; +} + +.icon-shuizhi-4:before { + content: "\e705"; +} + +.icon-shuizhi-2:before { + content: "\e706"; +} + +.icon-shuizhi-1:before { + content: "\e707"; +} + +.icon-map-zxsdzgjShuizhi:before { + content: "\e6c4"; +} + +.icon-map-zxsdzgjShigongcuoshiluoshi:before { + content: "\e6c5"; +} + +.icon-map-zxsdzgjShuiwei:before { + content: "\e6c6"; +} + +.icon-map-zxsdzgjShengtailiuliang:before { + content: "\e702"; +} + +.icon-map-gyssQita:before { + content: "\e6c3"; +} + +.icon-map-qixidituli_v1:before { + content: "\e6f4"; +} + +.icon-map-gyssShengyuji:before { + content: "\e6f5"; +} + +.icon-map-dwsjhQita1:before { + content: "\e6f9"; +} + +.icon-map-gyssJiyunyuxitong:before { + content: "\e6fb"; +} + +.icon-map-gyssYudao:before { + content: "\e700"; +} + +.icon-map-gyssFangzirantongdao:before { + content: "\e701"; +} + +.icon-map-gjDongwujiuzhuzhan:before { + content: "\e6f0"; +} + +.icon-map-gjGengongchanluanchang:before { + content: "\e6f1"; +} + +.icon-map-gjQixidi_v1:before { + content: "\e6f2"; +} + +.icon-map-gjYuleizengzhizhan:before { + content: "\e6f3"; +} + +.icon-map-gjZhenxizhiwuyuan:before { + content: "\e6f6"; +} + +.icon-map-gjDiwenshuijianhuan:before { + content: "\e6f7"; +} + +.icon-map-gjGuoyusheshi:before { + content: "\e6f8"; +} + +.icon-map-dxsdzgjShuiwei:before { + content: "\e6fa"; +} + +.icon-map-dxsdzgjShuizhi:before { + content: "\e6fc"; +} + +.icon-map-gjShengtailiuliang:before { + content: "\e6fd"; +} + +.icon-map-dxsdzgjShigongcuoshiluoshi:before { + content: "\e6fe"; +} + +.icon-map-dxsdzgjShengtailiuliang:before { + content: "\e6ff"; +} + +.icon-swap:before { + content: "\e6ef"; +} + +.icon-yaoganyingxiang:before { + content: "\e6ee"; +} + +.icon-liuliangjiancezhan:before { + content: "\e6ec"; +} + +.icon-gaojing:before { + content: "\e6e9"; +} + +.icon-shipinjiankongshebei:before { + content: "\e6ea"; +} + +.icon-xunjian:before { + content: "\e6eb"; +} + +.icon-shuizhijiancezhan:before { + content: "\e6ed"; +} + +.icon-batch:before { + content: "\e6e8"; +} + +.icon-contrast:before { + content: "\e6e7"; +} + +.icon-chengliu:before { + content: "\e6e6"; +} + +.icon-dwsjhGeshuimuqiang:before { + content: "\e6e2"; +} + +.icon-dwsjhDieliangmen:before { + content: "\e6e3"; +} + +.icon-dwsjhQita:before { + content: "\e6e4"; +} + +.icon-dwsjhQianzhidangqiang:before { + content: "\e6e5"; +} + +.icon-captchaOutlined:before { + content: "\e6df"; +} + +.icon-passwordOutlined:before { + content: "\e6e0"; +} + +.icon-userOutlined:before { + content: "\e6e1"; +} + +.icon-dongwujiuzhuzhan:before { + content: "\e6d9"; +} + +.icon-qixidi_v1:before { + content: "\e6da"; +} + +.icon-zhenxizhiwuyuan:before { + content: "\e6db"; +} + +.icon-diwenshuijianhuan:before { + content: "\e6dc"; +} + +.icon-yuleizengzhizhan:before { + content: "\e6dd"; +} + +.icon-guoyusheshi:before { + content: "\e6de"; +} + +.icon-map-dwsjhQianzhidangqiang:before { + content: "\e6c2"; +} + +.icon-map-dwsjhDieliangmenshi:before { + content: "\e6c7"; +} + +.icon-map-dwsjhGeshuimuqiang:before { + content: "\e6c8"; +} + +.icon-map-stllxfssFangliuguan:before { + content: "\e6c9"; +} + +.icon-map-stllxfssFangliukong:before { + content: "\e6ca"; +} + +.icon-map-stllxfssJihefadian:before { + content: "\e6cb"; +} + +.icon-map-stllxfssXiehongzha:before { + content: "\e6cc"; +} + +.icon-map-stllxfssFangliudong:before { + content: "\e6cd"; +} + +.icon-map-stllxfssShengtaijizu:before { + content: "\e6ce"; +} + +.icon-map-zxsdzDabiaolv-5:before { + content: "\e6cf"; +} + +.icon-map-zxsdzDabiaolv-4:before { + content: "\e6d0"; +} + +.icon-map-zxsdzDabiaolv-2:before { + content: "\e6d1"; +} + +.icon-map-dxsdzDabiaolv-5:before { + content: "\e6d2"; +} + +.icon-map-dxsdzDabiaolv-4:before { + content: "\e6d3"; +} + +.icon-map-zxsdzDabiaolv-1:before { + content: "\e6d4"; +} + +.icon-map-dxsdzDabiaolv-2:before { + content: "\e6d5"; +} + +.icon-map-dxsdzDabiaolv-3:before { + content: "\e6d6"; +} + +.icon-map-dxsdzDabiaolv-1:before { + content: "\e6d7"; +} + +.icon-map-zxsdzDabiaolv-3:before { + content: "\e6d8"; +} + +.icon-bg-toggle:before { + content: "\e6c1"; +} + +.icon-map-diwenshuijianhuan:before { + content: "\e6b9"; +} + +.icon-map-qixidi:before { + content: "\e6ba"; +} + +.icon-map-yuleizengzhizhan:before { + content: "\e6bb"; +} + +.icon-map-rengongchanluanchang:before { + content: "\e6bc"; +} + +.icon-map-zhenxizhiwuyuan:before { + content: "\e6bd"; +} + +.icon-map-shengtailiuliang:before { + content: "\e6be"; +} + +.icon-map-dongwujiuzhuzhan:before { + content: "\e6bf"; +} + +.icon-map-guoyusheshi:before { + content: "\e6c0"; +} + +.icon-map-xzXian:before { + content: "\e6b5"; +} + +.icon-map-shengjie:before { + content: "\e6b6"; +} + +.icon-map-xzSheng:before { + content: "\e6b7"; +} + +.icon-map-xzShi:before { + content: "\e6b8"; +} + +.icon-hydroPower:before { + content: "\e6b4"; +} + +.icon-heduan-4:before { + content: "\e69a"; +} + +.icon-heduan-1:before { + content: "\e69b"; +} + +.icon-heduan-5:before { + content: "\e69c"; +} + +.icon-heduan-3:before { + content: "\e69d"; +} + +.icon-heduan-2:before { + content: "\e69e"; +} + +.icon-heliu-3:before { + content: "\e69f"; +} + +.icon-heliu-1:before { + content: "\e6a0"; +} + +.icon-heliu-2:before { + content: "\e6a1"; +} + +.icon-hupo:before { + content: "\e6a2"; +} + +.icon-shuidianjidi:before { + content: "\e6a3"; +} + +.icon-map-gjszzDabiao:before { + content: "\e6a4"; +} + +.icon-map-gjszzBudabiao:before { + content: "\e6a5"; +} + +.icon-map-zjszzDabiao:before { + content: "\e6a6"; +} + +.icon-map-dxsdzGuihua:before { + content: "\e6a7"; +} + +.icon-map-zxsdzZaijian:before { + content: "\e6a8"; +} + +.icon-map-zxsdzGuihua:before { + content: "\e6a9"; +} + +.icon-map-zxsdzYijian:before { + content: "\e6aa"; +} + +.icon-map-dzTushi:before { + content: "\e6ab"; +} + +.icon-map-dabiaolv-3:before { + content: "\e6ac"; +} + +.icon-map-zjszzBudabiao:before { + content: "\e6ad"; +} + +.icon-map-dabiaolv-5:before { + content: "\e6ae"; +} + +.icon-map-dabiaolv-2:before { + content: "\e6af"; +} + +.icon-map-dxsdzZaijian:before { + content: "\e6b0"; +} + +.icon-map-dxsdzYijian:before { + content: "\e6b1"; +} + +.icon-map-dabiaolv-4:before { + content: "\e6b2"; +} + +.icon-map-dabiaolv-1:before { + content: "\e6b3"; +} + +.icon-topOutline:before { + content: "\e697"; +} + +.icon-topFill:before { + content: "\e698"; +} + +.icon-locationSymbol:before { + content: "\e699"; +} + +.icon-right:before { + content: "\e694"; +} + +.icon-left:before { + content: "\e695"; +} + +.icon-search:before { + content: "\e696"; +} + +.icon-fold:before { + content: "\e692"; +} + +.icon-unFold:before { + content: "\e693"; +} + +.icon-tiji:before { + content: "\e689"; +} + +.icon-layer:before { + content: "\e68a"; +} + +.icon-zoomIn:before { + content: "\e68b"; +} + +.icon-a-3D:before { + content: "\e68c"; +} + +.icon-downLoad:before { + content: "\e68d"; +} + +.icon-zoomOut:before { + content: "\e68e"; +} + +.icon-exitFullScreen:before { + content: "\e68f"; +} + +.icon-topic:before { + content: "\e690"; +} + +.icon-fullScreen:before { + content: "\e691"; +} diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.js b/frontend-sjgl/src/styles/iconfont/iconfont.js new file mode 100644 index 00000000..462d44a7 --- /dev/null +++ b/frontend-sjgl/src/styles/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_3714772='',(c=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,i,o,z,m,v=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}h=function(){var a,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_3714772,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?v(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=h,z=c.document,m=!1,p(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,t())})}function t(){m||(m=!0,o())}function p(){try{z.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}t()}})(window); \ No newline at end of file diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.json b/frontend-sjgl/src/styles/iconfont/iconfont.json new file mode 100644 index 00000000..eea7ebe5 --- /dev/null +++ b/frontend-sjgl/src/styles/iconfont/iconfont.json @@ -0,0 +1,3243 @@ +{ + "id": "3714772", + "name": "全过程", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "45678995", + "name": "map-yldczz", + "font_class": "map-yldczz", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "44142347", + "name": "sxjc-fill", + "font_class": "sxjc-fill", + "unicode": "e86d", + "unicode_decimal": 59501 + }, + { + "icon_id": "44142241", + "name": "yunyuchuan2", + "font_class": "yunyuchuan2", + "unicode": "e86e", + "unicode_decimal": 59502 + }, + { + "icon_id": "44142240", + "name": "ganyushan2", + "font_class": "ganyushan2", + "unicode": "e86f", + "unicode_decimal": 59503 + }, + { + "icon_id": "44142239", + "name": "shengyudou2", + "font_class": "shengyudou2", + "unicode": "e870", + "unicode_decimal": 59504 + }, + { + "icon_id": "44142238", + "name": "AGV2", + "font_class": "AGV2", + "unicode": "e871", + "unicode_decimal": 59505 + }, + { + "icon_id": "44142245", + "name": "shipin-fill", + "font_class": "shipin-fill", + "unicode": "e86b", + "unicode_decimal": 59499 + }, + { + "icon_id": "44142244", + "name": "yljc-fill", + "font_class": "yljc-fill", + "unicode": "e86c", + "unicode_decimal": 59500 + }, + { + "icon_id": "44142243", + "name": "hjjc2-fill", + "font_class": "hjjc2-fill", + "unicode": "e86a", + "unicode_decimal": 59498 + }, + { + "icon_id": "43945029", + "name": "star", + "font_class": "star", + "unicode": "e863", + "unicode_decimal": 59491 + }, + { + "icon_id": "43944999", + "name": "build", + "font_class": "build", + "unicode": "e862", + "unicode_decimal": 59490 + }, + { + "icon_id": "43883626", + "name": "zhatu", + "font_class": "zhatu", + "unicode": "e860", + "unicode_decimal": 59488 + }, + { + "icon_id": "43800749", + "name": "dongwubaohu", + "font_class": "dongwubaohu", + "unicode": "e85d", + "unicode_decimal": 59485 + }, + { + "icon_id": "43800748", + "name": "zhiwubaohu", + "font_class": "zhiwubaohu", + "unicode": "e85c", + "unicode_decimal": 59484 + }, + { + "icon_id": "43800747", + "name": "jingqu", + "font_class": "jingqu", + "unicode": "e85e", + "unicode_decimal": 59486 + }, + { + "icon_id": "43681296", + "name": "guoyusheshi2", + "font_class": "guoyusheshi2", + "unicode": "e855", + "unicode_decimal": 59477 + }, + { + "icon_id": "43558715", + "name": "shuiwen-line", + "font_class": "shuiwen-line", + "unicode": "e854", + "unicode_decimal": 59476 + }, + { + "icon_id": "43479701", + "name": "erjibaohu", + "font_class": "erjibaohu", + "unicode": "e853", + "unicode_decimal": 59475 + }, + { + "icon_id": "43479702", + "name": "shengzhongdianbh", + "font_class": "shengzhongdianbh", + "unicode": "e852", + "unicode_decimal": 59474 + }, + { + "icon_id": "43479652", + "name": "qingpiao", + "font_class": "qingpiao1", + "unicode": "e84f", + "unicode_decimal": 59471 + }, + { + "icon_id": "43479650", + "name": "yunxing", + "font_class": "yunxing", + "unicode": "e850", + "unicode_decimal": 59472 + }, + { + "icon_id": "43479651", + "name": "fish", + "font_class": "fish", + "unicode": "e851", + "unicode_decimal": 59473 + }, + { + "icon_id": "43433437", + "name": "shengtaibaohu-fill", + "font_class": "shengtaibaohu-fill", + "unicode": "e84b", + "unicode_decimal": 59467 + }, + { + "icon_id": "43433436", + "name": "kejichuangxin-fll", + "font_class": "kejichuangxin-fll", + "unicode": "e84d", + "unicode_decimal": 59469 + }, + { + "icon_id": "43433346", + "name": "shuitubaochi-fill", + "font_class": "shuitubaochi-fill", + "unicode": "e849", + "unicode_decimal": 59465 + }, + { + "icon_id": "43433345", + "name": "huanjingjiance-fill", + "font_class": "huanjingjiance-fill", + "unicode": "e84a", + "unicode_decimal": 59466 + }, + { + "icon_id": "43433343", + "name": "rongyu-fill", + "font_class": "rongyu-fill", + "unicode": "e84c", + "unicode_decimal": 59468 + }, + { + "icon_id": "43433341", + "name": "zonglan-fll", + "font_class": "zonglan-fll", + "unicode": "e848", + "unicode_decimal": 59464 + }, + { + "icon_id": "43433340", + "name": "yuleibaohu-fill", + "font_class": "yuleibaohu-fill", + "unicode": "e84e", + "unicode_decimal": 59470 + }, + { + "icon_id": "43078556", + "name": "aihezi", + "font_class": "aihezi", + "unicode": "e835", + "unicode_decimal": 59445 + }, + { + "icon_id": "41937960", + "name": "yunyuche", + "font_class": "yunyuche", + "unicode": "e82d", + "unicode_decimal": 59437 + }, + { + "icon_id": "41937959", + "name": "yudaofangliu", + "font_class": "yudaofangliu", + "unicode": "e82e", + "unicode_decimal": 59438 + }, + { + "icon_id": "41667578", + "name": "calendar", + "font_class": "calendar", + "unicode": "e82c", + "unicode_decimal": 59436 + }, + { + "icon_id": "41405944", + "name": "fenbu", + "font_class": "fenbu", + "unicode": "e82a", + "unicode_decimal": 59434 + }, + { + "icon_id": "41405943", + "name": "view6", + "font_class": "view6", + "unicode": "e82b", + "unicode_decimal": 59435 + }, + { + "icon_id": "40609010", + "name": "play", + "font_class": "play1", + "unicode": "e827", + "unicode_decimal": 59431 + }, + { + "icon_id": "40609009", + "name": "pause", + "font_class": "pause", + "unicode": "e828", + "unicode_decimal": 59432 + }, + { + "icon_id": "40580411", + "name": "agvxiaoche", + "font_class": "agvxiaoche", + "unicode": "e826", + "unicode_decimal": 59430 + }, + { + "icon_id": "40488822", + "name": "video", + "font_class": "video", + "unicode": "e825", + "unicode_decimal": 59429 + }, + { + "icon_id": "40485498", + "name": "dieliangmen", + "font_class": "dieliangmen1", + "unicode": "e821", + "unicode_decimal": 59425 + }, + { + "icon_id": "40485497", + "name": "ganyushan", + "font_class": "ganyushan", + "unicode": "e822", + "unicode_decimal": 59426 + }, + { + "icon_id": "40485496", + "name": "liuliangjiancezhan", + "font_class": "liuliangjiancezhan1", + "unicode": "e823", + "unicode_decimal": 59427 + }, + { + "icon_id": "40485495", + "name": "yunyuchuan", + "font_class": "yunyuchuan", + "unicode": "e824", + "unicode_decimal": 59428 + }, + { + "icon_id": "39661369", + "name": "zengzhizhanshuizhizhan", + "font_class": "zengzhizhanshuizhizhan", + "unicode": "e820", + "unicode_decimal": 59424 + }, + { + "icon_id": "39575958", + "name": "menuYuleiqixidihuanjingjiance", + "font_class": "menuYuleiqixidihuanjingjiance", + "unicode": "e81f", + "unicode_decimal": 59423 + }, + { + "icon_id": "39575107", + "name": "menuXitongshezhi", + "font_class": "menuXitongshezhi", + "unicode": "e81e", + "unicode_decimal": 59422 + }, + { + "icon_id": "39574693", + "name": "menuYuleiqixidi", + "font_class": "menuYuleiqixidi", + "unicode": "e81c", + "unicode_decimal": 59420 + }, + { + "icon_id": "39574692", + "name": "menuFuzhugongneng", + "font_class": "menuFuzhugongneng", + "unicode": "e81d", + "unicode_decimal": 59421 + }, + { + "icon_id": "39567789", + "name": "iconArrowL", + "font_class": "iconArrowL", + "unicode": "e81b", + "unicode_decimal": 59419 + }, + { + "icon_id": "39518472", + "name": "yumiao", + "font_class": "yumiao", + "unicode": "e819", + "unicode_decimal": 59417 + }, + { + "icon_id": "39518471", + "name": "qizhachuzhi", + "font_class": "qizhachuzhi", + "unicode": "e81a", + "unicode_decimal": 59418 + }, + { + "icon_id": "39382616", + "name": "iconGlobal", + "font_class": "iconGlobal", + "unicode": "e818", + "unicode_decimal": 59416 + }, + { + "icon_id": "39372929", + "name": "iconQuestion", + "font_class": "iconQuestion", + "unicode": "e817", + "unicode_decimal": 59415 + }, + { + "icon_id": "39306140", + "name": "menuQixiangjiance", + "font_class": "menuQixiangjiance", + "unicode": "e815", + "unicode_decimal": 59413 + }, + { + "icon_id": "39306139", + "name": "menuShuiwenjiance2", + "font_class": "menuShuiwenjiance2", + "unicode": "e816", + "unicode_decimal": 59414 + }, + { + "icon_id": "39207154", + "name": "close", + "font_class": "close", + "unicode": "e814", + "unicode_decimal": 59412 + }, + { + "icon_id": "39200049", + "name": "iconArrowRight", + "font_class": "iconArrowRight", + "unicode": "e813", + "unicode_decimal": 59411 + }, + { + "icon_id": "39199731", + "name": "iconWubianhua", + "font_class": "iconWubianhua", + "unicode": "e811", + "unicode_decimal": 59409 + }, + { + "icon_id": "39199730", + "name": "iconXiajiang", + "font_class": "iconXiajiang", + "unicode": "e812", + "unicode_decimal": 59410 + }, + { + "icon_id": "39197738", + "name": "iconShangsheng", + "font_class": "iconShangsheng", + "unicode": "e810", + "unicode_decimal": 59408 + }, + { + "icon_id": "39197740", + "name": "iconWeiguifangmu", + "font_class": "iconWeiguifangmu", + "unicode": "e80e", + "unicode_decimal": 59406 + }, + { + "icon_id": "39197739", + "name": "iconJiaoshuiyanghu", + "font_class": "iconJiaoshuiyanghu", + "unicode": "e80f", + "unicode_decimal": 59407 + }, + { + "icon_id": "39197661", + "name": "iconDaitianbao", + "font_class": "iconDaitianbao", + "unicode": "e80d", + "unicode_decimal": 59405 + }, + { + "icon_id": "39197651", + "name": "iconDaishenhe", + "font_class": "iconDaishenhe", + "unicode": "e80c", + "unicode_decimal": 59404 + }, + { + "icon_id": "39194034", + "name": "iconLindi", + "font_class": "iconLindi", + "unicode": "e80a", + "unicode_decimal": 59402 + }, + { + "icon_id": "39194033", + "name": "iconZongmianji", + "font_class": "iconZongmianji", + "unicode": "e80b", + "unicode_decimal": 59403 + }, + { + "icon_id": "39191494", + "name": "iconWarning", + "font_class": "iconWarning", + "unicode": "e809", + "unicode_decimal": 59401 + }, + { + "icon_id": "39191452", + "name": "iconNodata", + "font_class": "iconNodata", + "unicode": "e806", + "unicode_decimal": 59398 + }, + { + "icon_id": "39191453", + "name": "iconNormal ", + "font_class": "iconNormal", + "unicode": "e807", + "unicode_decimal": 59399 + }, + { + "icon_id": "39189912", + "name": "iconYizai", + "font_class": "iconYizai", + "unicode": "e804", + "unicode_decimal": 59396 + }, + { + "icon_id": "39189909", + "name": "iconCaodi", + "font_class": "iconCaodi", + "unicode": "e805", + "unicode_decimal": 59397 + }, + { + "icon_id": "39161613", + "name": "iconTitle", + "font_class": "iconTitle1", + "unicode": "e802", + "unicode_decimal": 59394 + }, + { + "icon_id": "39114993", + "name": "iconTitle", + "font_class": "iconTitle", + "unicode": "e7df", + "unicode_decimal": 59359 + }, + { + "icon_id": "39113430", + "name": "iconUser", + "font_class": "iconUser1", + "unicode": "e801", + "unicode_decimal": 59393 + }, + { + "icon_id": "39100001", + "name": "menuDefault", + "font_class": "menuDefault", + "unicode": "e800", + "unicode_decimal": 59392 + }, + { + "icon_id": "39072765", + "name": "iconBell", + "font_class": "iconBell", + "unicode": "e7ff", + "unicode_decimal": 59391 + }, + { + "icon_id": "39070820", + "name": "iconFunction", + "font_class": "iconFunction", + "unicode": "e7fd", + "unicode_decimal": 59389 + }, + { + "icon_id": "39070733", + "name": "iconRoaming", + "font_class": "iconRoaming", + "unicode": "e7fe", + "unicode_decimal": 59390 + }, + { + "icon_id": "39069476", + "name": "menuZhinengfenxi", + "font_class": "menuZhinengfenxi", + "unicode": "e7fa", + "unicode_decimal": 59386 + }, + { + "icon_id": "39069479", + "name": "menuShujvchaxun", + "font_class": "menuShujvchaxun", + "unicode": "e7fb", + "unicode_decimal": 59387 + }, + { + "icon_id": "39069475", + "name": "menuZhihuigaojing", + "font_class": "menuZhihuigaojing", + "unicode": "e7fc", + "unicode_decimal": 59388 + }, + { + "icon_id": "39069487", + "name": "menuShuiwenjiance", + "font_class": "menuShuiwenjiance", + "unicode": "e7f0", + "unicode_decimal": 59376 + }, + { + "icon_id": "39069486", + "name": "menuShuizhijiance", + "font_class": "menuShuizhijiance", + "unicode": "e7f1", + "unicode_decimal": 59377 + }, + { + "icon_id": "39069485", + "name": "menuZengzhifangliu", + "font_class": "menuZengzhifangliu", + "unicode": "e7f2", + "unicode_decimal": 59378 + }, + { + "icon_id": "39069484", + "name": "menuDianzhanzhuanti", + "font_class": "menuDianzhanzhuanti", + "unicode": "e7f3", + "unicode_decimal": 59379 + }, + { + "icon_id": "39069481", + "name": "menuSheshiyunxing", + "font_class": "menuSheshiyunxing", + "unicode": "e7f4", + "unicode_decimal": 59380 + }, + { + "icon_id": "39069482", + "name": "menuShuishengdiaocha", + "font_class": "menuShuishengdiaocha", + "unicode": "e7f5", + "unicode_decimal": 59381 + }, + { + "icon_id": "39069483", + "name": "menuLushengdiaocha", + "font_class": "menuLushengdiaocha", + "unicode": "e7f6", + "unicode_decimal": 59382 + }, + { + "icon_id": "39069478", + "name": "menuYuqingjiankong", + "font_class": "menuYuqingjiankong", + "unicode": "e7f7", + "unicode_decimal": 59383 + }, + { + "icon_id": "39069477", + "name": "menuCuoshiluoshi", + "font_class": "menuCuoshiluoshi", + "unicode": "e7f8", + "unicode_decimal": 59384 + }, + { + "icon_id": "39069480", + "name": "menuHome", + "font_class": "menuHome", + "unicode": "e7f9", + "unicode_decimal": 59385 + }, + { + "icon_id": "39052791", + "name": "iconRetract", + "font_class": "iconRetract", + "unicode": "e7ee", + "unicode_decimal": 59374 + }, + { + "icon_id": "39052718", + "name": "iconHide", + "font_class": "iconHide", + "unicode": "e7ed", + "unicode_decimal": 59373 + }, + { + "icon_id": "39052735", + "name": "icon2D", + "font_class": "icon2D", + "unicode": "e7e7", + "unicode_decimal": 59367 + }, + { + "icon_id": "39052703", + "name": "iconLayer", + "font_class": "iconLayer", + "unicode": "e7e2", + "unicode_decimal": 59362 + }, + { + "icon_id": "39052477", + "name": "iconSearch", + "font_class": "iconSearch", + "unicode": "e7e8", + "unicode_decimal": 59368 + }, + { + "icon_id": "39052476", + "name": "iconExpand", + "font_class": "iconExpand", + "unicode": "e7e9", + "unicode_decimal": 59369 + }, + { + "icon_id": "39052475", + "name": "iconDownload", + "font_class": "iconDownload", + "unicode": "e7ea", + "unicode_decimal": 59370 + }, + { + "icon_id": "39052474", + "name": "iconFillter", + "font_class": "iconFillter", + "unicode": "e7eb", + "unicode_decimal": 59371 + }, + { + "icon_id": "39052459", + "name": "icon3D", + "font_class": "icon3D1", + "unicode": "e7ec", + "unicode_decimal": 59372 + }, + { + "icon_id": "39052483", + "name": "iconZoomOut", + "font_class": "iconZoomOut", + "unicode": "e7e3", + "unicode_decimal": 59363 + }, + { + "icon_id": "39052482", + "name": "iconZoomIn", + "font_class": "iconZoomIn", + "unicode": "e7e4", + "unicode_decimal": 59364 + }, + { + "icon_id": "39052479", + "name": "iconReset", + "font_class": "iconReset", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "39052480", + "name": "iconMeasuringTool ", + "font_class": "iconMeasuringTool", + "unicode": "e7e6", + "unicode_decimal": 59366 + }, + { + "icon_id": "39052333", + "name": "iconArrow", + "font_class": "iconArrow", + "unicode": "e7e1", + "unicode_decimal": 59361 + }, + { + "icon_id": "39052367", + "name": "iconArrowRightBig", + "font_class": "iconArrowRightBig", + "unicode": "e7e0", + "unicode_decimal": 59360 + }, + { + "icon_id": "39052242", + "name": "iconSetting", + "font_class": "iconSetting", + "unicode": "e7de", + "unicode_decimal": 59358 + }, + { + "icon_id": "39051948", + "name": "iconMore", + "font_class": "iconMore", + "unicode": "e7dd", + "unicode_decimal": 59357 + }, + { + "icon_id": "39051937", + "name": "menuFold", + "font_class": "menuFold", + "unicode": "e7db", + "unicode_decimal": 59355 + }, + { + "icon_id": "39051936", + "name": "menuUnfold", + "font_class": "menuUnfold", + "unicode": "e7dc", + "unicode_decimal": 59356 + }, + { + "icon_id": "39004921", + "name": "list", + "font_class": "list", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "3041446", + "name": "arrowRight", + "font_class": "tuxing", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "38917786", + "name": "menu", + "font_class": "menu", + "unicode": "e7d9", + "unicode_decimal": 59353 + }, + { + "icon_id": "38716532", + "name": "Q2", + "font_class": "Q2", + "unicode": "e7d5", + "unicode_decimal": 59349 + }, + { + "icon_id": "38716531", + "name": "Q3", + "font_class": "Q3", + "unicode": "e7d6", + "unicode_decimal": 59350 + }, + { + "icon_id": "38716530", + "name": "Q4", + "font_class": "Q4", + "unicode": "e7d7", + "unicode_decimal": 59351 + }, + { + "icon_id": "38716529", + "name": "Q1", + "font_class": "Q1", + "unicode": "e7d8", + "unicode_decimal": 59352 + }, + { + "icon_id": "38681739", + "name": "jiankong", + "font_class": "jiankong", + "unicode": "e7d4", + "unicode_decimal": 59348 + }, + { + "icon_id": "38681978", + "name": "jiankongFill", + "font_class": "jiankongFill", + "unicode": "e7d3", + "unicode_decimal": 59347 + }, + { + "icon_id": "38677226", + "name": "noData", + "font_class": "noData", + "unicode": "e7d2", + "unicode_decimal": 59346 + }, + { + "icon_id": "38628178", + "name": "wubianhua", + "font_class": "wubianhua", + "unicode": "e7d1", + "unicode_decimal": 59345 + }, + { + "icon_id": "38623169", + "name": "xiajiang", + "font_class": "xiajiang", + "unicode": "e7d0", + "unicode_decimal": 59344 + }, + { + "icon_id": "38610202", + "name": "gutifeiwu", + "font_class": "gutifeiwu", + "unicode": "e7cf", + "unicode_decimal": 59343 + }, + { + "icon_id": "38504078", + "name": "damianji", + "font_class": "damianji", + "unicode": "e7cb", + "unicode_decimal": 59339 + }, + { + "icon_id": "38504077", + "name": "xiaomianji", + "font_class": "xiaomianji", + "unicode": "e7cc", + "unicode_decimal": 59340 + }, + { + "icon_id": "38504075", + "name": "jiance", + "font_class": "jiance", + "unicode": "e7cd", + "unicode_decimal": 59341 + }, + { + "icon_id": "38504076", + "name": "qingpiao", + "font_class": "qingpiao", + "unicode": "e7ce", + "unicode_decimal": 59342 + }, + { + "icon_id": "38494860", + "name": "shangxingguoyu", + "font_class": "shangxingguoyu", + "unicode": "e7c8", + "unicode_decimal": 59336 + }, + { + "icon_id": "38494859", + "name": "xiaxingguoyu", + "font_class": "xiaxingguoyu", + "unicode": "e7c9", + "unicode_decimal": 59337 + }, + { + "icon_id": "38494858", + "name": "leijiyunxing", + "font_class": "leijiyunxing", + "unicode": "e7ca", + "unicode_decimal": 59338 + }, + { + "icon_id": "38485886", + "name": "bgCollapse", + "font_class": "bgCollapse", + "unicode": "e7c7", + "unicode_decimal": 59335 + }, + { + "icon_id": "38485769", + "name": "downOutline", + "font_class": "downOutline", + "unicode": "e7c6", + "unicode_decimal": 59334 + }, + { + "icon_id": "38429787", + "name": "wujiankong", + "font_class": "wujiankong", + "unicode": "e7c2", + "unicode_decimal": 59330 + }, + { + "icon_id": "38429786", + "name": "view4", + "font_class": "view4", + "unicode": "e7c3", + "unicode_decimal": 59331 + }, + { + "icon_id": "38429785", + "name": "view1", + "font_class": "view1", + "unicode": "e7c4", + "unicode_decimal": 59332 + }, + { + "icon_id": "38429784", + "name": "view9", + "font_class": "view9", + "unicode": "e7c5", + "unicode_decimal": 59333 + }, + { + "icon_id": "38238707", + "name": "feishuipaifang", + "font_class": "feishuipaifang", + "unicode": "e7bc", + "unicode_decimal": 59324 + }, + { + "icon_id": "38238706", + "name": "shenhe", + "font_class": "shenhe", + "unicode": "e7bd", + "unicode_decimal": 59325 + }, + { + "icon_id": "38238705", + "name": "shenghuolaji", + "font_class": "shenghuolaji", + "unicode": "e7be", + "unicode_decimal": 59326 + }, + { + "icon_id": "38238702", + "name": "feishuichuli", + "font_class": "feishuichuli", + "unicode": "e7bf", + "unicode_decimal": 59327 + }, + { + "icon_id": "38238704", + "name": "weixianwu", + "font_class": "weixianwu", + "unicode": "e7c0", + "unicode_decimal": 59328 + }, + { + "icon_id": "38238703", + "name": "tianbao", + "font_class": "tianbao", + "unicode": "e7c1", + "unicode_decimal": 59329 + }, + { + "icon_id": "38139082", + "name": "6", + "font_class": "a-6", + "unicode": "e7b7", + "unicode_decimal": 59319 + }, + { + "icon_id": "38139081", + "name": "2", + "font_class": "a-2", + "unicode": "e7b8", + "unicode_decimal": 59320 + }, + { + "icon_id": "38139078", + "name": "10", + "font_class": "a-10", + "unicode": "e7b9", + "unicode_decimal": 59321 + }, + { + "icon_id": "38139077", + "name": "11", + "font_class": "a-11", + "unicode": "e7ba", + "unicode_decimal": 59322 + }, + { + "icon_id": "38139076", + "name": "12", + "font_class": "a-12", + "unicode": "e7bb", + "unicode_decimal": 59323 + }, + { + "icon_id": "38139080", + "name": "7", + "font_class": "a-7", + "unicode": "e7b6", + "unicode_decimal": 59318 + }, + { + "icon_id": "38139087", + "name": "9", + "font_class": "a-9", + "unicode": "e7b0", + "unicode_decimal": 59312 + }, + { + "icon_id": "38139086", + "name": "5", + "font_class": "a-5", + "unicode": "e7b1", + "unicode_decimal": 59313 + }, + { + "icon_id": "38139085", + "name": "3", + "font_class": "a-3", + "unicode": "e7b2", + "unicode_decimal": 59314 + }, + { + "icon_id": "38139079", + "name": "8", + "font_class": "a-8", + "unicode": "e7b3", + "unicode_decimal": 59315 + }, + { + "icon_id": "38139084", + "name": "1", + "font_class": "a-1", + "unicode": "e7b4", + "unicode_decimal": 59316 + }, + { + "icon_id": "38139083", + "name": "4", + "font_class": "a-4", + "unicode": "e7b5", + "unicode_decimal": 59317 + }, + { + "icon_id": "38138396", + "name": "shangsheng", + "font_class": "shangsheng", + "unicode": "e7a7", + "unicode_decimal": 59303 + }, + { + "icon_id": "38138394", + "name": "siyu", + "font_class": "siyu", + "unicode": "e7a8", + "unicode_decimal": 59304 + }, + { + "icon_id": "38138392", + "name": "jiyunyu", + "font_class": "jiyunyu", + "unicode": "e7a9", + "unicode_decimal": 59305 + }, + { + "icon_id": "38138393", + "name": "dieliangmen", + "font_class": "dieliangmen", + "unicode": "e7aa", + "unicode_decimal": 59306 + }, + { + "icon_id": "38138389", + "name": "shuidianzhanGaojing", + "font_class": "shuidianzhanGaojing", + "unicode": "e7ab", + "unicode_decimal": 59307 + }, + { + "icon_id": "38138388", + "name": "biaoji", + "font_class": "biaoji", + "unicode": "e7ac", + "unicode_decimal": 59308 + }, + { + "icon_id": "38138391", + "name": "shengyuji", + "font_class": "shengyuji", + "unicode": "e7ad", + "unicode_decimal": 59309 + }, + { + "icon_id": "38138390", + "name": "shuidianzhanWushujv", + "font_class": "shuidianzhanWushujv", + "unicode": "e7ae", + "unicode_decimal": 59310 + }, + { + "icon_id": "38138387", + "name": "yudao", + "font_class": "yudao", + "unicode": "e7af", + "unicode_decimal": 59311 + }, + { + "icon_id": "38138397", + "name": "piaofuwu", + "font_class": "piaofuwu", + "unicode": "e7a5", + "unicode_decimal": 59301 + }, + { + "icon_id": "38138395", + "name": "shebeiLixian", + "font_class": "shebeiLixian", + "unicode": "e7a6", + "unicode_decimal": 59302 + }, + { + "icon_id": "38121558", + "name": "Android", + "font_class": "Android", + "unicode": "e7a3", + "unicode_decimal": 59299 + }, + { + "icon_id": "38121557", + "name": "iOS", + "font_class": "iOS", + "unicode": "e7a4", + "unicode_decimal": 59300 + }, + { + "icon_id": "38116883", + "name": "rightB", + "font_class": "rightB", + "unicode": "e7a1", + "unicode_decimal": 59297 + }, + { + "icon_id": "38116882", + "name": "leftB", + "font_class": "leftB", + "unicode": "e7a2", + "unicode_decimal": 59298 + }, + { + "icon_id": "38101267", + "name": "bellOutlined", + "font_class": "bellOutlined", + "unicode": "e7a0", + "unicode_decimal": 59296 + }, + { + "icon_id": "37944974", + "name": "shebeiZhengchang", + "font_class": "shebeiZhengchang", + "unicode": "e79d", + "unicode_decimal": 59293 + }, + { + "icon_id": "37944973", + "name": "shebeiZongshu", + "font_class": "shebeiZongshu", + "unicode": "e79e", + "unicode_decimal": 59294 + }, + { + "icon_id": "37944972", + "name": "shebeiYichang", + "font_class": "shebeiYichang", + "unicode": "e79f", + "unicode_decimal": 59295 + }, + { + "icon_id": "37837884", + "name": "xushuiliang", + "font_class": "xushuiliang", + "unicode": "e79b", + "unicode_decimal": 59291 + }, + { + "icon_id": "37791572", + "name": "time", + "font_class": "time", + "unicode": "e79c", + "unicode_decimal": 59292 + }, + { + "icon_id": "37762629", + "name": "fadianliang", + "font_class": "fadianliang", + "unicode": "e79a", + "unicode_decimal": 59290 + }, + { + "icon_id": "37762630", + "name": "zhuangji", + "font_class": "zhuangji", + "unicode": "e799", + "unicode_decimal": 59289 + }, + { + "icon_id": "37762556", + "name": "sheshiyunxing", + "font_class": "sheshiyunxing", + "unicode": "e791", + "unicode_decimal": 59281 + }, + { + "icon_id": "37762555", + "name": "huanbaodiaocha", + "font_class": "huanbaodiaocha", + "unicode": "e792", + "unicode_decimal": 59282 + }, + { + "icon_id": "37762553", + "name": "shengtailiuliang2", + "font_class": "shengtailiuliang2", + "unicode": "e793", + "unicode_decimal": 59283 + }, + { + "icon_id": "37762554", + "name": "cuoshiluoshi", + "font_class": "cuoshiluoshi", + "unicode": "e794", + "unicode_decimal": 59284 + }, + { + "icon_id": "37762552", + "name": "huanbaofengmao", + "font_class": "huanbaofengmao", + "unicode": "e795", + "unicode_decimal": 59285 + }, + { + "icon_id": "37762551", + "name": "huanjingjiance", + "font_class": "huanjingjiance", + "unicode": "e796", + "unicode_decimal": 59286 + }, + { + "icon_id": "37762550", + "name": "shuidianzhan", + "font_class": "shuidianzhan1", + "unicode": "e797", + "unicode_decimal": 59287 + }, + { + "icon_id": "37762549", + "name": "zonglan", + "font_class": "zonglan", + "unicode": "e798", + "unicode_decimal": 59288 + }, + { + "icon_id": "26067061", + "name": "设置", + "font_class": "SetUp", + "unicode": "e790", + "unicode_decimal": 59280 + }, + { + "icon_id": "7036704", + "name": "下移", + "font_class": "xiayi", + "unicode": "e636", + "unicode_decimal": 58934 + }, + { + "icon_id": "21585942", + "name": "上移", + "font_class": "shangyi", + "unicode": "e78f", + "unicode_decimal": 59279 + }, + { + "icon_id": "18509029", + "name": "Save", + "font_class": "Save", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "32376957", + "name": "横杠", + "font_class": "icon_horizontal_bar", + "unicode": "e829", + "unicode_decimal": 59433 + }, + { + "icon_id": "37070357", + "name": "mubiaoguoyushuliang", + "font_class": "mubiaoguoyushuliang", + "unicode": "e78c", + "unicode_decimal": 59276 + }, + { + "icon_id": "37070355", + "name": "guojiaqixiangzhan", + "font_class": "guojiaqixiangzhan", + "unicode": "e78d", + "unicode_decimal": 59277 + }, + { + "icon_id": "37070356", + "name": "shijiguoyuzhonglei", + "font_class": "shijiguoyuzhonglei", + "unicode": "e78e", + "unicode_decimal": 59278 + }, + { + "icon_id": "37070359", + "name": "shuidianzhan", + "font_class": "shuidianzhan", + "unicode": "e78a", + "unicode_decimal": 59274 + }, + { + "icon_id": "37070358", + "name": "zhuangjirongliang", + "font_class": "zhuangjirongliang", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "37032644", + "name": "graphItem", + "font_class": "graphItem", + "unicode": "e789", + "unicode_decimal": 59273 + }, + { + "icon_id": "36998654", + "name": "icon_视频播放", + "font_class": "icon_shipinbofang", + "unicode": "e788", + "unicode_decimal": 59272 + }, + { + "icon_id": "36998447", + "name": "鱼种数量", + "font_class": "yuzhongshuliang", + "unicode": "e783", + "unicode_decimal": 59267 + }, + { + "icon_id": "36998446", + "name": "淘汰数量", + "font_class": "taotaishuliang", + "unicode": "e784", + "unicode_decimal": 59268 + }, + { + "icon_id": "36998444", + "name": "icon_更多", + "font_class": "icon_gengduo", + "unicode": "e785", + "unicode_decimal": 59269 + }, + { + "icon_id": "36998445", + "name": "icon_传感器", + "font_class": "icon_chuanganqi", + "unicode": "e786", + "unicode_decimal": 59270 + }, + { + "icon_id": "36998443", + "name": "icon_尾", + "font_class": "icon_wei", + "unicode": "e787", + "unicode_decimal": 59271 + }, + { + "icon_id": "36998455", + "name": "鱼苗数量", + "font_class": "yumiaoshuliang", + "unicode": "e77a", + "unicode_decimal": 59258 + }, + { + "icon_id": "36998456", + "name": "icon_行为预警", + "font_class": "icon_hangweiyujing", + "unicode": "e77b", + "unicode_decimal": 59259 + }, + { + "icon_id": "36998454", + "name": "亲鱼死亡数量", + "font_class": "qinyusiwangshuliang", + "unicode": "e77c", + "unicode_decimal": 59260 + }, + { + "icon_id": "36998450", + "name": "产卵数量", + "font_class": "chanluanshuliang", + "unicode": "e77d", + "unicode_decimal": 59261 + }, + { + "icon_id": "36998453", + "name": "放流数量", + "font_class": "fangliushuliang", + "unicode": "e77e", + "unicode_decimal": 59262 + }, + { + "icon_id": "36998451", + "name": "采集数量", + "font_class": "caijishuliang", + "unicode": "e77f", + "unicode_decimal": 59263 + }, + { + "icon_id": "36998452", + "name": "鱼苗死亡数量", + "font_class": "yumiaosiwangshuliang", + "unicode": "e780", + "unicode_decimal": 59264 + }, + { + "icon_id": "36998448", + "name": "站点数量", + "font_class": "zhandianshuliang", + "unicode": "e781", + "unicode_decimal": 59265 + }, + { + "icon_id": "36998449", + "name": "icon_占比", + "font_class": "icon_zhanbi", + "unicode": "e782", + "unicode_decimal": 59266 + }, + { + "icon_id": "36983113", + "name": "iconDaping", + "font_class": "iconDaping", + "unicode": "e779", + "unicode_decimal": 59257 + }, + { + "icon_id": "36983095", + "name": "iconShujvtianbao", + "font_class": "iconShujvtianbao", + "unicode": "e772", + "unicode_decimal": 59250 + }, + { + "icon_id": "36983094", + "name": "iconPingmian", + "font_class": "iconPingmian", + "unicode": "e773", + "unicode_decimal": 59251 + }, + { + "icon_id": "36983093", + "name": "iconShujvguanli", + "font_class": "iconShujvguanli", + "unicode": "e774", + "unicode_decimal": 59252 + }, + { + "icon_id": "36983092", + "name": "iconZengzhizhan", + "font_class": "iconZengzhizhan", + "unicode": "e775", + "unicode_decimal": 59253 + }, + { + "icon_id": "36983091", + "name": "iconZhihuijiance", + "font_class": "iconZhihuijiance", + "unicode": "e776", + "unicode_decimal": 59254 + }, + { + "icon_id": "36983090", + "name": "left", + "font_class": "left1", + "unicode": "e777", + "unicode_decimal": 59255 + }, + { + "icon_id": "36983089", + "name": "right", + "font_class": "right1", + "unicode": "e778", + "unicode_decimal": 59256 + }, + { + "icon_id": "36983097", + "name": "iconShujvcaiji", + "font_class": "iconShujvcaiji", + "unicode": "e76f", + "unicode_decimal": 59247 + }, + { + "icon_id": "36983096", + "name": "icon3D", + "font_class": "icon3D", + "unicode": "e770", + "unicode_decimal": 59248 + }, + { + "icon_id": "36746084", + "name": "return", + "font_class": "return", + "unicode": "e76e", + "unicode_decimal": 59246 + }, + { + "icon_id": "36721830", + "name": "shuizhi", + "font_class": "shuizhi", + "unicode": "e76b", + "unicode_decimal": 59243 + }, + { + "icon_id": "36721829", + "name": "chuixiangshuiwen", + "font_class": "chuixiangshuiwen", + "unicode": "e76c", + "unicode_decimal": 59244 + }, + { + "icon_id": "36721828", + "name": "home", + "font_class": "home", + "unicode": "e76d", + "unicode_decimal": 59245 + }, + { + "icon_id": "36656309", + "name": "icon-guanli", + "font_class": "icon-guanli", + "unicode": "e769", + "unicode_decimal": 59241 + }, + { + "icon_id": "36656307", + "name": "icon-jiance", + "font_class": "icon-jiance", + "unicode": "e76a", + "unicode_decimal": 59242 + }, + { + "icon_id": "36656311", + "name": "icon-peizhi", + "font_class": "icon-peizhi", + "unicode": "e764", + "unicode_decimal": 59236 + }, + { + "icon_id": "36656312", + "name": "icon-qingkuang", + "font_class": "icon-qingkuang", + "unicode": "e765", + "unicode_decimal": 59237 + }, + { + "icon_id": "36656313", + "name": "icon-tongji", + "font_class": "icon-tongji", + "unicode": "e766", + "unicode_decimal": 59238 + }, + { + "icon_id": "36656310", + "name": "icon-weihu", + "font_class": "icon-weihu", + "unicode": "e767", + "unicode_decimal": 59239 + }, + { + "icon_id": "36656308", + "name": "icon-zidingyi", + "font_class": "icon-zidingyi", + "unicode": "e768", + "unicode_decimal": 59240 + }, + { + "icon_id": "36376274", + "name": "mapPin", + "font_class": "mapPin", + "unicode": "e762", + "unicode_decimal": 59234 + }, + { + "icon_id": "36376275", + "name": "fishMore", + "font_class": "fishMore", + "unicode": "e763", + "unicode_decimal": 59235 + }, + { + "icon_id": "36317425", + "name": "shuizhiyaosushezhi", + "font_class": "shuizhiyaosushezhi", + "unicode": "e760", + "unicode_decimal": 59232 + }, + { + "icon_id": "36317426", + "name": "rengongshuizhizhan", + "font_class": "rengongshuizhizhan", + "unicode": "e761", + "unicode_decimal": 59233 + }, + { + "icon_id": "36261929", + "name": "closeCircle", + "font_class": "closeCircle", + "unicode": "e75e", + "unicode_decimal": 59230 + }, + { + "icon_id": "36261930", + "name": "checkboxCircle", + "font_class": "checkboxCircle", + "unicode": "e75f", + "unicode_decimal": 59231 + }, + { + "icon_id": "36147390", + "name": "stop", + "font_class": "stop", + "unicode": "e75d", + "unicode_decimal": 59229 + }, + { + "icon_id": "36066403", + "name": "arrowUp", + "font_class": "arrowUp", + "unicode": "e75b", + "unicode_decimal": 59227 + }, + { + "icon_id": "36066404", + "name": "arrowDown", + "font_class": "arrowDown", + "unicode": "e75c", + "unicode_decimal": 59228 + }, + { + "icon_id": "35969664", + "name": "guojiashuiwenzhan", + "font_class": "guojiashuiwenzhan", + "unicode": "e757", + "unicode_decimal": 59223 + }, + { + "icon_id": "35969665", + "name": "guojiashuizhizhan", + "font_class": "guojiashuizhizhan", + "unicode": "e758", + "unicode_decimal": 59224 + }, + { + "icon_id": "35969666", + "name": "qixiangzhan", + "font_class": "qixiangzhan", + "unicode": "e759", + "unicode_decimal": 59225 + }, + { + "icon_id": "35969667", + "name": "zijianshuiwenzhan", + "font_class": "zijianshuiwenzhan", + "unicode": "e75a", + "unicode_decimal": 59226 + }, + { + "icon_id": "23150232", + "name": "配置管理", + "font_class": "Dispose", + "unicode": "e756", + "unicode_decimal": 59222 + }, + { + "icon_id": "35538129", + "name": "lindi", + "font_class": "lindi", + "unicode": "e755", + "unicode_decimal": 59221 + }, + { + "icon_id": "35514104", + "name": "clearMap", + "font_class": "clearMap", + "unicode": "e750", + "unicode_decimal": 59216 + }, + { + "icon_id": "35514105", + "name": "startPoint", + "font_class": "startPoint", + "unicode": "e751", + "unicode_decimal": 59217 + }, + { + "icon_id": "35514106", + "name": "equipment", + "font_class": "equipment1", + "unicode": "e752", + "unicode_decimal": 59218 + }, + { + "icon_id": "35514107", + "name": "fund", + "font_class": "fund1", + "unicode": "e753", + "unicode_decimal": 59219 + }, + { + "icon_id": "35514108", + "name": "jiuzhu", + "font_class": "jiuzhu", + "unicode": "e754", + "unicode_decimal": 59220 + }, + { + "icon_id": "35512323", + "name": "yulei", + "font_class": "yulei", + "unicode": "e74e", + "unicode_decimal": 59214 + }, + { + "icon_id": "35512324", + "name": "yuleizengzhizhan", + "font_class": "yuleizengzhizhan1", + "unicode": "e74f", + "unicode_decimal": 59215 + }, + { + "icon_id": "35329528", + "name": "play-circle", + "font_class": "play-circle", + "unicode": "e744", + "unicode_decimal": 59204 + }, + { + "icon_id": "35329529", + "name": "pause-circle", + "font_class": "pause-circle", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "35329530", + "name": "normal", + "font_class": "normal", + "unicode": "e746", + "unicode_decimal": 59206 + }, + { + "icon_id": "35329531", + "name": "equipment", + "font_class": "equipment", + "unicode": "e747", + "unicode_decimal": 59207 + }, + { + "icon_id": "35329532", + "name": "people", + "font_class": "people1", + "unicode": "e748", + "unicode_decimal": 59208 + }, + { + "icon_id": "35329534", + "name": "dam", + "font_class": "dam", + "unicode": "e749", + "unicode_decimal": 59209 + }, + { + "icon_id": "35329535", + "name": "abnormal", + "font_class": "abnormal", + "unicode": "e74a", + "unicode_decimal": 59210 + }, + { + "icon_id": "35329536", + "name": "chart", + "font_class": "chart", + "unicode": "e74b", + "unicode_decimal": 59211 + }, + { + "icon_id": "35329538", + "name": "fund", + "font_class": "fund", + "unicode": "e74c", + "unicode_decimal": 59212 + }, + { + "icon_id": "35329540", + "name": "waterReplenishing", + "font_class": "waterReplenishing", + "unicode": "e74d", + "unicode_decimal": 59213 + }, + { + "icon_id": "24828048", + "name": "删除", + "font_class": "Delete1", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "25887734", + "name": "添加子节点", + "font_class": "AddChildNode", + "unicode": "e771", + "unicode_decimal": 59249 + }, + { + "icon_id": "30597001", + "name": "三角上", + "font_class": "icon_small_up", + "unicode": "e803", + "unicode_decimal": 59395 + }, + { + "icon_id": "30597006", + "name": "三角下", + "font_class": "icon_small_down", + "unicode": "e808", + "unicode_decimal": 59400 + }, + { + "icon_id": "21101546", + "name": "重置", + "font_class": "Redo", + "unicode": "e741", + "unicode_decimal": 59201 + }, + { + "icon_id": "21101553", + "name": "搜索", + "font_class": "Search", + "unicode": "e742", + "unicode_decimal": 59202 + }, + { + "icon_id": "22397863", + "name": "导航", + "font_class": "daohang", + "unicode": "e743", + "unicode_decimal": 59203 + }, + { + "icon_id": "23791250", + "name": "详情", + "font_class": "Details", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "24828040", + "name": "编辑", + "font_class": "Edit", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "33737075", + "name": "接収", + "font_class": "icon_receiving", + "unicode": "e845", + "unicode_decimal": 59461 + }, + { + "icon_id": "23141892", + "name": "导入", + "font_class": "Import1", + "unicode": "e73f", + "unicode_decimal": 59199 + }, + { + "icon_id": "23141893", + "name": "导出", + "font_class": "Export", + "unicode": "e740", + "unicode_decimal": 59200 + }, + { + "icon_id": "24828031", + "name": "新增", + "font_class": "Add1", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "25479931", + "name": "全屏", + "font_class": "FullScreen", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "25479961", + "name": "收起", + "font_class": "PutAway", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "23153832", + "name": "设置", + "font_class": "Install", + "unicode": "e73c", + "unicode_decimal": 59196 + }, + { + "icon_id": "23172553", + "name": "选择", + "font_class": "Determine", + "unicode": "e73d", + "unicode_decimal": 59197 + }, + { + "icon_id": "23267149", + "name": "提示", + "font_class": "InfoCircle", + "unicode": "e73e", + "unicode_decimal": 59198 + }, + { + "icon_id": "29727110", + "name": "预览", + "font_class": "Preview", + "unicode": "e7ef", + "unicode_decimal": 59375 + }, + { + "icon_id": "22864434", + "name": "添加", + "font_class": "AddTo", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "22864435", + "name": "减去", + "font_class": "Subtract", + "unicode": "e73a", + "unicode_decimal": 59194 + }, + { + "icon_id": "23153721", + "name": "关闭", + "font_class": "Close", + "unicode": "e73b", + "unicode_decimal": 59195 + }, + { + "icon_id": "34712339", + "name": "map-zidongshuiwenjiance", + "font_class": "map-zidongshuiwenjiance", + "unicode": "e737", + "unicode_decimal": 59191 + }, + { + "icon_id": "34712342", + "name": "map-rengongshuiwenjiance", + "font_class": "map-rengongshuiwenjiance", + "unicode": "e738", + "unicode_decimal": 59192 + }, + { + "icon_id": "34061651", + "name": "info", + "font_class": "info", + "unicode": "e736", + "unicode_decimal": 59190 + }, + { + "icon_id": "34052606", + "name": "map-qixidiyulei", + "font_class": "map-qixidiyulei", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "34045497", + "name": "map-yuleifenbu", + "font_class": "map-yuleifenbu", + "unicode": "e730", + "unicode_decimal": 59184 + }, + { + "icon_id": "34044709", + "name": "map-rgszzDabiao", + "font_class": "map-rgszzDabiao1", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "34044710", + "name": "map-rgszzBudabiao", + "font_class": "map-rgszzBudabiao1", + "unicode": "e734", + "unicode_decimal": 59188 + }, + { + "icon_id": "34043739", + "name": "map-zxsdzGaojing", + "font_class": "map-zxsdzGaojing", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "34043801", + "name": "map-dxsdzGaojing", + "font_class": "map-dxsdzGaojing", + "unicode": "e732", + "unicode_decimal": 59186 + }, + { + "icon_id": "33971263", + "name": "map-qixidi", + "font_class": "map-qixidituli", + "unicode": "e72f", + "unicode_decimal": 59183 + }, + { + "icon_id": "33970990", + "name": "qixidi", + "font_class": "qixidi", + "unicode": "e72e", + "unicode_decimal": 59182 + }, + { + "icon_id": "33737784", + "name": "play", + "font_class": "play", + "unicode": "e72d", + "unicode_decimal": 59181 + }, + { + "icon_id": "33737681", + "name": "moreVideo", + "font_class": "moreVideo", + "unicode": "e72c", + "unicode_decimal": 59180 + }, + { + "icon_id": "33733172", + "name": "map-zxsdzDabiaolv-6", + "font_class": "map-zxsdzDabiaolv-6", + "unicode": "e72a", + "unicode_decimal": 59178 + }, + { + "icon_id": "33733173", + "name": "map-dxsdzDabiaolv-6", + "font_class": "map-dxsdzDabiaolv-6", + "unicode": "e72b", + "unicode_decimal": 59179 + }, + { + "icon_id": "33689638", + "name": "map-rgszzBudabiao", + "font_class": "map-rgszzBudabiao", + "unicode": "e728", + "unicode_decimal": 59176 + }, + { + "icon_id": "33689639", + "name": "map-rgszzDabiao", + "font_class": "map-rgszzDabiao", + "unicode": "e729", + "unicode_decimal": 59177 + }, + { + "icon_id": "33662609", + "name": "map-shipinjiankongzhan", + "font_class": "map-shipinjiankongzhan", + "unicode": "e727", + "unicode_decimal": 59175 + }, + { + "icon_id": "33483749", + "name": "ranging", + "font_class": "ranging", + "unicode": "e724", + "unicode_decimal": 59172 + }, + { + "icon_id": "33483750", + "name": "measure", + "font_class": "measure", + "unicode": "e725", + "unicode_decimal": 59173 + }, + { + "icon_id": "33483751", + "name": "measuringTool ", + "font_class": "measuringTool", + "unicode": "e726", + "unicode_decimal": 59174 + }, + { + "icon_id": "33469102", + "name": "poumianfenxi", + "font_class": "poumianfenxi", + "unicode": "e722", + "unicode_decimal": 59170 + }, + { + "icon_id": "33469103", + "name": "clear", + "font_class": "clear", + "unicode": "e723", + "unicode_decimal": 59171 + }, + { + "icon_id": "33468615", + "name": "analysisTool", + "font_class": "analysisTool", + "unicode": "e71d", + "unicode_decimal": 59165 + }, + { + "icon_id": "33468616", + "name": "module", + "font_class": "module", + "unicode": "e71e", + "unicode_decimal": 59166 + }, + { + "icon_id": "33468617", + "name": "roaming", + "font_class": "roaming", + "unicode": "e71f", + "unicode_decimal": 59167 + }, + { + "icon_id": "33468618", + "name": "defaultView", + "font_class": "defaultView", + "unicode": "e720", + "unicode_decimal": 59168 + }, + { + "icon_id": "33468619", + "name": "global", + "font_class": "global", + "unicode": "e721", + "unicode_decimal": 59169 + }, + { + "icon_id": "33464279", + "name": "obliquePhotography", + "font_class": "obliquePhotography", + "unicode": "e71c", + "unicode_decimal": 59164 + }, + { + "icon_id": "33389167", + "name": "people", + "font_class": "people", + "unicode": "e71a", + "unicode_decimal": 59162 + }, + { + "icon_id": "33389168", + "name": "sum", + "font_class": "sum", + "unicode": "e71b", + "unicode_decimal": 59163 + }, + { + "icon_id": "33364904", + "name": "flowChart", + "font_class": "flowChart", + "unicode": "e719", + "unicode_decimal": 59161 + }, + { + "icon_id": "33276049", + "name": "heduan-0", + "font_class": "heduan-0", + "unicode": "e716", + "unicode_decimal": 59158 + }, + { + "icon_id": "33275582", + "name": "map-zxsdzGuihua-light", + "font_class": "map-zxsdzGuihua-light", + "unicode": "e712", + "unicode_decimal": 59154 + }, + { + "icon_id": "33275583", + "name": "map-zxsdzZaijian-light", + "font_class": "map-zxsdzZaijian-light", + "unicode": "e713", + "unicode_decimal": 59155 + }, + { + "icon_id": "33275584", + "name": "map-zxsdzYijian-light", + "font_class": "map-zxsdzYijian-light", + "unicode": "e714", + "unicode_decimal": 59156 + }, + { + "icon_id": "33275585", + "name": "map-dxsdzZaijian-light", + "font_class": "map-dxsdzZaijian-light", + "unicode": "e715", + "unicode_decimal": 59157 + }, + { + "icon_id": "33275587", + "name": "map-dxsdzYijian-light", + "font_class": "map-dxsdzYijian-light", + "unicode": "e717", + "unicode_decimal": 59159 + }, + { + "icon_id": "33275588", + "name": "map-dxsdzGuihua-light", + "font_class": "map-dxsdzGuihua-light", + "unicode": "e718", + "unicode_decimal": 59160 + }, + { + "icon_id": "33059038", + "name": "check", + "font_class": "check", + "unicode": "e711", + "unicode_decimal": 59153 + }, + { + "icon_id": "33037939", + "name": "2D", + "font_class": "a-2D", + "unicode": "e710", + "unicode_decimal": 59152 + }, + { + "icon_id": "33029913", + "name": "reset", + "font_class": "reset", + "unicode": "e70a", + "unicode_decimal": 59146 + }, + { + "icon_id": "33029914", + "name": "fullScreen2", + "font_class": "fullScreen2", + "unicode": "e70b", + "unicode_decimal": 59147 + }, + { + "icon_id": "33029915", + "name": "dataTable", + "font_class": "dataTable", + "unicode": "e70c", + "unicode_decimal": 59148 + }, + { + "icon_id": "33029916", + "name": "chartTable", + "font_class": "chartTable", + "unicode": "e70d", + "unicode_decimal": 59149 + }, + { + "icon_id": "33029917", + "name": "lineChart", + "font_class": "lineChart", + "unicode": "e70e", + "unicode_decimal": 59150 + }, + { + "icon_id": "33029918", + "name": "fullScreenExit2", + "font_class": "fullScreenExit2", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "33011374", + "name": "map-ssLushengshengtai", + "font_class": "map-ssLushengshengtai", + "unicode": "e708", + "unicode_decimal": 59144 + }, + { + "icon_id": "33011375", + "name": "map-ssShuishengshengtai", + "font_class": "map-ssShuishengshengtai", + "unicode": "e709", + "unicode_decimal": 59145 + }, + { + "icon_id": "33010630", + "name": "shuizhi-3", + "font_class": "shuizhi-3", + "unicode": "e703", + "unicode_decimal": 59139 + }, + { + "icon_id": "33010631", + "name": "shuizhi-5", + "font_class": "shuizhi-5", + "unicode": "e704", + "unicode_decimal": 59140 + }, + { + "icon_id": "33010632", + "name": "shuizhi-4", + "font_class": "shuizhi-4", + "unicode": "e705", + "unicode_decimal": 59141 + }, + { + "icon_id": "33010633", + "name": "shuizhi-2", + "font_class": "shuizhi-2", + "unicode": "e706", + "unicode_decimal": 59142 + }, + { + "icon_id": "33010634", + "name": "shuizhi-1", + "font_class": "shuizhi-1", + "unicode": "e707", + "unicode_decimal": 59143 + }, + { + "icon_id": "32993855", + "name": "map-zxsdzgjShuizhi", + "font_class": "map-zxsdzgjShuizhi", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "32993856", + "name": "map-zxsdzgjShigongcuoshiluoshi", + "font_class": "map-zxsdzgjShigongcuoshiluoshi", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "32993857", + "name": "map-zxsdzgjShuiwei", + "font_class": "map-zxsdzgjShuiwei", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "32993858", + "name": "map-zxsdzgjShengtailiuliang", + "font_class": "map-zxsdzgjShengtailiuliang", + "unicode": "e702", + "unicode_decimal": 59138 + }, + { + "icon_id": "32993541", + "name": "map-gyssQita", + "font_class": "map-gyssQita", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "32993219", + "name": "map-qixidituli", + "font_class": "map-qixidituli_v1", + "unicode": "e6f4", + "unicode_decimal": 59124 + }, + { + "icon_id": "32993220", + "name": "map-gyssShengyuji", + "font_class": "map-gyssShengyuji", + "unicode": "e6f5", + "unicode_decimal": 59125 + }, + { + "icon_id": "32993221", + "name": "map-dwsjhQita", + "font_class": "map-dwsjhQita1", + "unicode": "e6f9", + "unicode_decimal": 59129 + }, + { + "icon_id": "32993222", + "name": "map-gyssJiyunyuxitong", + "font_class": "map-gyssJiyunyuxitong", + "unicode": "e6fb", + "unicode_decimal": 59131 + }, + { + "icon_id": "32993223", + "name": "map-gyssYudao", + "font_class": "map-gyssYudao", + "unicode": "e700", + "unicode_decimal": 59136 + }, + { + "icon_id": "32993224", + "name": "map-gyssFangzirantongdao", + "font_class": "map-gyssFangzirantongdao", + "unicode": "e701", + "unicode_decimal": 59137 + }, + { + "icon_id": "32992915", + "name": "map-gjDongwujiuzhuzhan", + "font_class": "map-gjDongwujiuzhuzhan", + "unicode": "e6f0", + "unicode_decimal": 59120 + }, + { + "icon_id": "32992916", + "name": "map-gjGengongchanluanchang", + "font_class": "map-gjGengongchanluanchang", + "unicode": "e6f1", + "unicode_decimal": 59121 + }, + { + "icon_id": "32992917", + "name": "map-gjQixidi", + "font_class": "map-gjQixidi_v1", + "unicode": "e6f2", + "unicode_decimal": 59122 + }, + { + "icon_id": "32992918", + "name": "map-gjYuleizengzhizhan", + "font_class": "map-gjYuleizengzhizhan", + "unicode": "e6f3", + "unicode_decimal": 59123 + }, + { + "icon_id": "32992921", + "name": "map-gjZhenxizhiwuyuan", + "font_class": "map-gjZhenxizhiwuyuan", + "unicode": "e6f6", + "unicode_decimal": 59126 + }, + { + "icon_id": "32992922", + "name": "map-gjDiwenshuijianhuan", + "font_class": "map-gjDiwenshuijianhuan", + "unicode": "e6f7", + "unicode_decimal": 59127 + }, + { + "icon_id": "32992923", + "name": "map-gjGuoyusheshi", + "font_class": "map-gjGuoyusheshi", + "unicode": "e6f8", + "unicode_decimal": 59128 + }, + { + "icon_id": "32992925", + "name": "map-dxsdzgjShuiwei", + "font_class": "map-dxsdzgjShuiwei", + "unicode": "e6fa", + "unicode_decimal": 59130 + }, + { + "icon_id": "32992927", + "name": "map-dxsdzgjShuizhi", + "font_class": "map-dxsdzgjShuizhi", + "unicode": "e6fc", + "unicode_decimal": 59132 + }, + { + "icon_id": "32992928", + "name": "map-gjShengtailiuliang", + "font_class": "map-gjShengtailiuliang", + "unicode": "e6fd", + "unicode_decimal": 59133 + }, + { + "icon_id": "32992929", + "name": "map-dxsdzgjShigongcuoshiluoshi", + "font_class": "map-dxsdzgjShigongcuoshiluoshi", + "unicode": "e6fe", + "unicode_decimal": 59134 + }, + { + "icon_id": "32992930", + "name": "map-dxsdzgjShengtailiuliang", + "font_class": "map-dxsdzgjShengtailiuliang", + "unicode": "e6ff", + "unicode_decimal": 59135 + }, + { + "icon_id": "32916489", + "name": "swap", + "font_class": "swap", + "unicode": "e6ef", + "unicode_decimal": 59119 + }, + { + "icon_id": "32890642", + "name": "yaoganyingxiang", + "font_class": "yaoganyingxiang", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "32796809", + "name": "liuliangjiancezhan", + "font_class": "liuliangjiancezhan", + "unicode": "e6ec", + "unicode_decimal": 59116 + }, + { + "icon_id": "32796692", + "name": "gaojing", + "font_class": "gaojing", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "32796693", + "name": "shipinjiankongshebei", + "font_class": "shipinjiankongshebei", + "unicode": "e6ea", + "unicode_decimal": 59114 + }, + { + "icon_id": "32796694", + "name": "xunjian", + "font_class": "xunjian", + "unicode": "e6eb", + "unicode_decimal": 59115 + }, + { + "icon_id": "32796696", + "name": "shuizhijiancezhan", + "font_class": "shuizhijiancezhan", + "unicode": "e6ed", + "unicode_decimal": 59117 + }, + { + "icon_id": "32785215", + "name": "batch", + "font_class": "batch", + "unicode": "e6e8", + "unicode_decimal": 59112 + }, + { + "icon_id": "32777599", + "name": "contrast ", + "font_class": "contrast", + "unicode": "e6e7", + "unicode_decimal": 59111 + }, + { + "icon_id": "32763224", + "name": "chengliu", + "font_class": "chengliu", + "unicode": "e6e6", + "unicode_decimal": 59110 + }, + { + "icon_id": "32677923", + "name": "dwsjhGeshuimuqiang", + "font_class": "dwsjhGeshuimuqiang", + "unicode": "e6e2", + "unicode_decimal": 59106 + }, + { + "icon_id": "32677924", + "name": "dwsjhDieliangmen", + "font_class": "dwsjhDieliangmen", + "unicode": "e6e3", + "unicode_decimal": 59107 + }, + { + "icon_id": "32677925", + "name": "dwsjhQita", + "font_class": "dwsjhQita", + "unicode": "e6e4", + "unicode_decimal": 59108 + }, + { + "icon_id": "32677926", + "name": "dwsjhQianzhidangqiang", + "font_class": "dwsjhQianzhidangqiang", + "unicode": "e6e5", + "unicode_decimal": 59109 + }, + { + "icon_id": "32660226", + "name": "captchaOutlined", + "font_class": "captchaOutlined", + "unicode": "e6df", + "unicode_decimal": 59103 + }, + { + "icon_id": "32660227", + "name": "passwordOutlined", + "font_class": "passwordOutlined", + "unicode": "e6e0", + "unicode_decimal": 59104 + }, + { + "icon_id": "32660228", + "name": "userOutlined", + "font_class": "userOutlined", + "unicode": "e6e1", + "unicode_decimal": 59105 + }, + { + "icon_id": "32586837", + "name": "dongwujiuzhuzhan", + "font_class": "dongwujiuzhuzhan", + "unicode": "e6d9", + "unicode_decimal": 59097 + }, + { + "icon_id": "32586838", + "name": "qixidi", + "font_class": "qixidi_v1", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "32586839", + "name": "zhenxizhiwuyuan", + "font_class": "zhenxizhiwuyuan", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "32586840", + "name": "diwenshuijianhuan", + "font_class": "diwenshuijianhuan", + "unicode": "e6dc", + "unicode_decimal": 59100 + }, + { + "icon_id": "32586841", + "name": "yuleizengzhizhan", + "font_class": "yuleizengzhizhan", + "unicode": "e6dd", + "unicode_decimal": 59101 + }, + { + "icon_id": "32586842", + "name": "guoyusheshi", + "font_class": "guoyusheshi", + "unicode": "e6de", + "unicode_decimal": 59102 + }, + { + "icon_id": "32573657", + "name": "map-dwsjhQianzhidangqiang", + "font_class": "map-dwsjhQianzhidangqiang", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "32573662", + "name": "map-dwsjhDieliangmenshi", + "font_class": "map-dwsjhDieliangmenshi", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "32573663", + "name": "map-dwsjhGeshuimuqiang", + "font_class": "map-dwsjhGeshuimuqiang", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "32573673", + "name": "map-stllxfssFangliuguan", + "font_class": "map-stllxfssFangliuguan", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "32573674", + "name": "map-stllxfssFangliukong", + "font_class": "map-stllxfssFangliukong", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "32573675", + "name": "map-stllxfssJihefadian", + "font_class": "map-stllxfssJihefadian", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "32573676", + "name": "map-stllxfssXiehongzha", + "font_class": "map-stllxfssXiehongzha", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "32573677", + "name": "map-stllxfssFangliudong", + "font_class": "map-stllxfssFangliudong", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "32573678", + "name": "map-stllxfssShengtaijizu", + "font_class": "map-stllxfssShengtaijizu", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "32573679", + "name": "map-zxsdzDabiaolv-5", + "font_class": "map-zxsdzDabiaolv-5", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "32573680", + "name": "map-zxsdzDabiaolv-4", + "font_class": "map-zxsdzDabiaolv-4", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "32573681", + "name": "map-zxsdzDabiaolv-2", + "font_class": "map-zxsdzDabiaolv-2", + "unicode": "e6d1", + "unicode_decimal": 59089 + }, + { + "icon_id": "32573682", + "name": "map-dxsdzDabiaolv-5", + "font_class": "map-dxsdzDabiaolv-5", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "32573683", + "name": "map-dxsdzDabiaolv-4", + "font_class": "map-dxsdzDabiaolv-4", + "unicode": "e6d3", + "unicode_decimal": 59091 + }, + { + "icon_id": "32573684", + "name": "map-zxsdzDabiaolv-1", + "font_class": "map-zxsdzDabiaolv-1", + "unicode": "e6d4", + "unicode_decimal": 59092 + }, + { + "icon_id": "32573685", + "name": "map-dxsdzDabiaolv-2", + "font_class": "map-dxsdzDabiaolv-2", + "unicode": "e6d5", + "unicode_decimal": 59093 + }, + { + "icon_id": "32573686", + "name": "map-dxsdzDabiaolv-3", + "font_class": "map-dxsdzDabiaolv-3", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "32573687", + "name": "map-dxsdzDabiaolv-1", + "font_class": "map-dxsdzDabiaolv-1", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "32573688", + "name": "map-zxsdzDabiaolv-3", + "font_class": "map-zxsdzDabiaolv-3", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "32520794", + "name": "bg-toggle", + "font_class": "bg-toggle", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "32519681", + "name": "map-diwenshuijianhuan", + "font_class": "map-diwenshuijianhuan", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "32519682", + "name": "map-qixidi", + "font_class": "map-qixidi", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "32519683", + "name": "map-yuleizengzhizhan", + "font_class": "map-yuleizengzhizhan", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "32519684", + "name": "map-rengongchanluanchang", + "font_class": "map-rengongchanluanchang", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "32519685", + "name": "map-zhenxizhiwuyuan", + "font_class": "map-zhenxizhiwuyuan", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "32519686", + "name": "map-shengtailiuliang", + "font_class": "map-shengtailiuliang", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "32519687", + "name": "map-dongwujiuzhuzhan", + "font_class": "map-dongwujiuzhuzhan", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "32519688", + "name": "map-guoyusheshi", + "font_class": "map-guoyusheshi", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "32501778", + "name": "map-xzXian", + "font_class": "map-xzXian", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "32501779", + "name": "map-shengjie", + "font_class": "map-shengjie", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "32501780", + "name": "map-xzSheng", + "font_class": "map-xzSheng", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "32501781", + "name": "map-xzShi", + "font_class": "map-xzShi", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "32494009", + "name": "hydroPower", + "font_class": "hydroPower", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "32492893", + "name": "heduan-4", + "font_class": "heduan-4", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "32492895", + "name": "heduan-1", + "font_class": "heduan-1", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "32492896", + "name": "heduan-5", + "font_class": "heduan-5", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "32492897", + "name": "heduan-3", + "font_class": "heduan-3", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "32492898", + "name": "heduan-2", + "font_class": "heduan-2", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "32492899", + "name": "heliu-3", + "font_class": "heliu-3", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "32492900", + "name": "heliu-1", + "font_class": "heliu-1", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "32492901", + "name": "heliu-2", + "font_class": "heliu-2", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "32492902", + "name": "hupo", + "font_class": "hupo", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "32492903", + "name": "shuidianjidi", + "font_class": "shuidianjidi", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "32492904", + "name": "map-gjszzDabiao", + "font_class": "map-gjszzDabiao", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "32492905", + "name": "map-gjszzBudabiao", + "font_class": "map-gjszzBudabiao", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "32492906", + "name": "map-zjszzDabiao", + "font_class": "map-zjszzDabiao", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "32492907", + "name": "map-dxsdzGuihua", + "font_class": "map-dxsdzGuihua", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "32492908", + "name": "map-zxsdzZaijian", + "font_class": "map-zxsdzZaijian", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "32492909", + "name": "map-zxsdzGuihua", + "font_class": "map-zxsdzGuihua", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "32492910", + "name": "map-zxsdzYijian", + "font_class": "map-zxsdzYijian", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "32492911", + "name": "map-dzTushi", + "font_class": "map-dzTushi", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "32492912", + "name": "map-dabiaolv-3", + "font_class": "map-dabiaolv-3", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "32492913", + "name": "map-zjszzBudabiao", + "font_class": "map-zjszzBudabiao", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "32492914", + "name": "map-dabiaolv-5", + "font_class": "map-dabiaolv-5", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "32492915", + "name": "map-dabiaolv-2", + "font_class": "map-dabiaolv-2", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "32492916", + "name": "map-dxsdzZaijian", + "font_class": "map-dxsdzZaijian", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "32492918", + "name": "map-dxsdzYijian", + "font_class": "map-dxsdzYijian", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "32492919", + "name": "map-dabiaolv-4", + "font_class": "map-dabiaolv-4", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "32492920", + "name": "map-dabiaolv-1", + "font_class": "map-dabiaolv-1", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "32491888", + "name": "topOutline", + "font_class": "topOutline", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "32491889", + "name": "topFill", + "font_class": "topFill", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "32491890", + "name": "locationSymbol ", + "font_class": "locationSymbol", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "32491492", + "name": "right", + "font_class": "right", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "32491493", + "name": "left", + "font_class": "left", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "32491533", + "name": "search", + "font_class": "search", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "32491440", + "name": "fold", + "font_class": "fold", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "32491441", + "name": "unFold", + "font_class": "unFold", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "32490984", + "name": "tiji", + "font_class": "tiji", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "32490985", + "name": "layer", + "font_class": "layer", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "32490986", + "name": "zoomIn", + "font_class": "zoomIn", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "32490987", + "name": "3D", + "font_class": "a-3D", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "32490988", + "name": "downLoad", + "font_class": "downLoad", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "32490989", + "name": "zoomOut", + "font_class": "zoomOut", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "32490990", + "name": "exitFullScreen", + "font_class": "exitFullScreen", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "32490991", + "name": "topic", + "font_class": "topic", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "32491004", + "name": "fullScreen", + "font_class": "fullScreen", + "unicode": "e691", + "unicode_decimal": 59025 + } + ] +} \ No newline at end of file diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.ttf b/frontend-sjgl/src/styles/iconfont/iconfont.ttf new file mode 100644 index 00000000..78244c76 Binary files /dev/null and b/frontend-sjgl/src/styles/iconfont/iconfont.ttf differ diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.woff b/frontend-sjgl/src/styles/iconfont/iconfont.woff new file mode 100644 index 00000000..eb02fefd Binary files /dev/null and b/frontend-sjgl/src/styles/iconfont/iconfont.woff differ diff --git a/frontend-sjgl/src/styles/iconfont/iconfont.woff2 b/frontend-sjgl/src/styles/iconfont/iconfont.woff2 new file mode 100644 index 00000000..46b0f293 Binary files /dev/null and b/frontend-sjgl/src/styles/iconfont/iconfont.woff2 differ diff --git a/frontend-sjgl/src/styles/index.scss b/frontend-sjgl/src/styles/index.scss new file mode 100644 index 00000000..d09926ac --- /dev/null +++ b/frontend-sjgl/src/styles/index.scss @@ -0,0 +1,125 @@ +@use 'src/styles/element-plus' as element-plus; +@use 'src/styles/ant-design-vue' as permission; +@use './sidebar' as sidebar; +@use './tailwind' as tailwind; +@use './popup-styles' as popup; +@import './iconfont/iconfont.css'; + +html, +body, +#app { + height: 100%; + font-family: auto; +} +body { + margin: 0; + color: rgba(0, 0, 0, 0.85); + font-size: 14px; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, + Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, + Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + font-variant: tabular-nums; + line-height: 1.5715; + background-color: #fff; + font-feature-settings: 'tnum'; +} +/* Webkit 浏览器 (Chrome, Safari, Edge) */ +body::-webkit-scrollbar { + display: none; + width: 0; + height: 0; +} +::-webkit-scrollbar { + width: 8px; + height: 8px; +} +::-webkit-scrollbar-corner { + background-color: transparent; +} +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: #bbb; + -webkit-box-shadow: inset 0 0 6px #ddd; +} +::-webkit-scrollbar-track { + border-radius: 10px; + width: 10px; +} +// main-container global css +.app-container { + padding: 20px; +} + +.search { + padding: 18px 0 0 10px; + margin-bottom: 10px; + border-radius: 5px; + border: 1px solid #ddd; + box-shadow: 6px 2px 6px #ccc; +} + +svg { + display: inline-block; +} +.el-dialog { + display: flex !important; + flex-direction: column !important; + margin: auto !important; + position: absolute !important; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: max-content; +} +.el-dialog__body { + padding: 20px !important; +} +.modelContentDrak { + position: absolute; + width: 100%; + height: 100%; + background-color: #ffffff; +} + +.moduleContent { + display: flex; + flex-direction: row; + justify-content: space-between; + height: 100%; + position: relative; +} + +.leftContent { + width: 188px; +} +.rightContent { + height: 98%; + position: relative; +} +.table-container { + flex: 1; + /* 占据剩余所有空间 */ + overflow: hidden; + /* 关键:防止表格溢出容器 */ + position: relative; +} + +.ant-tooltip-inner { + max-height: 300px; + overflow: auto; +} +// 暂无数据文字颜色 + +.ant-empty-description { + color: rgba(0, 0, 0, 0.85); +} + +.ant-select-tree-node-selected { + background-color: #bae7ff !important; +} +.ant-empty{ + p{ + text-indent: 0em !important; + } +} diff --git a/frontend-sjgl/src/styles/mixin.scss b/frontend-sjgl/src/styles/mixin.scss new file mode 100644 index 00000000..3ca71684 --- /dev/null +++ b/frontend-sjgl/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ''; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/frontend-sjgl/src/styles/popup-styles.scss b/frontend-sjgl/src/styles/popup-styles.scss new file mode 100644 index 00000000..9d17816f --- /dev/null +++ b/frontend-sjgl/src/styles/popup-styles.scss @@ -0,0 +1,422 @@ +// Popup 相关样式 - 用于 map.ol.ts 中 generatePopupHtml 生成的 HTML + +.iconDiv { + background: rgba(0, 0, 0, 0.6); + color: #fff; + border-radius: 4px; + padding: 5px; + font-size: 12px; + &.smallfont { + font-size: 10px; + } +} + +.iconDivContent { + display: flex; + justify-content: space-between; +} + +.iconDivTitle { + width: 100%; + text-align: center; + font-weight: normal; +} + +.iconDivLeft { + width: 50%; + box-sizing: border-box; +} + +.iconDivRight { + width: 50%; + box-sizing: border-box; +} + +// 标题文字自适应大小 +.iconDivTitle.title-md { + font-size: 14px !important; +} +.iconDivTitle.title-sm { + font-size: 13px !important; +} +.iconDivTitle.title-xs { + font-size: 12px !important; +} +.iconDivTitle.title-xxs { + font-size: 12px !important; +} + +.iconEngDiv_large_eng_built, +.iconEngDiv_large_eng_ubuilt, +.iconEngDiv_large_eng_nbuilt { + width: 156px; + height: 170px; + background-repeat: no-repeat; + background-size: 100%; + display: flex; + flex-wrap: wrap; + margin-bottom: 0 !important; + .iconDivTitle { + width: 100%; + height: 48%; + line-height: 100px; + text-align: center; + align-items: center; + font-size: 16px; + text-align: center; + font-weight: normal; + position: relative; + &::after { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 2px; + width: 80%; + left: 50%; + transform: translateX(-50%); + content: ' '; + } + } + .iconDivContent { + width: 100%; + height: 52%; + font-size: 12px; + padding-top: 4px; + position: relative; + &::after { + position: absolute; + top: 0; + left: 50%; + right: 0; + width: 2px; + height: 62%; + transform: translateX(-50%); + content: ' '; + } + .iconDivLeft { + width: 50%; + padding-left: 38px; + box-sizing: border-box; + } + .iconDivRight { + width: 50%; + padding-left: 6px; + box-sizing: border-box; + padding-right: 34px; + div:nth-child(1) { + text-align: right; + } + } + } +} + +.iconEngDiv_mid_eng_built, +.iconEngDiv_mid_eng_ubuilt, +.iconEngDiv_mid_eng_nbuilt { + width: 150px; + height: 112px; + background-repeat: no-repeat; + background-size: 100%; + display: flex; + flex-direction: column; + margin-bottom: 0 !important; + .iconDivTitle { + width: 100%; + height: 50px; + line-height: 52px; + text-align: center; + align-items: center; + font-size: 16px; + text-align: center; + font-weight: normal; + } + .iconDivContent { + width: 100%; + height: 36; + padding: 0 10px; + font-size: 11px; + position: relative; + &::after { + position: absolute; + top: 0; + left: 50%; + right: 0; + width: 2px; + height: 100%; + content: ' '; + } + .iconDivLeft { + width: 50%; + text-align: center; + } + .iconDivRight { + width: 50%; + text-align: center; + } + } +} + +.iconEngDiv-large_eng_nbuilt-0 { + background-image: url('@/assets/images/mapTip/map-dxsdzGuihuaNetMonitor.svg'); + color: #859ea3; + .iconDivTitle, + .iconDivContent { + &::after { + background-color: #859ea3; + } + } +} + +.iconEngDiv-large_eng_ubuilt-1 { + background-image: url('@/assets/images/mapTip/map-dxsdzZaijianNetMonitor.svg'); + color: #5389b9; + .iconDivTitle, + .iconDivContent { + &::after { + background-color: #5389b9; + } + } +} + +.iconEngDiv-large_eng_built-2 { + background-image: url('@/assets/images/mapTip/map-dxsdzYijianNetMonitor.svg'); + color: #7dbc18; + .iconDivTitle, + .iconDivContent { + &::after { + background-color: #95c842; + } + } +} + +.iconEngDiv-mid_eng_nbuilt-0 { + background-image: url('@/assets/images/mapTip/map-zxsdzGuihuaNetMonitor.svg'); + color: #859ea3; + .iconDivContent { + &::after { + background-color: #859ea3; + } + } +} + +.iconEngDiv-mid_eng_ubuilt-1 { + background-image: url('@/assets/images/mapTip/map-zxsdzZaijianNetMonitor.svg'); + color: #5389b9; + .iconDivContent { + &::after { + background-color: #5389b9; + } + } +} + +.iconEngDiv-mid_eng_built-2 { + background-image: url('@/assets/images/mapTip/map-zxsdzYijianNetMonitor.svg'); + color: #7dbc18; + .iconDivContent { + &::after { + background-color: #95c842; + } + } +} +.map-tooltip { + height: auto; + color: rgba(255, 255, 255, 0.85); + text-align: center; + position: relative; + padding: 24px 0 25px; + // width: 279px; + width: 260px; + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 24px; + background: url(@/assets/images/mapTip/top@260.png) center no-repeat; + background-size: 100% auto; + } + + &::before { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 25px; + background: url(@/assets/images/mapTip/bottom@260.png) center no-repeat; + background-size: 100% auto; + } + + &-box { + padding: 0 12px; + &::before { + content: ''; + position: absolute; + top: 24px; + bottom: 25px; + left: 0; + right: 0; + z-index: -1; + background: url(@/assets/images/mapTip/center@260.png) repeat-y; + background-size: 100% auto; + } + } + + &-title { + font-size: 16px; + font-weight: 500; + color: #fff; + margin-top: 4px; + } + + &-list { + font-size: 14px !important; + line-height: 1.5; + + > li { + display: flex; + text-align: left; + + .__label { + flex: 0 0 100px; + width: 100px; + text-align: right; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .__warn { + color: #ff4d4f; + } + } + } + + &-content { + margin-top: 10px; + border-top: 1px dashed #12aaeb; + padding: 10px 0; + margin: 10px 0 0; + &.__noborder { + border: none; + margin-top: 6px; + } + &.__small { + font-size: 12px !important; + } + } + + &-sub { + margin: 0; + padding: 4px 0 0 0; + text-align: center; + color: #fff; + font-size: 12px; + } + &-sub1 { + text-align: center; + position: relative; + height: 1px; + border-bottom: 1px dashed #12aaeb; + margin-top: 16px; + .__content { + position: absolute; + top: -9px; + left: 50%; + transform: translateX(-50%); + background-color: rgb(88 110 134); + padding: 0 6px; + font-size: 12px; + border-radius: 3px; + white-space: nowrap; + } + } + &.map-tooltip-small { + width: 190px; + padding: 18px 0 18px; + &::after { + background-image: url(@/assets/images/mapTip/top@175.png); + height: 18px; + } + &::before { + background-image: url(@/assets/images/mapTip/bottom@175.png); + height: 18px; + } + .map-tooltip-box { + padding: 0 10px; + &::before { + content: ''; + position: absolute; + top: 18px; + bottom: 18px; + left: 0; + right: 0; + z-index: -1; + background-image: url(@/assets/images/mapTip/center@175.png); + } + } + .map-tooltip-list { + > li { + .__label { + flex: 0 0 84px; + width: 84px; + } + } + } + } + + &.map-tooltip-middle { + width: 225px; + padding: 18px 0 18px; + &::after { + background-image: url(@/assets/images/mapTip/top@215.png); + height: 18px; + } + &::before { + background-image: url(@/assets/images/mapTip/bottom@215.png); + height: 18px; + } + .map-tooltip-box { + padding: 0 10px; + &::before { + content: ''; + position: absolute; + top: 18px; + bottom: 18px; + left: 0; + right: 0; + z-index: -1; + background-image: url(@/assets/images/mapTip/center@215.png); + } + } + .map-tooltip-list { + > li { + .__label { + flex: 0 0 100px; + width: 100px; + } + } + &.__list2 { + > li { + .__label { + flex: 0 0 90px; + width: 90px; + } + } + } + } + } + + .map-waterQuality-subtitle { + margin-top: 10px; + border: 1px solid rgba(77, 129, 167); + border-bottom: none; + + .map-waterQuality-leftType, + .map-waterQuality-rightType { + width: 50%; + } + } +} diff --git a/frontend-sjgl/src/styles/sidebar.scss b/frontend-sjgl/src/styles/sidebar.scss new file mode 100644 index 00000000..c0973f33 --- /dev/null +++ b/frontend-sjgl/src/styles/sidebar.scss @@ -0,0 +1,17 @@ +svg { + vertical-align: text-bottom !important; +} +#app { + .main-container { + // min-height: 100%; + transition: margin-left 0.28s; + position: relative; + } + +} + +body[layout='mix'] { + .svg-icon { + margin-right: 16px; + } +} diff --git a/frontend-sjgl/src/styles/tailwind.scss b/frontend-sjgl/src/styles/tailwind.scss new file mode 100644 index 00000000..9bb37ee6 --- /dev/null +++ b/frontend-sjgl/src/styles/tailwind.scss @@ -0,0 +1,4 @@ + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/frontend-sjgl/src/styles/variables.module.scss b/frontend-sjgl/src/styles/variables.module.scss new file mode 100644 index 00000000..c6e9bc18 --- /dev/null +++ b/frontend-sjgl/src/styles/variables.module.scss @@ -0,0 +1,20 @@ +$main-menu-color: #fff; +$main-menu-color-active: #00e6fc; +$main-menu-bg-color-active: #003e6e; + +$layout-header-height: 60px; +$locationbar-height: 50px; + +$primary-title-color: #2f6b98; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + main-menu-color: $main-menu-color; + main-menu-color-active: $main-menu-color-active; + main-menu-bg-color-active: $main-menu-bg-color-active; + + layout-header-height: $layout-header-height; + locationbar-height: $locationbar-height; + primary-title-color: $primary-title-color; +} diff --git a/frontend-sjgl/src/utils/GisUrlList.ts b/frontend-sjgl/src/utils/GisUrlList.ts new file mode 100644 index 00000000..84aec487 --- /dev/null +++ b/frontend-sjgl/src/utils/GisUrlList.ts @@ -0,0 +1,5158 @@ +import dayjs from 'dayjs'; +// const page =location.href.split('page='); +// const zaiJianParams = page?.[1]==="zaiJianDianZhanHuanBaoGongZuo"?{bldsttCcode:1}:{} +// const zaiJianParams2 = page?.[1]==="zaiJianDianZhanHuanBaoGongZuo"?{BLDSTT_CCODE:1}:{} +// import getUrl from '@zebras/qgc-share/utils/isQGCrul' +export const urlList = [ + { + url: '/wmp-eng-server/eng/point/GetKendoListCust', + title: '常规水电✅️', + params: { + anchoPointState: [{ field: 'anchoPointState', operator: 'isnotnull' }] + }, + orders: + '{"baseId":"asc","rvcdStepSort":"asc","siteStepSort":"asc","ennm":"asc"}' + }, + { + url: '/wmp-env-server/sw/getFacilityPointList/GetKendoListCust', + title: '低温水减缓设施✅️', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-eng-server/eng/eq/interval/GetKendoListCust', + title: '生态流量达标率✅️', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, + orders: + '{"baseId":"asc","rvcdStepSort":"asc","siteStepSort":"asc","ennm":"asc"}' + }, + // { + // url: '/wmp-env-server/env/wq/anchorPoint/reach/GetKendoListCust', + // title: '实际水质', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + // }, + // { + // url: '/wmp-env-server/env/wq/anchorPoint/reach/GetKendoListCust', + // title: '目标水质', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + // }, + // { + // url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + // title: '自建站✅️', + // params: { + // dtinType: '0', + // ...(window.__lyConfigs?.baseId === "07" ? { sttpCode: "WQ" } : {}), + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // }, + // orders: '{"siteStepSort":"asc"}' + // }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '国家站✅️', + params: { dtinType: '1', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '人工站✅️', + params: { dtinType: '2', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '栖息地水质站❓不知道', + params: { + fhstcd: [{ field: 'fhstcd', operator: 'isnotnull' }], + fhFlag: '1', + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + } + }, + // { url: getUrl('/wmp-env-server/env/fp/point/GetKendoListCust'), title: '过鱼设施', params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + { + url: '/wmp-eng-server/eng/eq/eqds/GetKendoListCust', + title: '生态流量泄放设施✅️', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/fb/point/GetKendoListCust', + title: '鱼类增殖站✅️', + params: { sttp: 'FB', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/GetKendoListCust', + title: '珍稀植物园✅️', + params: { sttpCode: 'VP', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/GetKendoListCust', + title: '动物救助站✅️', + params: { sttpCode: 'VA', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/fb/point/GetKendoListCust', + title: '人工产卵场✅️', + params: { sttp: 'SG', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', + title: '水温监测断面✅️', + keyType: 'wt_point', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', + title: '自建水温站❓', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], flag: '0' } + }, + { + url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', + title: '人工水温站❓', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], flag: '2' } + }, + { + url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', + title: '栖息地水温站❓', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + fhstcd: [{ field: 'fhstcd', operator: 'isnotnull' }], + fhFlag: '1' + } + }, + { + url: '/wmp-env-server/env/fhvap/GetKendoListCust', + title: '栖息地✅️', + params: { sttpCode: 'FH', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + + { + url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', + title: '水质监测站✅️', + params: { sttpCode: 'WQ', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', + title: '水温监测站✅️', + params: { + sttpCode: 'WTRV', + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + } + }, + { + url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', + title: '流量监测站✅️', + params: { sttpCode: 'ZQ', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', + title: '视频监控✅️', + params: { sttpCode: 'VD', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/vd/aiPoint/GetKendoListCust', + title: 'AI视频监控站 缺失!', + params: { sttpCode: 'AIVD' } + }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '水电站监控视频', keyType: "video_fbfm_point", params: { sttp: 'VD_FBFM', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '生态流量监测断面视频', keyType: "video_eqs_point", params: { sttp: 'VD_EQS', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '水质站运行视频', keyType: "video_wq_point", params: { sttp: 'VD_WQ', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '过鱼设施视频', keyType: "video_fp_point", params: { sttp: 'VD_FP', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '鱼类增殖站视频', keyType: "video_fb_point", params: { sttp: 'VD_FB', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '栖息地视频', keyType: "video_fh_point", params: { sttp: 'VD_FH', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '低温水减缓设施视频', keyType: "video_dw_point", params: { sttp: 'VD_DW', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '动物救助站视频', keyType: "video_va_point", params: { sttp: 'VD_VA', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '珍稀植物园视频', keyType: "video_vp_point", params: { sttp: 'VD_VP', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + + // { + // url: getUrl('/wmp-env-server/env/we/point/GetKendoListCust'), + // title: '水生生态调查断面 ❌️数量不对 真实是338', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, + // orders: '{"siteStepSort":"asc"}' + // }, + // { + // url: getUrl('/wmp-env-server/env/we/fishPoint/GetKendoListCust'), + // title: '鱼类分布 ✅️', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + // }, + { + url: '/wmp-eng-server/eng/alarmPoint/GetKendoListCust', + title: '水电站告警情况❌️ 数据不对 真实数据是663', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + // { + // url: '/wmp-env-server/fb/point/discharge/GetKendoListCust', + // title: '水电站', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + // }, + { + url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', + title: '国家水文站✅️', + params: { dtinType: 1, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', + title: '自建水文站✅️', + params: { dtinType: 0, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '增殖站水质站', + params: { + dtinType: 0, + sttpCode: 'WQFB', + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + } + }, + { + url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', + title: '视频监控站✅️', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + // { + // url: '/wmp-env-server/env/wb/point/GetKendoListCust', + // title: '气象站', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + // }, + // { + // url: '/wmp-env-server/sw/getEngTempPointList/getLastData', + // title: '水温站点', + // params: { + // logic: 'and', + // filters: [] + // } + // }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '水质站点', + params: { + logic: 'and', + filters: [ + { + field: 'lgtd', + operator: 'isnotnull', + dataType: 'string' + }, + { + field: 'orderIndex', + operator: 'isnotnull', + dataType: 'string' + } + ] + }, + orders: '{"orderIndex":"asc"}' + }, + // { + // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', + // title: '水质告警', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WQ' }] + // } + // }, + // { + // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', + // title: '水温告警', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WTRV' }] + // } + // }, + // { + // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', + // title: '水位告警', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ENG' }] + // } + // }, + // { + // url: '/wmp-env-server/env/warn/stcd/operatePoint/GetKendoListCust', + // title: '环保设施告警', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // yr: dayjs().format('YYYY') + // } + // }, + { + url: '/wmp-env-server/env/fp/point/built/GetKendoListCust', + title: '在建过鱼设施-地图锚点 ✅️', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] + } + }, + { + url: '/wmp-env-server/env/fb/point/built/GetKendoListCust', + title: '在建鱼类增殖站 缺失!', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'FB' }], + bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] + } + }, + { + url: '/wmp-env-server/env/fb/point/built/GetKendoListCust', + title: '在建人工产卵场 缺失!', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'SG' }], + bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] + } + }, + { + url: '/wmp-env-server/env/fhvap/built/GetKendoListCust', + title: '在建珍稀植物园✅️', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'VP' }], + bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] + } + }, + { + url: '/wmp-env-server/env/fhvap/built/GetKendoListCust', + title: '在建动物救助站✅️', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'VA' }], + bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] + } + }, + // { + // url: '/wmp-env-server/eng/eq/eqds/built/GetKendoListCust', + // title: '在建生态流量泄放设施', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + // BLDSTT_CCODE: [{ field: 'BLDSTT_CCODE', operator: 'eq', value: '1' }] + // } + // }, + // { + // url: '/wmp-env-server/env/we/fishList/point/GetKendoList', + // title: '鱼类沿程', + // params: { + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + // } + // }, + { + url: '/wmp-env-server/env/wva/point/GetKendoListCust', + title: '野生动物监测✅️', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WVA' }] + } + }, + // { + // url: '/wmp-env-server/env/we/fishList/point/GetNativeRareFish', + // title: '土著珍稀鱼类', + // params: { + // rare: '1', + // specOrigin: '1', + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + // } + // }, + // { url: '/wmp-env-server/te/tet/point/GetTerrestrialAnimal', title: '陆生动物分布', params: { baseId: window?.__lyConfigs?.baseId, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + { + url: '/wmp-env-server/sdFprdR/point/getFprdPointList', + title: '鱼类调查装置 对', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + } +]; + +export const lmGisUrl = [ + { + url: '/wmp-swqx-server/swqx/mm/pptnr/point/GetKendoListCust', + title: '气象站', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-swqx-server/st/point/GetKendoList', + title: '水文站', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ST' }] + } + }, + { + url: '/wmp-swqx-server/st/point/GetKendoList', + title: '水电站', + params: { + lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], + sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ENG' }] + } + } +]; +export const fbGisUrl = [ + { + url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', + title: '流量站', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fh/fdPoint/GetKendoListCust', + title: '捕鱼装置', + params: { logic: 'and', filters: [] } + }, + { + url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', + title: '水温监测断面', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + // { + // url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + // title: '自建站', + // params: { + // dtinType: '0', + // ...(window.__lyConfigs?.baseId === "07" ? { sttpCode: "WQ" } : {}), + // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] + // }, + // orders: '{"siteStepSort":"asc"}' + // }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '国家站', + params: { dtinType: '1', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', + title: '人工站', + params: { dtinType: '2', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/GetKendoListCust', + title: '栖息地', + params: { sttpCode: 'FH', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', + title: '视频监控站', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + // { url: getUrl('/wmp-env-server/env/fp/point/GetKendoListCust'), title: '过鱼设施', params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, + { + url: '/wmp-env-server/sw/getFacilityPointList/GetKendoListCust', + title: '低温水减缓设施', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/fb/point/GetKendoListCust', + title: '鱼类增殖站', + params: { sttp: 'FB', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/env/fhvap/GetKendoListCust', + title: '珍稀植物园', + params: { sttpCode: 'VP', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + }, + { + url: '/wmp-env-server/fb/point/discharge/GetKendoListCust', + title: '水电站', + params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } + } + // { + // url: getUrl('/wmp-env-server/env/we/point/GetKendoListCust'), + // title: '水生生态调查断面', + // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, + // orders: '{"siteStepSort":"asc"}' + // }, +]; + +export const soltData = [ + { + fieldName: 'MZGJDDZSL', + name: '闽浙赣基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GHDZSL', + name: '规划', + nameEn: '', + color: '#96B0B5', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SJNFDL', + name: '年发电量', + nameEn: '', + color: '', + unit: '亿kw·h', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWZCBSSJ', + name: '未正常报送数据', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ARS', + name: '砷', + nameEn: 'ARS', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00006', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SYMJ', + name: '水域面积', + nameEn: '', + color: '', + unit: 'km2', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWZCYX', + name: '未正常运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'WTMP', + name: '水温', + nameEn: '', + color: '#01B5B9', + unit: '℃', + theme: '', + decpos: '6', + mn: '0', + mx: '25', + norm: '18', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DBJDDZSL', + name: '东北基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSDDSJYQ', + name: '达到设计要求', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YJDZZJRL', + name: '已建', + nameEn: '', + color: '#78C300', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'OIL', + name: '石油类', + nameEn: 'OIL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'FCG', + name: '粪大肠菌群', + nameEn: 'FCG', + color: '', + unit: '个/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅰ', + name: 'I', + nameEn: '', + color: '#13ADE6', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DOX', + name: '溶解氧', + nameEn: 'DO', + color: '#9A60B4', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '1', + mx: '15', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HHSYJDDZSL', + name: '黄河上游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DDHJDDZSL', + name: 'ddh基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSZCYX', + name: '正常运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZN', + name: '锌', + nameEn: 'ZN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NPJJDDZSL', + name: '南盘江&红水河基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLNONE', + name: '无数据', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'LAS', + name: '阴离子表面活性剂', + nameEn: 'LAS', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅳ', + name: 'IV', + nameEn: '', + color: '#FF8800', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BXSW', + name: '坝下水位', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSBDB', + name: '不达标', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CJSYJDDZSL', + name: '长江上游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: '劣Ⅴ', + name: '劣V', + nameEn: '', + color: '#D9001B', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CKLL', + name: '出库流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TP', + name: '总磷', + nameEn: 'TP', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLXZ', + name: '生态流量限值', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'FE', + name: '铁', + nameEn: 'FE', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.03', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXQT', + name: '其它', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SJZJRL', + name: '装机容量', + nameEn: '', + color: '', + unit: 'MW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TN', + name: '总氮', + nameEn: 'TN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TU', + name: '浊度', + nameEn: 'TU', + color: '#91CC75', + unit: 'NTU', + theme: '', + decpos: '1', + mn: '0.1', + mx: '5000', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSSJWJR', + name: '数据未接入', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NJJDDZSL', + name: '怒江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'PB', + name: '铅', + nameEn: 'PB', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BOD5', + name: '五日生化需氧量', + nameEn: 'BOD?', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '2', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'S2', + name: '硫化物', + nameEn: 'S2', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.004', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'pH', + name: 'pH', + nameEn: 'pH', + color: '#73C1DF', + unit: '', + theme: '', + decpos: '1', + mn: '6', + mx: '10', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_90AND95', + name: '90%-95%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '90', + mx: '95', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SE', + name: '硒', + nameEn: 'SE', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00025', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CL', + name: '氯化物', + nameEn: 'CL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SO4', + name: '硫酸盐', + nameEn: 'SO?', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.4', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWSJ', + name: '无数据', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'WJJDDZSL', + name: '乌江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HHZYJDDZSL', + name: '黄河中游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅴ', + name: 'V', + nameEn: '', + color: '#E55555', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_XY80', + name: '<80%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '80', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSAYQYX', + name: '按要求运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLL', + name: '生态流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CN', + name: '氰化物', + nameEn: 'CN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.002', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'COND', + name: '电导率', + nameEn: 'COND', + color: '#C7C402', + unit: 'uS/cm', + theme: '', + decpos: '1', + mn: '300', + mx: '500', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSXYH', + name: '需优化', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'THRD', + name: '总硬度', + nameEn: 'THRD', + color: '', + unit: 'mmol/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWYX', + name: '未运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BSSW', + name: '坝上水位', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CU', + name: '铜', + nameEn: 'CU', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.001', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅱ', + name: 'II', + nameEn: '', + color: '#4FC64D', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWAYQYX', + name: '未按要求运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'F', + name: '氟化物', + nameEn: 'F', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YLJJDDZSL', + name: 'ylj基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CD', + name: '镉', + nameEn: 'CD', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.001', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CODCR', + name: '化学需氧量', + nameEn: 'CODcr', + color: '#02B2FF', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0', + mx: '50', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YJDZSL', + name: '已建', + nameEn: '', + color: '#78C300', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HG', + name: '汞', + nameEn: 'HG', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00005', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QTJDDZSL', + name: '其他基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NH3N', + name: '氨氮', + nameEn: '', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NO3', + name: '硝氮/硝酸盐氮', + nameEn: 'NO3', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CODMN', + name: '高锰酸盐指数', + nameEn: 'CODMN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.5', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZJDZZJRL', + name: '在建', + nameEn: '', + color: '#669ECF', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'MN', + name: '锰', + nameEn: 'MN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'JSJJDDZSL', + name: '金沙江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLWYQ', + name: '无要求', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_DY95', + name: '≥95%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '95', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'XXJDDZSL', + name: '湘西基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXDB', + name: '达标', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CLARITY', + name: '透明度', + nameEn: 'CLARITY', + color: '', + unit: 'mm', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GC', + name: '高程', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CR6', + name: '铬(六价)', + nameEn: 'CR6', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.004', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GHDZZJRL', + name: '规划', + nameEn: '', + color: '#96B0B5', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'RKLL', + name: '入库流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZJDZSL', + name: '在建', + nameEn: '', + color: '#669ECF', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_80AND90', + name: '80%-90%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '80', + mx: '90', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CYANO', + name: '蓝绿藻', + nameEn: 'CYANO', + color: '', + unit: '个/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CHLA', + name: '叶绿素a', + nameEn: 'CHLA', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXZ', + name: '运行中', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'VLPH', + name: '挥发酚', + nameEn: 'VLPH', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.002', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'AL', + name: '铝', + nameEn: 'AL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00231', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅲ', + name: 'III', + nameEn: '', + color: '#FFCC00', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'LCJGLJDDZSL', + name: '澜沧江干流基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DO', + name: '溶解氧', + nameEn: 'DO', + color: '', + unit: 'mg/L', + theme: '', + decpos: '2', + mn: '1', + mx: '15', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + } +]; + +// export const dbList = [ +// { +// "name": "PH", +// "key": "ph", +// "pkey": "", +// "fixed": 0, +// "sort": 0, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "溶解氧", +// "key": "dox", +// "pkey": "", +// "fixed": 0, +// "sort": 1, +// "group": "", +// "groupSort": "", +// "description": "mg/L", +// "children": [] +// }, +// { +// "name": "高锰酸盐指数", +// "key": "codmn", +// "pkey": "", +// "fixed": 0, +// "sort": 2, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "化学需氧量", +// "key": "codcr", +// "pkey": "", +// "fixed": 0, +// "sort": 3, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "五日生化需氧量BODS", +// "key": "bod5", +// "pkey": "", +// "fixed": 0, +// "sort": 4, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "氨氮", +// "key": "nh3n", +// "pkey": "", +// "fixed": 0, +// "sort": 5, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "总磷", +// "key": "tp", +// "pkey": "", +// "fixed": 0, +// "sort": 6, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "总氮", +// "key": "tn", +// "pkey": "", +// "fixed": 0, +// "sort": 7, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "铜", +// "key": "cu", +// "pkey": "", +// "fixed": 0, +// "sort": 8, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "锌", +// "key": "zn", +// "pkey": "", +// "fixed": 0, +// "sort": 9, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "氟化物", +// "key": "f", +// "pkey": "", +// "fixed": 0, +// "sort": 10, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "硒", +// "key": "se", +// "pkey": "", +// "fixed": 0, +// "sort": 11, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "砷", +// "key": "ars", +// "pkey": "", +// "fixed": 0, +// "sort": 12, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "汞", +// "key": "hg", +// "pkey": "", +// "fixed": 0, +// "sort": 13, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "镉", +// "key": "cd", +// "pkey": "", +// "fixed": 0, +// "sort": 14, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "铬(六价)", +// "key": "cr6", +// "pkey": "", +// "fixed": 0, +// "sort": 15, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "铅", +// "key": "pb", +// "pkey": "", +// "fixed": 0, +// "sort": 16, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "氰化物", +// "key": "cn", +// "pkey": "", +// "fixed": 0, +// "sort": 17, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "挥发酚", +// "key": "vlph", +// "pkey": "", +// "fixed": 0, +// "sort": 18, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "石油类", +// "key": "oil", +// "pkey": "", +// "fixed": 0, +// "sort": 19, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "阴离子表面活性剂", +// "key": "las", +// "pkey": "", +// "fixed": 0, +// "sort": 20, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "硫化物", +// "key": "s2", +// "pkey": "", +// "fixed": 0, +// "sort": 21, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "粪大肠菌群", +// "key": "fcg", +// "pkey": "", +// "fixed": 0, +// "sort": 22, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "氯化物", +// "key": "cl", +// "pkey": "", +// "fixed": 0, +// "sort": 23, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "硫酸盐", +// "key": "so4", +// "pkey": "", +// "fixed": 0, +// "sort": 24, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "硝酸盐氮", +// "key": "no3", +// "pkey": "", +// "fixed": 0, +// "sort": 25, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "总硬度", +// "key": "thrd", +// "pkey": "", +// "fixed": 0, +// "sort": 26, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "电导率", +// "key": "cond", +// "pkey": "", +// "fixed": 0, +// "sort": 27, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "铁", +// "key": "fe", +// "pkey": "", +// "fixed": 0, +// "sort": 28, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "锰", +// "key": "mn", +// "pkey": "", +// "fixed": 0, +// "sort": 29, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "铝", +// "key": "al", +// "pkey": "", +// "fixed": 0, +// "sort": 30, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "叶绿素a", +// "key": "chla", +// "pkey": "", +// "fixed": 0, +// "sort": 31, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "透明度", +// "key": "clarity", +// "pkey": "", +// "fixed": 0, +// "sort": 32, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// }, +// { +// "name": "浊度", +// "key": "tu", +// "pkey": "", +// "fixed": 0, +// "sort": 33, +// "group": "", +// "groupSort": "", +// "description": "", +// "children": [] +// } +// ] + +export const stcdNameList = [ + { key: '猴', value: '猴子岩' }, + { key: '枕一', value: '枕头坝一级' }, + { key: '枕二', value: '枕头坝二级' }, + { key: '铜', value: '铜街子' }, + { key: '深', value: '深溪沟' }, + { key: '沙一', value: '沙坪一级' }, + { key: '沙二', value: '沙坪二级' }, + { key: '双', value: '双江口' }, + { key: '瀑', value: '瀑布沟' }, + { key: '龚', value: '龚嘴' }, + { key: '大', value: '大岗山' }, + { key: '金', value: '金川' }, + { key: '杨', value: '杨房沟' }, + { key: '桐', value: '桐子林' }, + { key: '孟', value: '孟底沟' }, + { key: '锦一', value: '锦屏一级' }, + { key: '锦二', value: '锦屏二级' }, + { key: '官', value: '官地' }, + { key: '两', value: '两河口' }, + { key: '卡', value: '卡拉' }, + { key: '二', value: '二滩' }, + { key: '里', value: '里底' }, + { key: '托', value: '托巴' }, + { key: '苗', value: '苗尾' }, + { key: '功', value: '功果桥' }, + { key: '湾', value: '小湾' }, + { key: '乌', value: '乌弄龙' }, + { key: '漫', value: '漫湾' }, + { key: '糯', value: '糯扎渡' }, + { key: '景', value: '景洪' }, + { key: '黄', value: '黄登' }, + { key: '华', value: '大华桥' }, + { key: '积', value: '积石峡' }, + { key: '苏', value: '苏只' }, + { key: '李', value: '李家峡' }, + { key: '拉', value: '拉西瓦' }, + { key: '龙', value: '龙羊峡' }, + { key: '班', value: '班多' }, + { key: '公', value: '公伯峡' } +]; + +export const offset1: any = { + sdzYijianL: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzYijianR: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzZaijianL: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzZaijianR: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + wushujvL: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + wushujvR: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzDabiaolv1L: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzDabiaolv1R: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzDabiaolv2L: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzDabiaolv2R: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzDabiaolv3L: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzDabiaolv3R: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzDabiaolv4L: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzDabiaolv4R: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + sdzDabiaolv5L: { + text_x: -10, + text_y: -2.9, + icon_x: -200, + icon_y: -69, + billboard_x: -80, + billboard_y: -15, + labelOffset: [100, 41] + }, + sdzDabiaolv5R: { + text_x: 10, + text_y: -2.9, + icon_x: 200, + icon_y: -69, + billboard_x: 80, + billboard_y: -15, + labelOffset: [306, 41] + }, + szzBudabiaoL: { + text_x: -12, + text_y: -2.9, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -13, + labelOffset: [154, 46] + }, + szzBudabiaoR: { + text_x: 12, + text_y: -2.9, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -13, + labelOffset: [362, 46] + }, + szzDabiaoL: { + text_x: -12, + text_y: -2.9, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -13, + labelOffset: [154, 46] + }, + szzDabiaoR: { + text_x: 12, + text_y: -2.9, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -13, + labelOffset: [362, 46] + }, + szzWudabiaoshujvL: { + text_x: -12, + text_y: -2.9, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -13, + labelOffset: [154, 46] + }, + szzWudabiaoshujvR: { + text_x: 12, + text_y: -2.9, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -13, + labelOffset: [362, 46] + }, + shuishengshengtai: { + text_x: -0.1, + text_y: -3.5, + icon_x: -1, + icon_y: -100, + billboard_x: -1, + billboard_y: -25, + labelOffset: [150, 45] + }, + cezhanL: { + text_x: -12.2, + text_y: -2.9, + icon_x: -260, + icon_y: -68, + billboard_x: -100, + billboard_y: -13, + labelOffset: [154, 48] + }, + cezhanR: { + text_x: 12.2, + text_y: -2.9, + icon_x: 260, + icon_y: -68, + billboard_x: 100, + billboard_y: -13, + labelOffset: [362, 48] + }, + sdzGaojing0L: { + text_x: -11.7, + text_y: -2.8, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -15, + labelOffset: [154, 46] + }, + sdzGaojing0R: { + text_x: 11.7, + text_y: -2.8, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -15, + labelOffset: [362, 46] + }, + sdzGaojing1L: { + text_x: -11.7, + text_y: -2.8, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -15, + labelOffset: [154, 46] + }, + sdzGaojing1R: { + text_x: 11.7, + text_y: -2.8, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -15, + labelOffset: [362, 46] + }, + sdzGaojing2L: { + text_x: -11.7, + text_y: -2.8, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -15, + labelOffset: [154, 46] + }, + sdzGaojing2R: { + text_x: 11.7, + text_y: -2.8, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -15, + labelOffset: [362, 46] + }, + sdzGaojing3L: { + text_x: -11.7, + text_y: -2.8, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -15, + labelOffset: [154, 46] + }, + sdzGaojing3R: { + text_x: 11.7, + text_y: -2.8, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -15, + labelOffset: [362, 46] + }, + wushujvlgL: { + text_x: -11.7, + text_y: -2.8, + icon_x: -255, + icon_y: -68, + billboard_x: -100, + billboard_y: -15, + labelOffset: [154, 46] + }, + wushujvlgR: { + text_x: 11.7, + text_y: -2.8, + icon_x: 255, + icon_y: -68, + billboard_x: 100, + billboard_y: -15, + labelOffset: [362, 46] + }, + gyssL: { + text_x: -12.65, + text_y: -2.9, + icon_x: -275, + icon_y: -68, + billboard_x: -110, + billboard_y: -13, + labelOffset: [165, 41] + }, + gyssR: { + text_x: 12.65, + text_y: -2.9, + icon_x: 275, + icon_y: -68, + billboard_x: 110, + billboard_y: -13, + labelOffset: [385, 41] + } + // qixidiL: { text_x: 12.2, text_y: 2.9, icon_x: 260, icon_y: 68, billboard_x: 100, billboard_y: 13, label_x: 140, label_y: 44 }, + // qixidiR: { text_x: 12.2, text_y: 2.9, icon_x: 260, icon_y: 68, billboard_x: 100, billboard_y: 13, label_x: 140, label_y: 44 }, +}; +export const drawDotImg1: any = { + large_eng_built: { left: 'sdzYijianL', right: 'sdzYijianR' }, + large_eng_ubuilt: { left: 'sdzZaijianL', right: 'sdzZaijianR' }, + large_eng_nbuilt: { left: 'wushujvL', right: 'wushujvR' }, + mid_eng_built: { left: 'sdzYijianL', right: 'sdzYijianR' }, + mid_eng_ubuilt: { left: 'sdzZaijianL', right: 'sdzZaijianR' }, + mid_eng_nbuilt: { left: 'wushujvL', right: 'wushujvR' }, + eef_1_1: { left: 'sdzDabiaolv1L', right: 'sdzDabiaolv1R' }, + eef_1_2: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, + eef_1_3: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, + eef_1_4: { left: 'sdzDabiaolv4L', right: 'sdzDabiaolv4R' }, + eef_1_none: { left: 'sdzDabiaolv5L', right: 'sdzDabiaolv5R' }, + eef_2_1: { left: 'sdzDabiaolv1L', right: 'sdzDabiaolv1R' }, + eef_2_2: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, + eef_2_3: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, + eef_2_4: { left: 'sdzDabiaolv4L', right: 'sdzDabiaolv4R' }, + eef_2_none: { left: 'sdzDabiaolv5L', right: 'sdzDabiaolv5R' }, + WT_1: { left: 'gyssL', right: 'gyssR' }, + WT_2: { left: 'gyssL', right: 'gyssR' }, + stinfo_wtzj_legend: { left: 'gyssL', right: 'gyssR' }, + wq_station_3: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, + wq_station_4: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, + wq_station_1: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, + wq_station_2: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, + wq_station_5: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, + wq_station_6: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, + wq_station_7: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, + wq_station_8: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, + wq_station_9: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, + alarm_range_3: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + alarm_range_2: { left: 'sdzGaojing2L', right: 'sdzGaojing2R' }, + alarm_range_1: { left: 'sdzGaojing1L', right: 'sdzGaojing1R' }, + alarm_range_0: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + WE: { left: 'shuishengshengtai', right: 'shuishengshengtai' }, + qxz: { left: 'cezhanL', right: 'cezhanR' }, + spjk: { left: 'cezhanL', right: 'cezhanR' }, + fbfm_spjk: { left: 'cezhanL', right: 'cezhanR' }, + eqs_spjk: { left: 'cezhanL', right: 'cezhanR' }, + wq_spjk: { left: 'cezhanL', right: 'cezhanR' }, + fp_spjk: { left: 'cezhanL', right: 'cezhanR' }, + fb_spjk: { left: 'cezhanL', right: 'cezhanR' }, + fh_spjk: { left: 'cezhanL', right: 'cezhanR' }, + va_spjk: { left: 'cezhanL', right: 'cezhanR' }, + vp_spjk: { left: 'cezhanL', right: 'cezhanR' }, + dw_spjk: { left: 'cezhanL', right: 'cezhanR' }, + gjllz: { left: 'cezhanL', right: 'cezhanR' }, + zjllz: { left: 'cezhanL', right: 'cezhanR' }, + wt_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + wt_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + wt_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, + wq_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + wq_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + wq_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, + rz_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + rz_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + rz_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, + operat_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + operat_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + operat_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, + dxsdz_ywc: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, + dxsdz_wwc: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + dxsdz_wtb: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, + zxsdz_ywc: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, + zxsdz_wwc: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, + zxsdz_wtb: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, + gy_1: { left: 'gyssL', right: 'gyssR' }, + gy_2: { left: 'gyssL', right: 'gyssR' }, + gy_3: { left: 'gyssL', right: 'gyssR' }, + gy_4: { left: 'gyssL', right: 'gyssR' }, + gy_5: { left: 'gyssL', right: 'gyssR' }, + dws_1: { left: 'gyssL', right: 'gyssR' }, + dws_2: { left: 'gyssL', right: 'gyssR' }, + dws_3: { left: 'gyssL', right: 'gyssR' }, + dws_4: { left: 'gyssL', right: 'gyssR' }, + EQ_7: { left: 'gyssL', right: 'gyssR' }, + EQ_6: { left: 'gyssL', right: 'gyssR' }, + EQ_2: { left: 'gyssL', right: 'gyssR' }, + EQ_3: { left: 'gyssL', right: 'gyssR' }, + EQ_4: { left: 'gyssL', right: 'gyssR' }, + EQ_5: { left: 'gyssL', right: 'gyssR' }, + EQ_1: { left: 'gyssL', right: 'gyssR' }, + FB: { left: 'gyssL', right: 'gyssR' }, + VP: { left: 'gyssL', right: 'gyssR' }, + VA: { left: 'gyssL', right: 'gyssR' }, + SG: { left: 'gyssL', right: 'gyssR' }, + FH: { left: 'gyssL', right: 'gyssR' }, + ylfb: { left: 'gyssL', right: 'gyssR' }, + gy_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + gy_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + gy_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + gy_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + gy_5_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + dws_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + dws_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + dws_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + dws_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_6_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_5_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + EQ_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + FB_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + VP_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + VA_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + SG_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, + large_eng_built_alarm_range_0: { + left: 'sdzGaojing0L', + right: 'sdzGaojing0R' + }, + mid_eng_built_alarm_range_0: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, + large_eng_built_alarm_range_1: { + left: 'sdzGaojing1L', + right: 'sdzGaojing1R' + }, + mid_eng_built_alarm_range_1: { left: 'sdzGaojing1L', right: 'sdzGaojing1R' }, + large_eng_built_alarm_range_2: { + left: 'sdzGaojing2L', + right: 'sdzGaojing2R' + }, + mid_eng_built_alarm_range_2: { left: 'sdzGaojing2L', right: 'sdzGaojing2L' }, + large_eng_built_alarm_range_3: { + left: 'sdzGaojing3L', + right: 'sdzGaojing3R' + }, + mid_eng_built_alarm_range_3: { left: 'sdzGaojing3L', right: 'sdzGaojing3L' }, + fhwt_legend: { left: 'gyssL', right: 'gyssR' }, + fhwq_legend: { left: 'gyssL', right: 'gyssR' } +}; + +export const offset2: any = { + dxsdzYijianL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + dxsdzZaijianL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + dxsdzGuihuaL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzYijianL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzZaijianL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzGuihuaL: { + text_x: -4, + text_y: -0.2, + icon_x: -130, + icon_y: -5, + billboard_x: -50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + + dxsdzYijianR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + dxsdzZaijianR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + dxsdzGuihuaR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzYijianR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzZaijianR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + zxsdzGuihuaR: { + text_x: 6.5, + text_y: -0.2, + icon_x: 130, + icon_y: -5, + billboard_x: 50, + billboard_y: 0.01, + labelOffset: [138, 30] + }, + + 'dxsdzDabiaolv-1': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-2': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-3': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-4': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-5': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-1': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-2': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-3': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-4': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-5': { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + gyss: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [176, 43] + }, + szzDabiao: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzBudabiao: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzWudabiaoshujv: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing0: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing1: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing2: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing3: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + qixidi: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + cezhan: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + wushujvlg: { + text_x: 0, + text_y: -2.9, + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + ylfbL: { + text_x: -8, + text_y: -0.3, + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [158, 49] + }, + ylfbR: { + text_x: 8.3, + text_y: -0.3, + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [158, 49] + }, + yeshengdongwu: { + text_x: 7.5, + text_y: -0.3, + icon_x: 170, + icon_y: -5, + billboard_x: 0, + billboard_y: -20, + labelOffset: [116, 46] + }, + 'bg-mapDongwuL': { + text_offset: [-6.8, -0.3], + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [111, 46] + }, + 'bg-mapDongwuR': { + text_offset: [6.8, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [161, 46] + } +}; + +export const drawDotImg2: any = { + large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, + large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, + large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, + mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, + mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, + mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, + eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, + eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, + eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, + eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, + eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, + eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, + WT_1: { left: 'gyss', right: 'gyss' }, + WT_2: { left: 'gyss', right: 'gyss' }, + wqfb_legend: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_3: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_4: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_1: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_2: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_5: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_6: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_7: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + wq_station_8: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + wq_station_9: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + WE: { left: 'qixidi', right: 'qixidi' }, + qxz: { left: 'cezhan', right: 'cezhan' }, + spjk: { left: 'cezhan', right: 'cezhan' }, + fbfm_spjk: { left: 'cezhan', right: 'cezhan' }, + eqs_spjk: { left: 'cezhan', right: 'cezhan' }, + wq_spjk: { left: 'cezhan', right: 'cezhan' }, + fp_spjk: { left: 'cezhan', right: 'cezhan' }, + fb_spjk: { left: 'cezhan', right: 'cezhan' }, + fh_spjk: { left: 'cezhan', right: 'cezhan' }, + va_spjk: { left: 'cezhan', right: 'cezhan' }, + vp_spjk: { left: 'cezhan', right: 'cezhan' }, + dw_spjk: { left: 'cezhan', right: 'cezhan' }, + gjllz: { left: 'cezhan', right: 'cezhan' }, + zjllz: { left: 'cezhan', right: 'cezhan' }, + wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + gy_1: { left: 'gyss', right: 'gyss' }, + gy_2: { left: 'gyss', right: 'gyss' }, + gy_3: { left: 'gyss', right: 'gyss' }, + gy_4: { left: 'gyss', right: 'gyss' }, + gy_5: { left: 'gyss', right: 'gyss' }, + dws_1: { left: 'gyss', right: 'gyss' }, + dws_2: { left: 'gyss', right: 'gyss' }, + dws_3: { left: 'gyss', right: 'gyss' }, + dws_4: { left: 'gyss', right: 'gyss' }, + EQ_7: { left: 'gyss', right: 'gyss' }, + EQ_6: { left: 'gyss', right: 'gyss' }, + EQ_2: { left: 'gyss', right: 'gyss' }, + EQ_3: { left: 'gyss', right: 'gyss' }, + EQ_4: { left: 'gyss', right: 'gyss' }, + EQ_5: { left: 'gyss', right: 'gyss' }, + EQ_1: { left: 'gyss', right: 'gyss' }, + FB: { left: 'gyss', right: 'gyss' }, + VP: { left: 'gyss', right: 'gyss' }, + VA: { left: 'gyss', right: 'gyss' }, + SG: { left: 'gyss', right: 'gyss' }, + FH: { left: 'gyss', right: 'gyss' }, + ylfb: { left: 'gyss', right: 'gyss' }, + fish_along: { left: 'ylfbR', right: 'ylfbR' }, + gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wild_animal_legend: { left: 'yeshengdongwu', right: 'yeshengdongwu' }, + fd_legend: { left: 'gyss', right: 'gyss' }, + stinfo_wtzj_legend: { left: 'gyss', right: 'gyss' }, + fhwt_legend: { left: 'gyss', right: 'gyss' }, + fhwq_legend: { left: 'gyss', right: 'gyss' }, + terrestrial_animals: { left: 'bg-mapDongwuL', right: 'bg-mapDongwuR' } +}; +export const offset3: any = { + dxsdzYijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + dxsdzZaijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + dxsdzGuihuaL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzYijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzZaijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzGuihuaL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + + dxsdzYijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + dxsdzZaijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + dxsdzGuihuaR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzYijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzZaijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzGuihuaR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + + 'dxsdzDabiaolv-1': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-2': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-3': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-4': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-5': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-1': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-2': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-3': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-4': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-5': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + gyss: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [176, 43] + }, + szzDabiao: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzBudabiao: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzWudabiaoshujv: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing0: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing1: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing2: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing3: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + qixidi: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + cezhan: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + wushujvlg: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + ylfbL: { + text_offset: [-8, -0.3], + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [158, 49] + }, + ylfbR: { + text_offset: [8.3, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [158, 49] + }, + yeshengdongwu: { + text_offset: [7.5, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 0, + billboard_y: -20, + labelOffset: [116, 46] + }, + 'bg-mapDongwuL': { + text_offset: [-6.8, -0.3], + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [111, 46] + }, + 'bg-mapDongwuR': { + text_offset: [6.8, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [161, 46] + } +}; +export const drawDotImg3: any = { + large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, + large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, + large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, + mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, + mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, + mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, + eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, + eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, + eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, + eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, + eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, + eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, + WT_1: { left: 'gyss', right: 'gyss' }, + WT_2: { left: 'gyss', right: 'gyss' }, + wqfb_legend: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_3: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_4: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_1: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_2: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_5: { left: 'szzDabiao', right: 'szzDabiao' }, + wq_station_6: { left: 'szzBudabiao', right: 'szzBudabiao' }, + wq_station_7: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + wq_station_8: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + wq_station_9: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, + alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + WE: { left: 'qixidi', right: 'qixidi' }, + rare_fish: { left: 'qixidi', right: 'qixidi' }, + qxz: { left: 'cezhan', right: 'cezhan' }, + spjk: { left: 'cezhan', right: 'cezhan' }, + fbfm_spjk: { left: 'blueL', right: 'blueR' }, + eqs_spjk: { left: 'blueL', right: 'blueR' }, + wq_spjk: { left: 'blueL', right: 'blueR' }, + fp_spjk: { left: 'blueL', right: 'blueR' }, + fb_spjk: { left: 'blueL', right: 'blueR' }, + fh_spjk: { left: 'blueL', right: 'blueR' }, + va_spjk: { left: 'blueL', right: 'blueR' }, + vp_spjk: { left: 'blueL', right: 'blueR' }, + dw_spjk: { left: 'blueL', right: 'blueR' }, + gjllz: { left: 'cezhan', right: 'cezhan' }, + zjllz: { left: 'cezhan', right: 'cezhan' }, + wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + gy_1: { left: 'gyss', right: 'gyss' }, + gy_2: { left: 'gyss', right: 'gyss' }, + gy_3: { left: 'gyss', right: 'gyss' }, + gy_4: { left: 'gyss', right: 'gyss' }, + gy_5: { left: 'gyss', right: 'gyss' }, + dws_1: { left: 'gyss', right: 'gyss' }, + dws_2: { left: 'gyss', right: 'gyss' }, + dws_3: { left: 'gyss', right: 'gyss' }, + dws_4: { left: 'gyss', right: 'gyss' }, + EQ_7: { left: 'gyss', right: 'gyss' }, + EQ_6: { left: 'gyss', right: 'gyss' }, + EQ_2: { left: 'gyss', right: 'gyss' }, + EQ_3: { left: 'gyss', right: 'gyss' }, + EQ_4: { left: 'gyss', right: 'gyss' }, + EQ_5: { left: 'gyss', right: 'gyss' }, + EQ_1: { left: 'gyss', right: 'gyss' }, + FB: { left: 'gyss', right: 'gyss' }, + VP: { left: 'gyss', right: 'gyss' }, + VA: { left: 'gyss', right: 'gyss' }, + SG: { left: 'gyss', right: 'gyss' }, + FH: { left: 'gyss', right: 'gyss' }, + ylfb: { left: 'gyss', right: 'gyss' }, + fish_along: { left: 'ylfbR', right: 'ylfbR' }, + gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wild_animal_legend: { left: 'yeshengdongwu', right: 'yeshengdongwu' }, + fd_legend: { left: 'gyss', right: 'gyss' }, + stinfo_wtzj_legend: { left: 'gyss', right: 'gyss' }, + fhwt_legend: { left: 'gyss', right: 'gyss' }, + fhwq_legend: { left: 'gyss', right: 'gyss' }, + terrestrial_animals: { left: 'bg-mapDongwuL', right: 'bg-mapDongwuR' } +}; + +export const offset5: any = { + dxsdzYijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + dxsdzZaijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + dxsdzGuihuaL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzYijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzZaijianL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + zxsdzGuihuaL: { + text_offset: [-0.7, 0.3], + text_offset2: [-1.0, 0.3], + icon_x: -130, + icon_y: -5, + billboard_x: -57, + billboard_y: 15, + labelOffset: [140, 30] + }, + + dxsdzYijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + dxsdzZaijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + dxsdzGuihuaR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzYijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzZaijianR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + zxsdzGuihuaR: { + text_offset: [0.7, -0.5], + text_offset2: [1.0, -0.5], + icon_x: 130, + icon_y: -5, + billboard_x: 57, + billboard_y: 8, + labelOffset: [70, 30] + }, + + 'dxsdzDabiaolv-1': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-2': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-3': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-4': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'dxsdzDabiaolv-5': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-1': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-2': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-3': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-4': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + 'zxsdzDabiaolv-5': { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [138, 30] + }, + gyss: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [176, 43] + }, + szzDabiao: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzBudabiao: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + szzWudabiaoshujv: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing0: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing1: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing2: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + sdzGaojing3: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + qixidi: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + cezhan: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + wushujvlg: { + text_offset: [0, -2.9], + icon_x: 0, + icon_y: -69, + billboard_x: 0, + billboard_y: -20, + labelOffset: [158, 49] + }, + ylfbL: { + text_offset: [-8, -0.3], + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [158, 49] + }, + ylfbR: { + text_offset: [8.3, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [158, 49] + }, + yeshengdongwu: { + text_offset: [7.5, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 0, + billboard_y: -20, + labelOffset: [116, 46] + }, + 'bg-mapDongwuL': { + text_offset: [-6.8, -0.3], + icon_x: -180, + icon_y: -5, + billboard_x: -75, + billboard_y: 15, + labelOffset: [111, 46] + }, + 'bg-mapDongwuR': { + text_offset: [6.8, -0.3], + icon_x: 170, + icon_y: -5, + billboard_x: 70, + billboard_y: 15, + labelOffset: [161, 46] + }, + dabiaoL: { + text_offset: [-2.6, -0.9], + text_offset2: [-3.2, -0.9], + icon_offset2: [-60, -20], + icon_x: -44, + icon_y: -20, + billboard_x: -6, + billboard_y: -16, + labelOffset: [60, 16] + }, + dabiaoR: { + text_offset: [2.6, -0.9], + text_offset2: [3.2, -0.9], + icon_offset2: [60, -20], + icon_x: 44, + icon_y: -20, + billboard_x: 6, + billboard_y: -16, + labelOffset: [60, 16] + }, + budabiaoL: { + text_offset: [-2.6, -0.9], + text_offset2: [-3.2, -0.9], + icon_offset2: [-60, -20], + icon_x: -44, + icon_y: -20, + billboard_x: -6, + billboard_y: -16, + labelOffset: [60, 16] + }, + budabiaoR: { + text_offset: [2.6, -0.9], + text_offset2: [3.2, -0.9], + icon_offset2: [60, -20], + icon_x: 44, + icon_y: -20, + billboard_x: 6, + billboard_y: -16, + labelOffset: [60, 16] + }, + wushujvL: { + text_offset: [-2.6, -0.9], + text_offset2: [-3.2, -0.9], + icon_offset2: [-60, -20], + icon_x: -44, + icon_y: -20, + billboard_x: -6, + billboard_y: -16, + labelOffset: [60, 16] + }, + wushujvR: { + text_offset: [2.6, -0.9], + text_offset2: [3.2, -0.9], + icon_offset2: [60, -20], + icon_x: 44, + icon_y: -20, + billboard_x: 6, + billboard_y: -16, + labelOffset: [60, 16] + }, + greenL: { + text_offset: [-2.6, -0.9], + text_offset2: [-3.2, -0.9], + icon_offset2: [-60, -20], + icon_x: -44, + icon_y: -20, + billboard_x: -6, + billboard_y: -18, + labelOffset: [60, 16] + }, + greenR: { + text_offset: [2.6, -0.9], + text_offset2: [3.2, -0.9], + icon_offset2: [60, -20], + icon_x: 44, + icon_y: -20, + billboard_x: 6, + billboard_y: -18, + labelOffset: [60, 16] + }, + blueL: { + text_offset: [-2.6, -0.9], + text_offset2: [-3.2, -0.9], + icon_offset2: [-60, -20], + icon_x: -44, + icon_y: -20, + billboard_x: -6, + billboard_y: -16, + labelOffset: [60, 16] + }, + blueR: { + text_offset: [2.6, -0.9], + text_offset2: [3.2, -0.9], + icon_offset2: [60, -20], + icon_x: 44, + icon_y: -20, + billboard_x: 6, + billboard_y: -16, + labelOffset: [60, 16] + } +}; + +export const drawDotImg5: any = { + large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, + large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, + large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, + mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, + mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, + mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, + eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, + eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, + eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, + eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, + eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, + eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, + WT_1: { left: 'greenL', right: 'greenR' }, + WT_2: { left: 'greenL', right: 'greenR' }, + wqfb_legend: { left: 'dabiaoL', right: 'dabiaoR' }, + wq_station_3: { left: 'dabiaoL', right: 'dabiaoR' }, + wq_station_4: { left: 'budabiaoL', right: 'budabiaoR' }, + wq_station_1: { left: 'dabiaoL', right: 'dabiaoR' }, + wq_station_2: { left: 'budabiaoL', right: 'budabiaoR' }, + wq_station_5: { left: 'dabiaoL', right: 'dabiaoR' }, + wq_station_6: { left: 'budabiaoL', right: 'budabiaoR' }, + wq_station_7: { left: 'wushujvL', right: 'wushujvR' }, + wq_station_8: { left: 'wushujvL', right: 'wushujvR' }, + wq_station_9: { left: 'wushujvL', right: 'wushujvR' }, + alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + WE: { left: 'greenL', right: 'greenR' }, + rare_fish: { left: 'greenL', right: 'greenR' }, + qxz: { left: 'blueL', right: 'blueR' }, + spjk: { left: 'blueL', right: 'blueR' }, + gjllz: { left: 'blueL', right: 'blueR' }, + zjllz: { left: 'blueL', right: 'blueR' }, + fbfm_spjk: { left: 'blueL', right: 'blueR' }, + eqs_spjk: { left: 'blueL', right: 'blueR' }, + wq_spjk: { left: 'blueL', right: 'blueR' }, + fp_spjk: { left: 'blueL', right: 'blueR' }, + fb_spjk: { left: 'blueL', right: 'blueR' }, + fh_spjk: { left: 'blueL', right: 'blueR' }, + va_spjk: { left: 'blueL', right: 'blueR' }, + vp_spjk: { left: 'blueL', right: 'blueR' }, + dw_spjk: { left: 'blueL', right: 'blueR' }, + wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, + dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, + dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, + zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, + zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, + gy_1: { left: 'greenL', right: 'greenR' }, + gy_2: { left: 'greenL', right: 'greenR' }, + gy_3: { left: 'greenL', right: 'greenR' }, + gy_4: { left: 'greenL', right: 'greenR' }, + gy_5: { left: 'greenL', right: 'greenR' }, + dws_1: { left: 'greenL', right: 'greenR' }, + dws_2: { left: 'greenL', right: 'greenR' }, + dws_3: { left: 'greenL', right: 'greenR' }, + dws_4: { left: 'greenL', right: 'greenR' }, + EQ_7: { left: 'greenL', right: 'greenR' }, + EQ_6: { left: 'greenL', right: 'greenR' }, + EQ_2: { left: 'greenL', right: 'greenR' }, + EQ_3: { left: 'greenL', right: 'greenR' }, + EQ_4: { left: 'greenL', right: 'greenR' }, + EQ_5: { left: 'greenL', right: 'greenR' }, + EQ_1: { left: 'greenL', right: 'greenR' }, + FB: { left: 'greenL', right: 'greenR' }, + VP: { left: 'greenL', right: 'greenR' }, + VA: { left: 'greenL', right: 'greenR' }, + SG: { left: 'greenL', right: 'greenR' }, + FH: { left: 'greenL', right: 'greenR' }, + ylfb: { left: 'greenL', right: 'greenR' }, + fish_along: { left: 'greenL', right: 'greenR' }, + gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, + large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, + large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, + large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, + large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, + wild_animal_legend: { left: 'greenL', right: 'greenR' }, + fd_legend: { left: 'greenL', right: 'greenR' }, + stinfo_wtzj_legend: { left: 'greenL', right: 'greenR' }, + fhwt_legend: { left: 'greenL', right: 'greenR' }, + fhwq_legend: { left: 'greenL', right: 'greenR' }, + terrestrial_animals: { left: 'greenL', right: 'greenR' } +}; + +export const level_Altitude: any = { + '0': 91189921, + '1': 45454474, + '2': 22657211, + '3': 11293700, + '4': 5629451, + '5': 2806053, + '6': 1398704, + '7': 697197, + '8': 347524, + '9': 173227, + '10': 86347, + '11': 43040, + '12': 21454, + '13': 10694, + '14': 5330, + '15': 2657, + '16': 1324, + '17': 660, + '18': 329, + '19': 164, + '20': 82, + '21': 41, + '22': 20, + '23': 10, + '24': 5 +}; +export const anchoToIconCode: any = { + large_eng_built: 'map-dxsdzYijian', + large_eng_ubuilt: 'map-dxsdzZaijian', + large_eng_nbuilt: 'map-dxsdzGuihua', + mid_eng_built: 'map-zxsdzYijian', + mid_eng_ubuilt: 'map-zxsdzZaijian', + mid_eng_nbuilt: 'map-zxsdzGuihua' +}; diff --git a/frontend-sjgl/src/utils/auth.ts b/frontend-sjgl/src/utils/auth.ts new file mode 100644 index 00000000..29766990 --- /dev/null +++ b/frontend-sjgl/src/utils/auth.ts @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie'; + +const TokenKey = 'token'; +const PathKey = 'path'; +export function getToken() { + return Cookies.get(TokenKey); +} + +export function setToken(token: any) { + Cookies.set(TokenKey, token); +} + +export function removeToken() { + return Cookies.remove(TokenKey); +} \ No newline at end of file diff --git a/frontend-sjgl/src/utils/buildTimeFilters.ts b/frontend-sjgl/src/utils/buildTimeFilters.ts new file mode 100644 index 00000000..20bbecd8 --- /dev/null +++ b/frontend-sjgl/src/utils/buildTimeFilters.ts @@ -0,0 +1,150 @@ +import dayjs from 'dayjs'; + +interface TimeFilterValues { + timeScale: string; + jcdt: { + min: any; + max: any; + }; +} + +/** + * 构建时间过滤条件 + * @param values - 包含 timeScale 和 jcdt 的对象 + * @returns 过滤条件数组 + */ +export function buildTimeFilters(values: TimeFilterValues) { + const { timeScale, jcdt } = values; + const filters: any[] = []; + + if (!jcdt || !jcdt.min || !jcdt.max) return filters; + + if (timeScale === 'tm') { + // 小时:传 tm,拆成 gte 和 lte + filters.push({ + field: 'tm', + operator: 'gte', + dataType: 'date', + value: dayjs(jcdt.min).format('YYYY-MM-DD HH:mm:ss') + }); + filters.push({ + field: 'tm', + operator: 'lte', + dataType: 'date', + value: dayjs(jcdt.max).format('YYYY-MM-DD HH:mm:ss') + }); + } else if (timeScale === 'dt') { + // 日:传 dt,拆成 gte 和 lte + filters.push({ + field: 'dt', + operator: 'gte', + dataType: 'date', + value: dayjs(jcdt.min).format('YYYY-MM-DD HH:mm:ss') + }); + filters.push({ + field: 'dt', + operator: 'lte', + dataType: 'date', + value: dayjs(jcdt.max).format('YYYY-MM-DD HH:mm:ss') + }); + } else if (timeScale === 'month') { + // 月:drtp 固定 MON,year 和 month 数组 + const minDate = dayjs(jcdt.min); + const maxDate = dayjs(jcdt.max); + const minYear = minDate.year(); + const maxYear = maxDate.year(); + + // 同年:传 drtp=MON + year + month 数组 + if (minYear === maxYear) { + filters.push({ + field: 'drtp', + operator: 'eq', + dataType: 'string', + value: 'MON' + }); + + filters.push({ + field: 'year', + operator: 'eq', + dataType: 'string', + value: String(minYear) + }); + + const months: number[] = []; + let m = minDate.month() + 1; + const endMonth = maxDate.month() + 1; + while (true) { + months.push(m); + if (m === endMonth) break; + m = m >= 12 ? 1 : m + 1; + if (months.length > 12) break; + } + filters.push({ + field: 'month', + operator: 'in', + dataType: 'number', + value: months + }); + } else { + // 跨年:拆分成两个 AND 组合,用 OR 连接,不传 drtp + const firstYearMonths: number[] = []; + let m1 = minDate.month() + 1; + while (m1 <= 12) { + firstYearMonths.push(m1); + m1++; + } + filters.push({ + logic: 'and', + filters: [ + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: String(minYear) + }, + { + field: 'month', + operator: 'in', + dataType: 'number', + value: firstYearMonths + } + ] + }); + + const secondYearMonths: number[] = []; + let m2 = 1; + const endMonth = maxDate.month() + 1; + while (m2 <= endMonth) { + secondYearMonths.push(m2); + m2++; + } + filters.push({ + logic: 'and', + filters: [ + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: String(maxYear) + }, + { + field: 'month', + operator: 'in', + dataType: 'number', + value: secondYearMonths + } + ] + }); + + // 将 filters 数组转换为 OR 逻辑 + return [ + { + logic: 'or', + filters: filters + } + ]; + } + } + + return filters; +} diff --git a/frontend-sjgl/src/utils/drag.ts b/frontend-sjgl/src/utils/drag.ts new file mode 100644 index 00000000..39901184 --- /dev/null +++ b/frontend-sjgl/src/utils/drag.ts @@ -0,0 +1,182 @@ +import { nextTick, watch } from 'vue'; + +export interface DraggableOptions { + /** 拖拽手柄选择器,默认 '.ant-modal-header' */ + handle?: string; + /** 弹窗内容选择器,默认 '.ant-modal-content' */ + modalSelector?: string; + /** 是否限制在可视区域内,默认 true */ + boundary?: boolean; + /** 打开弹窗时是否自动重置到居中位置,默认 true */ + resetOnOpen?: boolean; +} + +export function useDraggable( + openRef: { value: boolean }, + options: DraggableOptions = {} +) { + console.log(openRef); + const { + handle = '.ant-modal-header', + modalSelector = '.ant-modal-content', + boundary = true, + resetOnOpen = true + } = options; + + let cleanup: (() => void) | null = null; + + const initDrag = (): (() => void) | null => { + if (resetOnOpen) { + const modalContents = document.querySelectorAll( + modalSelector + ) as NodeListOf; + modalContents.forEach(content => { + if (content.offsetParent !== null) { + content.style.position = ''; + content.style.left = ''; + content.style.top = ''; + content.style.margin = ''; + content.style.transform = ''; + content.style.width = ''; + } + }); + } + + let currentModalContent: HTMLElement | null = null; + let isDragging = false; + let startX = 0; + let startY = 0; + let startLeft = 0; + let startTop = 0; + + const getPointerPos = (e: MouseEvent | TouchEvent) => { + if (e instanceof TouchEvent) { + const touch = e.touches[0]; + return { clientX: touch.clientX, clientY: touch.clientY }; + } + return { clientX: e.clientX, clientY: e.clientY }; + }; + + const onPointerDown = (e: MouseEvent | TouchEvent) => { + const target = e.target instanceof HTMLElement ? e.target : null; + const dragHandle = target?.closest(handle) as HTMLElement | null; + + if (!dragHandle) return; + + const modalContent = dragHandle.closest( + modalSelector + ) as HTMLElement | null; + if (!modalContent) return; + + if ( + target.closest('.ant-modal-close') || + target.closest('button') || + target.closest('input') || + target.closest('select') || + target.closest('textarea') || + target.closest('a') + ) + return; + + e.preventDefault(); + isDragging = true; + currentModalContent = modalContent; + + const rect = modalContent.getBoundingClientRect(); + startLeft = rect.left; + startTop = rect.top; + const pos = getPointerPos(e); + startX = pos.clientX - startLeft; + startY = pos.clientY - startTop; + + const currentWidth = modalContent.offsetWidth; + modalContent.style.width = currentWidth + 'px'; + + modalContent.style.userSelect = 'none'; + modalContent.style.webkitUserSelect = 'none'; + modalContent.style.position = 'fixed'; + modalContent.style.margin = '0'; + modalContent.style.transform = 'none'; + + document.addEventListener('mousemove', onPointerMove, { passive: false }); + document.addEventListener('mouseup', onPointerUp); + document.addEventListener('touchmove', onPointerMove, { passive: false }); + document.addEventListener('touchend', onPointerUp); + }; + + const onPointerMove = (e: MouseEvent | TouchEvent) => { + if (!isDragging || !currentModalContent) return; + e.preventDefault(); + const pos = getPointerPos(e); + let newLeft = pos.clientX - startX; + let newTop = pos.clientY - startY; + + if (boundary) { + const maxX = window.innerWidth - currentModalContent.offsetWidth; + const maxY = window.innerHeight - currentModalContent.offsetHeight; + newLeft = Math.max(0, Math.min(newLeft, maxX)); + newTop = Math.max(0, Math.min(newTop, maxY)); + } + + currentModalContent.style.left = `${newLeft}px`; + currentModalContent.style.top = `${newTop}px`; + }; + + const onPointerUp = () => { + if (!currentModalContent) return; + isDragging = false; + currentModalContent.style.userSelect = ''; + currentModalContent.style.webkitUserSelect = ''; + document.removeEventListener('mousemove', onPointerMove); + document.removeEventListener('mouseup', onPointerUp); + document.removeEventListener('touchmove', onPointerMove); + document.removeEventListener('touchend', onPointerUp); + currentModalContent = null; + }; + + document.addEventListener('mousedown', onPointerDown); + document.addEventListener('touchstart', onPointerDown, { + passive: false + }); + + return () => { + document.removeEventListener('mousedown', onPointerDown); + document.removeEventListener('touchstart', onPointerDown); + document.removeEventListener('mousemove', onPointerMove); + document.removeEventListener('mouseup', onPointerUp); + document.removeEventListener('touchmove', onPointerMove); + document.removeEventListener('touchend', onPointerUp); + + const modalContents = document.querySelectorAll( + modalSelector + ) as NodeListOf; + modalContents.forEach(content => { + content.style.position = ''; + content.style.left = ''; + content.style.top = ''; + content.style.margin = ''; + content.style.transform = ''; + content.style.width = ''; + content.style.userSelect = ''; + content.style.webkitUserSelect = ''; + }); + }; + }; + + watch( + openRef, + newVal => { + if (newVal) { + nextTick(() => { + cleanup = initDrag(); + }); + } else { + cleanup?.(); + cleanup = null; + } + }, + { immediate: true } + ); + + return { initDrag }; +} diff --git a/frontend-sjgl/src/utils/enumeration.ts b/frontend-sjgl/src/utils/enumeration.ts new file mode 100644 index 00000000..933fb81d --- /dev/null +++ b/frontend-sjgl/src/utils/enumeration.ts @@ -0,0 +1,423 @@ +import dayjs, { Dayjs } from 'dayjs'; +import isoWeek from 'dayjs/plugin/isoWeek'; // 如果需要严格的 ISO 周计算 +import quarterOfYear from 'dayjs/plugin/quarterOfYear'; // 用于季度操作 +import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'; +import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'; + +// 启用插件 +dayjs.extend(quarterOfYear); +dayjs.extend(isoWeek); +dayjs.extend(isSameOrBefore); +dayjs.extend(isSameOrAfter); + +// 设置全局语言为中文(可选,根据项目需求) +import 'dayjs/locale/zh-cn'; +dayjs.locale('zh-cn'); + +namespace Options { + //开发方式 + export const developmentMode = [ + { value: '1', label: '堤坝式' }, + { value: '2', label: '引水式' }, + { value: '3', label: '混合式' } + ]; + // 建设状态 + export const bldsttList = [ + { value: '1', label: '在建' }, + { value: '2', label: '已建' }, + { value: '0', label: '规划' } + ]; + + export const developmentMode2 = [ + { value: 'RRU', label: '上水库' }, + { value: 'RRL', label: '下水库' }, + { value: 'GN', label: '机组' }, + { value: 'GT', label: '闸门' } + ]; + + //电站类型 + export const powerStationType = [ + { + value: '', + label: '所有' + }, + { + value: '1', + label: '已接入' + }, + { + value: '0', + label: '未接入' + } + ]; + //工程类型 + export const projectType = [ + { + value: '', + label: '所有' + }, + { + value: '1', + label: '常规水电' + }, + { + value: '2', + label: '抽水蓄能' + } + ]; + //调节性能 + export const performance = [ + { + value: '1', + label: '多年' + }, + { + value: '2', + label: '年' + }, + { + value: '3', + label: '不完全年' + }, + { + value: '4', + label: '径流式' + }, + { + value: '5', + label: '季' + }, + { + value: '6', + label: '月' + }, + { + value: '7', + label: '周' + }, + { + value: '8', + label: '日' + }, + { + value: '9', + label: '无' + } + ]; + //流域 + export const type = [ + { value: 'district', label: '行政区' }, + { value: 'basin', label: '流域' }, + { value: 'company', label: '公司' } + ]; + export const type2 = [{ value: 'district', label: '行政区' }]; + + export const evaluateType = [ + { + value: '1', + label: '水能效益' + }, + { + value: '2', + label: '水量效益' + }, + { + value: '3', + label: '水位运行评价' + }, + { + value: '4', + label: '防洪效益' + }, + { + value: '5', + label: '生态效益' + } + ]; +} + +namespace DateSetting { + //获取当前时间 + function getStartTime(): Dayjs { + return dayjs().startOf('day').startOf('hour'); + } + + function getStartYear(): Dayjs { + return dayjs().startOf('year'); + } + + function getEarlyDays(): Array { + return [dayjs().startOf('month'), dayjs().startOf('month').add(9, 'day')]; + } + + function getMidmonth(): Array { + return [ + dayjs().startOf('month').add(10, 'day'), + dayjs().startOf('month').add(19, 'day') + ]; + } + + function getLastTenDays(): Array { + return [dayjs().startOf('month').add(20, 'day'), dayjs().endOf('month')]; + } + + export const RangeButton: any = { + days: [ + { + label: '今天', + value: [dayjs().startOf('day'), dayjs().endOf('day')] + }, + { + label: '昨天', + value: [ + dayjs().subtract(1, 'day').startOf('day'), + dayjs().subtract(1, 'day').endOf('day') + ] + }, + { + label: '本周', + // 注意:如果项目配置了 isoWeek 插件且希望周一为起始,可使用 startOf('isoWeek') + value: [dayjs().startOf('week'), dayjs().endOf('week')] + }, + { + label: '上周', + value: [ + dayjs().subtract(1, 'week').startOf('week'), + dayjs().subtract(1, 'week').endOf('week') + ] + }, + { + label: '本月', + value: [dayjs().startOf('month'), dayjs().endOf('month')] + }, + { + label: '上月', + value: [ + dayjs().subtract(1, 'month').startOf('month'), + dayjs().subtract(1, 'month').endOf('month') + ] + }, + { + label: '上半年', + value: [ + dayjs().startOf('year'), + dayjs() + .startOf('year') + .add(6, 'month') + .subtract(1, 'day') + .endOf('day') + ] + }, + { + label: '本年', + value: [dayjs().startOf('year'), dayjs().endOf('year')] + } + ], + days1: [ + { + label: '今天', + value: [dayjs().startOf('day'), dayjs().endOf('day')] + }, + { + label: '昨天', + value: [ + dayjs().subtract(1, 'day').startOf('day'), + dayjs().subtract(1, 'day').endOf('day') + ] + }, + { + label: '近七天', + // 注意:如果项目配置了 isoWeek 插件且希望周一为起始,可使用 startOf('isoWeek') + value: [dayjs().subtract(6, 'day').startOf('day'), dayjs().endOf('day')] + }, + { + label: '最近一个月', + value: [ + dayjs().subtract(1, 'month').startOf('day'), // 一个月前的今天 00:00:00 + dayjs().startOf('day') // 今天的 00:00:00 + ] + }, + { + label: '最近三个月', + value: [ + dayjs().subtract(3, 'month').startOf('day'), + dayjs().startOf('day') + ] + }, + { + label: '今年', + value: [dayjs().startOf('year'), dayjs().endOf('year')] + } + ], + tenDays: [ + { + label: '上旬', + value: getEarlyDays() + }, + { + label: '中旬', + value: getMidmonth() + }, + { + label: '下旬', + value: getLastTenDays() + } + ], + month: [ + { + label: '最近一个月', + value: [getStartTime().subtract(1, 'month'), getStartTime()] + }, + { + label: '最近三个月', + value: [getStartTime().subtract(3, 'month'), getStartTime()] + }, + { + label: '最近半年', + value: [getStartTime().subtract(6, 'month'), getStartTime()] + }, + { + label: '最近一年', + value: [getStartTime().subtract(1, 'year'), getStartTime()] + } + ], + month1: [ + { + label: '最近7天', + value: [getStartTime().subtract(6, 'day'), getStartTime()] + }, + { + label: '最近1个月', + value: [getStartTime().subtract(1, 'month'), getStartTime()] + }, + { + label: '最近3个月', + value: [getStartTime().subtract(3, 'month'), getStartTime()] + }, + { + label: '最近6个月', + value: [getStartTime().subtract(6, 'month'), getStartTime()] + } + ], + hour: [ + { + label: '最近7小时', + value: [getStartTime().subtract(7, 'hour'), getStartTime()] + }, + { + label: '最近24小时', + value: [getStartTime().subtract(24, 'hour'), getStartTime()] + }, + { + label: '最近一周', + value: [getStartTime().subtract(7, 'day'), getStartTime()] + } + ], + season: [ + { + label: '第一季度', + value: [getStartYear(), getStartYear().add(2, 'month').endOf('month')] + }, + { + label: '第二季度', + value: [ + getStartYear().add(3, 'month'), + getStartYear().add(5, 'month').endOf('month') + ] + }, + { + label: '第三季度', + value: [ + getStartYear().add(6, 'month'), + getStartYear().add(8, 'month').endOf('month') + ] + }, + { + label: '第四季度', + value: [ + getStartYear().add(9, 'month'), + getStartYear().add(11, 'month').endOf('month') + ] + } + ], + year: [ + { + label: '最近一年', + value: [getStartTime().subtract(1, 'year'), getStartTime()] + }, + { + label: '近三年', + value: [getStartTime().subtract(3, 'year'), getStartTime()] + }, + { + label: '最近五年', + value: [getStartTime().subtract(5, 'year'), getStartTime()] + }, + { + label: '最近十年', + value: [getStartTime().subtract(10, 'year'), getStartTime()] + } + ], + + year1: [ + { + label: '近七天', + // 注意:如果项目配置了 isoWeek 插件且希望周一为起始,可使用 startOf('isoWeek') + value: [dayjs().subtract(6, 'day').startOf('day'), dayjs().endOf('day')] + }, + { + label: '本月', + value: [dayjs().startOf('month'), dayjs().endOf('month')] + }, + { + label: '最近一个月', + value: [ + dayjs().subtract(1, 'month').startOf('month'), + dayjs().subtract(1, 'month').endOf('month') + ] + }, + { + label: '最近三个月', + value: [ + dayjs().subtract(3, 'month').startOf('month'), + dayjs().endOf('month') + ] + }, + { + label: '最近六个月', + value: [ + dayjs().subtract(6, 'month').startOf('month'), + dayjs().endOf('month') + ] + }, + { + label: '最近一年', + value: [getStartTime().subtract(1, 'year'), getStartTime()] + }, + { + label: '最近两年', + value: [getStartTime().subtract(2, 'year'), getStartTime()] + }, + { + label: '近三年', + value: [getStartTime().subtract(3, 'year'), getStartTime()] + } + ], + future: [ + { + label: '未来一周', + value: [getStartTime(), getStartTime().add(7, 'day')] + }, + { + label: '未来一个月', + value: [getStartTime(), getStartTime().add(1, 'month')] + }, + { + label: '未来三个月', + value: [getStartTime(), getStartTime().add(3, 'month')] + } + ] + }; +} + +export { Options, DateSetting }; diff --git a/frontend-sjgl/src/utils/exportExcel.ts b/frontend-sjgl/src/utils/exportExcel.ts new file mode 100644 index 00000000..a873c9cf --- /dev/null +++ b/frontend-sjgl/src/utils/exportExcel.ts @@ -0,0 +1,370 @@ +/** + * 前端表格 Excel 导出工具 + * 基于 exceljs 实现所见即所得的导出功能 + */ +import * as ExcelJS from 'exceljs'; + +export interface ExportColumn { + title: string; + dataIndex: string; + customRender?: (params: { text: any; record: any; index: number }) => any; + /** 是否在导出时排除该列 */ + excludeFromExport?: boolean; +} + +export interface ExportParams { + /** 导出数据列表 */ + data: any[]; + /** 表格列配置 */ + columns: ExportColumn[]; + /** 导出文件名(不含扩展名) */ + fileName?: string; + /** 表头主标题 */ + tbtitle?: string; + /** 表头副标题 */ + tbsub?: string; + /** 导出回调 */ + callback?: (message: string | boolean) => void; + /** 附加导出表格,默认追加到主表末尾 */ + appendTables?: ExportAppendTableConfig[]; +} + +export interface ExportAppendTableConfig { + /** 追加表格数据 */ + data: any[]; + /** 追加表格列配置 */ + columns: ExportColumn[]; +} + +function normalizeExportValue(value: any): any { + if (value === null || value === undefined || value === '') return value; + + if ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' + ) { + return value; + } + + if (Array.isArray(value)) { + const normalized = value + .map(item => normalizeExportValue(item)) + .filter(item => item !== null && item !== undefined && item !== ''); + return normalized.length > 0 ? normalized.join('') : ''; + } + + if (typeof value === 'object') { + if ('children' in value) { + return normalizeExportValue(value.children); + } + + if ('value' in value) { + return normalizeExportValue(value.value); + } + } + + return String(value); +} + +/** + * 下载 Excel 文件 + */ +function downloadExcel({ + filename, + sheets, + callback +}: { + filename: string; + sheets: { + sheetName: string; + columns: ExportColumn[]; + dataSource: any[]; + tbtitle?: string; + tbsub?: string; + }[]; + callback?: (message: string | boolean) => void; +}) { + try { + const workbook = new ExcelJS.Workbook(); + + const headerStyle: Partial = { + font: { bold: true, size: 14, name: '微软雅黑' }, + alignment: { + wrapText: true, + vertical: 'middle', + horizontal: 'left' + } + }; + + const dataStyle: Partial = { + font: { size: 12, name: '微软雅黑' }, + alignment: { + wrapText: true, + vertical: 'middle', + horizontal: 'left' + } + }; + + const setWorksheetColumns = ( + worksheet: ExcelJS.Worksheet, + columnGroups: ExportColumn[][] + ) => { + const maxColumnCount = Math.max( + ...columnGroups.map(cols => cols.length), + 0 + ); + worksheet.columns = Array.from({ length: maxColumnCount }, (_, index) => { + const definedWidth = Math.max( + ...columnGroups.map(cols => cols[index]?.width || 150), + 150 + ); + const exportWidth = 29.22 + Math.max(0, (definedWidth - 150) / 50) * 10; + return { width: exportWidth }; + }); + }; + + const writeTableBlock = ({ + worksheet, + columns, + dataSource, + startRow, + title, + subTitle, + freezeHeader = false, + showHeader = true + }: { + worksheet: ExcelJS.Worksheet; + columns: ExportColumn[]; + dataSource: any[]; + startRow: number; + title?: string; + subTitle?: string; + freezeHeader?: boolean; + showHeader?: boolean; + }) => { + let currentRow = startRow; + + if (title) { + const titleRow = worksheet.getRow(currentRow); + titleRow.getCell(1).value = title; + titleRow.getCell(2).value = subTitle || ''; + currentRow++; + } + + if (showHeader) { + const headerRow = worksheet.getRow(currentRow); + columns.forEach((col, index) => { + headerRow.getCell(index + 1).value = col.title; + headerRow.getCell(index + 1).style = headerStyle; + }); + + if (freezeHeader) { + worksheet.views = [{ state: 'frozen', ySplit: currentRow }]; + } + + currentRow++; + } + + dataSource.forEach(record => { + const row = worksheet.getRow(currentRow); + columns.forEach((col, index) => { + const { dataIndex, customRender } = col; + if (!dataIndex) return; + + let value = record[dataIndex]; + + if (customRender) { + try { + const renderResult = customRender({ + text: value, + record, + index: + currentRow - startRow - (title ? 1 : 0) - (showHeader ? 1 : 0) + }); + value = + renderResult !== undefined + ? normalizeExportValue(renderResult) + : value; + } catch { + // customRender 执行失败,使用原始值 + } + } + + if (value === null || value === undefined || value === '') { + value = '-'; + } + + const cell = row.getCell(index + 1); + cell.value = value; + cell.style = dataStyle; + }); + currentRow++; + }); + + return currentRow; + }; + + for (const sheet of sheets) { + const { + columns, + dataSource, + tbtitle, + tbsub, + sheetName, + appendTables = [] + } = sheet as { + sheetName: string; + columns: ExportColumn[]; + dataSource: any[]; + tbtitle?: string; + tbsub?: string; + appendTables?: ExportAppendTableConfig[]; + }; + + // 添加 sheet + const worksheet = workbook.addWorksheet(sheetName || 'Sheet1', { + properties: { tabColor: { argb: 'FFC0000' } } + }); + + setWorksheetColumns(worksheet, [ + columns, + ...appendTables.map(table => table.columns) + ]); + + let currentRow = writeTableBlock({ + worksheet, + columns, + dataSource, + startRow: 1, + title: tbtitle, + subTitle: tbsub, + freezeHeader: true + }); + + appendTables.forEach(table => { + currentRow = writeTableBlock({ + worksheet, + columns: table.columns, + dataSource: table.data, + startRow: currentRow, + showHeader: false + }); + }); + } + + // 生成 Excel 文件并下载 + workbook.xlsx + .writeBuffer() + .then(buffer => { + const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }); + + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${filename}.xlsx`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + callback?.(true); + }) + .catch(error => { + console.error('导出 Excel 失败:', error); + callback?.(false); + }); + } catch (error) { + console.error('导出 Excel 失败:', error); + callback?.(false); + } +} + +/** + * 获取列的真实标题(支持函数类型) + */ +function resolveColumnTitle(col: ExportColumn): string | null { + const title = col.title; + if (typeof title === 'function') { + try { + const result = title(); + // 如果函数返回的是字符串,使用它 + if (typeof result === 'string') return result; + // 如果返回的是 VNode 或其他类型,无法导出标题 + return null; + } catch { + return null; + } + } + if (typeof title === 'string') return title; + return null; +} + +function resolveExportColumns(columns: ExportColumn[]): ExportColumn[] { + const exportColumns: ExportColumn[] = []; + for (const col of columns) { + if (!col.dataIndex || col.dataIndex === 'action' || col.excludeFromExport) { + continue; + } + const resolvedTitle = resolveColumnTitle(col); + if (!resolvedTitle) continue; + + exportColumns.push({ + ...col, + title: resolvedTitle + }); + } + + return exportColumns; +} + +/** + * 获取嵌套属性值 + */ +function getNestedValue(obj: any, path: string): any { + if (!path || !path.includes('.')) return obj?.[path]; + return path.split('.').reduce((current, key) => current?.[key], obj); +} + +/** + * 导出表格数据为 Excel 文件 + */ +export function exportTable({ + data, + columns, + fileName = '导出数据', + tbtitle, + tbsub, + callback, + appendTables = [] +}: ExportParams) { + if (!data || data.length === 0) { + callback?.('没有可导出的数据'); + return; + } + + const exportColumns = resolveExportColumns(columns); + const sheets = [ + { + sheetName: fileName, + columns: exportColumns, + dataSource: data, + tbtitle, + tbsub, + appendTables: appendTables + .filter(table => Array.isArray(table.data) && table.data.length > 0) + .map(table => ({ + data: table.data, + columns: resolveExportColumns(table.columns) + })) + } + ]; + + downloadExcel({ + filename: fileName, + sheets, + callback + }); +} diff --git a/frontend-sjgl/src/utils/filter.ts b/frontend-sjgl/src/utils/filter.ts new file mode 100644 index 00000000..38c28bc2 --- /dev/null +++ b/frontend-sjgl/src/utils/filter.ts @@ -0,0 +1,80 @@ +/** + * Show plural label if time is plural number + * @param {number} time + * @param {string} label + * @return {string} + */ +function pluralize(time: number, label: string) { + if (time === 1) { + return time + label; + } + return time + label + 's'; +} + +/** + * @param {number} time + */ +export function timeAgo(time: number) { + const between = Date.now() / 1000 - Number(time); + if (between < 3600) { + return pluralize(~~(between / 60), ' minute'); + } else if (between < 86400) { + return pluralize(~~(between / 3600), ' hour'); + } else { + return pluralize(~~(between / 86400), ' day'); + } +} + +/** + * Number formatting + * like 10000 => 10k + * @param {number} num + * @param {number} digits + */ +export function numberFormatter(num: number, digits: number) { + const si = [ + { value: 1e18, symbol: 'E' }, + { value: 1e15, symbol: 'P' }, + { value: 1e12, symbol: 'T' }, + { value: 1e9, symbol: 'G' }, + { value: 1e6, symbol: 'M' }, + { value: 1e3, symbol: 'k' } + ]; + for (let i = 0; i < si.length; i++) { + if (num >= si[i].value) { + return ( + (num / si[i].value) + .toFixed(digits) + .replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol + ); + } + } + return num.toString(); +} + +/** + * 10000 => "10,000" + * @param {number} num + */ +export function toThousandFilter(num: number) { + return (+num || 0) + .toString() + .replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ',')); +} + +/** + * Upper case first char + * @param {String} string + */ +export function uppercaseFirst(string: string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +/** + * 金额转换(分->元) + * 100 => 1 + * @param {number} num + */ +export function moneyFormatter(num: number) { + return '¥' + (isNaN(num) ? 0.0 : parseFloat((num / 100).toFixed(2))); +} diff --git a/frontend-sjgl/src/utils/i18n.ts b/frontend-sjgl/src/utils/i18n.ts new file mode 100644 index 00000000..b95552a0 --- /dev/null +++ b/frontend-sjgl/src/utils/i18n.ts @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview +import i18n from '@/lang/index'; + +export function generateTitle(title: any) { + // 判断是否存在国际化配置,如果没有原生返回 + const hasKey = i18n.global.te('route.' + title); + if (hasKey) { + const translatedTitle = i18n.global.t('route.' + title); + return translatedTitle; + } + return title; +} diff --git a/frontend-sjgl/src/utils/index.ts b/frontend-sjgl/src/utils/index.ts new file mode 100644 index 00000000..5d26a02b --- /dev/null +++ b/frontend-sjgl/src/utils/index.ts @@ -0,0 +1,202 @@ +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele: HTMLElement, cls: string) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele: HTMLElement, cls: string) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele: HTMLElement, cls: string) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); + ele.className = ele.className.replace(reg, ' '); + } +} + +export function mix(color1: string, color2: string, weight: number) { + weight = Math.max(Math.min(Number(weight), 1), 0); + const r1 = parseInt(color1.substring(1, 3), 16); + const g1 = parseInt(color1.substring(3, 5), 16); + const b1 = parseInt(color1.substring(5, 7), 16); + const r2 = parseInt(color2.substring(1, 3), 16); + const g2 = parseInt(color2.substring(3, 5), 16); + const b2 = parseInt(color2.substring(5, 7), 16); + const r = Math.round(r1 * (1 - weight) + r2 * weight); + const g = Math.round(g1 * (1 - weight) + g2 * weight); + const b = Math.round(b1 * (1 - weight) + b2 * weight); + const rStr = ('0' + (r || 0).toString(16)).slice(-2); + const gStr = ('0' + (g || 0).toString(16)).slice(-2); + const bStr = ('0' + (b || 0).toString(16)).slice(-2); + return '#' + rStr + gStr + bStr; +} + +export function parseTime(time: any, cFormat: any) { + if (arguments.length === 0) { + return null; + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'; + let date; + if (typeof time === 'undefined' || time === null || time === 'null') { + return ''; + } else if (typeof time === 'object') { + date = time; + } else { + if (typeof time === 'string' && /^[0-9]+$/.test(time)) { + time = parseInt(time); + } + if (typeof time === 'number' && time.toString().length === 10) { + time = time * 1000; + } + date = new Date(time); + } + const formatObj: any = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + }; + const time_str = format.replace( + /{(y|m|d|h|i|s|a)+}/g, + (result: any, key: any) => { + let value: any = formatObj[key]; + if (key === 'a') { + return ['日', '一', '二', '三', '四', '五', '六'][value]; + } + if (result.length > 0 && value < 10) { + value = '0' + value; + } + return value || 0; + } + ); + return time_str; +} +export function downloadFile(obj: any, name: any, suffix: any) { + try { + const url = window.URL.createObjectURL(new Blob([obj])); + const link = document.createElement('a'); + link.style.display = 'none'; + link.href = url; + + // 优化文件名生成逻辑,避免多余的中横线 + const timeStamp = parseTime(new Date(), '{y}{m}{d}{h}{i}{s}') || ''; + const separator = timeStamp ? '-' : ''; + const fileName = `${timeStamp}${separator}${name}.${suffix}`; + + link.setAttribute('download', fileName); + document.body.appendChild(link); + link.click(); + + // 延迟移除,确保下载触发 + setTimeout(() => { + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + }, 100); + } catch (error) { + console.error('Download failed:', error); + } +} +/** + * 通过 URL 下载文件 + * @param url 文件地址 + * @param fileName 文件名(可选,如果不传则尝试从 URL 解析或使用默认名) + */ +export function downloadFileByUrl(url: string, fileName?: string) { + if (!url) return; + + // 如果没有提供文件名,尝试从 URL 中提取 + let name = fileName; + if (!name) { + const urlParts = url.split('/'); + name = urlParts[urlParts.length - 1] || 'download_file'; + // 去除查询参数 + name = name.split('?')[0]; + } + + // 方法 1: 使用 fetch 获取 Blob (推荐,可重命名且强制下载) + // 注意:如果 URL 跨域且服务器未配置 CORS,fetch 会失败 + fetch(url) + .then(response => { + if (!response.ok) throw new Error('Network response was not ok'); + return response.blob(); + }) + .then(blob => { + const blobUrl = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.style.display = 'none'; + link.href = blobUrl; + link.setAttribute('download', name); + document.body.appendChild(link); + link.click(); + + // 清理 + setTimeout(() => { + document.body.removeChild(link); + window.URL.revokeObjectURL(blobUrl); + }, 100); + }) + .catch(error => { + console.warn( + 'Fetch download failed (possibly CORS), falling back to direct link:', + error + ); + + // 方法 2: 回退方案 - 直接使用 a 标签跳转 + // 这种方式对于 PDF/图片等浏览器支持预览的文件,可能会直接在新标签页打开而不是下载 + const link = document.createElement('a'); + link.href = url; + link.target = '_blank'; + // 如果同源,download 属性生效;如果跨域,大多数浏览器会忽略 download 属性并直接打开 + if (fileName) { + link.setAttribute('download', fileName); + } + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }); +} +const modules = import.meta.glob('@/assets/legend/*.{svg,png}', { + eager: true +}); +// 图例图标映射 +export const iconMap: Record = {}; +Object.entries(modules).forEach(([path, module]) => { + const fileName = path.match(/\/([^/]+)\.(svg|png)$/)?.[1]; + if (fileName) { + iconMap[fileName] = (module as any).default; + } +}); +// 获取图标路径 +export const getIconPath = (icon: string): string => { + return iconMap[icon] || ''; +}; + +// 动态计算表格滚动高度 +export const calcTableScrollY = (tableContainerRef: any, otherHeight = 112) => { + if (!tableContainerRef) return; + // 获取容器高度 + const containerHeight = tableContainerRef.clientHeight; + // 估算表头(约 55px) + 分页器(约 64px) + 上下内边距容差(10px) = 约 130px + // 如果你有筛选栏等,需要额外减去 + const height = otherHeight || 112; + const y = containerHeight - height; + return y > 0 ? y : undefined; +}; diff --git a/frontend-sjgl/src/utils/localStorage.ts b/frontend-sjgl/src/utils/localStorage.ts new file mode 100644 index 00000000..0ff3a798 --- /dev/null +++ b/frontend-sjgl/src/utils/localStorage.ts @@ -0,0 +1,44 @@ +/** + * window.localStorage 浏览器永久缓存 + */ +export const localStorage = { + // 设置永久缓存 + set(key: string, val: any) { + window.localStorage.setItem(key, JSON.stringify(val)); + }, + // 获取永久缓存 + get(key: string) { + const json: any = window.localStorage.getItem(key); + return JSON.parse(json); + }, + // 移除永久缓存 + remove(key: string) { + window.localStorage.removeItem(key); + }, + // 移除全部永久缓存 + clear() { + window.localStorage.clear(); + } +}; + +// 布局大小 +const SizeKey = 'size'; + +export function getSize() { + return localStorage.get(SizeKey); +} + +export function setSize(size: string) { + localStorage.set(SizeKey, size); +} + +// 语言 +const LanguageKey = 'language'; + +export function getLanguage() { + return localStorage.get(LanguageKey); +} + +export function setLanguage(language: string) { + localStorage.set(LanguageKey, language); +} diff --git a/frontend-sjgl/src/utils/popupHtmlGenerator.ts b/frontend-sjgl/src/utils/popupHtmlGenerator.ts new file mode 100644 index 00000000..a85bfc8b --- /dev/null +++ b/frontend-sjgl/src/utils/popupHtmlGenerator.ts @@ -0,0 +1,3618 @@ +// Popup HTML 生成器 - 从 IconDiv 组件提取的渲染逻辑 +// 用于在 map.ol.ts 中直接生成 HTML 字符串,避免 Vue 组件渲染导致的性能问题 +/* 1. window.__lyConfigs 不知道是干什么的 +2. 生态流量泄放设施 泄洪设施 猴子岩是 7 eqtpList 里面没有7 + */ +const isNil = (val: any) => val == null; + +/** + * 根据数值大小动态保留小数位数 + * - 个位数(0-9):保留两位小数 + * - 两位数(10-99):保留一位小数 + * - 三位及以上(100+):不保留小数(四舍五入) + * @param val - 数值 + * @returns 格式化后的字符串 + */ +const formatNumber = (val: number | string | null | undefined): string => { + if (val == null || val === '') return '-'; + const num = Number(val); + if (isNaN(num)) return '-'; + + const absNum = Math.abs(num); + if (absNum < 10) { + return num.toFixed(2); + } else if (absNum < 100) { + return num.toFixed(1); + } else { + return Math.round(num).toString(); + } +}; + +const transUnitRender = (val: any, type: string, code: string) => { + if (val == null) return '-'; + return val; +}; + +const transUnit = (val: any, type: string, code: string) => { + if (val == null) return '-'; + return val; +}; + +const formatToOneDecimal = (val: any): string => { + if (val == null) return '-'; + const num = Number(val); + if (isNaN(num)) return '-'; + return (Math.round(num * 10) / 10).toFixed(1); +}; + +const getUnitConfigByCode = (type: string, code: string) => { + const units: Record = { + ZJRL: 'MW', + FDLYKW: '亿kW・h', + QI: 'm³/s', + QO: 'm³/s', + QECLIMIT: 'm³/s', + INTEMP: '℃', + OUTTEMP: '℃', + WTMP: '℃', + WEI: '尾' + }; + return { unit: units[code] || '' }; +}; + +const dwtpList: Record = { + DW_1: '多层式进水口', + DW_2: '叠梁门式进水口', + DW_3: '翻板门式进水口', + DW_4: '套筒式进水口', + DW_5: '前置挡墙', + DW_6: '隔水幕墙', + DW_9: '其他设施' +}; + +const fptpList: Record = { + FP_1: '鱼道', + FP_2: '仿自然通道', + FP_3: '集运鱼系统', + FP_4: '升鱼机', + FP_5: '其它过鱼方式' +}; + +const eqtpList: Record = { + '1': '生态放流孔', + '2': '生态放流闸', + '3': '生态放流洞', + '4': '生态放流管', + '5': '基荷发电', + '6': '生态机组' +}; + +const locationList: Record = { + '1': '库尾', + '2': '库中', + '3': '坝前', + '4': '坝下' +}; + +const allYs = [ + 'CHLA', + 'CL', + 'CLARITY', + 'CODCR', + 'CODMN', + 'COND', + 'CYANO', + 'DOX', + 'FCG', + 'FID', + 'LAS', + 'NH3N', + 'NO3', + 'PH', + 'S2', + 'SE', + 'TN', + 'TP', + 'TU', + 'WTMP', + 'ZN' +]; + +const app = + (typeof window !== 'undefined' ? (window as any).__appCode : undefined) || + 'hbb'; +const env = + (typeof window !== 'undefined' ? (window as any).__env__ : undefined) || ''; +const themecc_list = [ + { + fieldName: 'MZGJDDZSL', + name: '闽浙赣基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GHDZSL', + name: '规划', + nameEn: '', + color: '#96B0B5', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SJNFDL', + name: '年发电量', + nameEn: '', + color: '', + unit: '亿kw·h', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWZCBSSJ', + name: '未正常报送数据', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ARS', + name: '砷', + nameEn: 'ARS', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00006', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SYMJ', + name: '水域面积', + nameEn: '', + color: '', + unit: 'km2', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWZCYX', + name: '未正常运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'WTMP', + name: '水温', + nameEn: '', + color: '#01B5B9', + unit: '℃', + theme: '', + decpos: '6', + mn: '0', + mx: '25', + norm: '18', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DBJDDZSL', + name: '东北基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSDDSJYQ', + name: '达到设计要求', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YJDZZJRL', + name: '已建', + nameEn: '', + color: '#78C300', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'OIL', + name: '石油类', + nameEn: 'OIL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'FCG', + name: '粪大肠菌群', + nameEn: 'FCG', + color: '', + unit: '个/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅰ', + name: 'I', + nameEn: '', + color: '#13ADE6', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DOX', + name: '溶解氧', + nameEn: 'DO', + color: '#9A60B4', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '1', + mx: '15', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HHSYJDDZSL', + name: '黄河上游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DDHJDDZSL', + name: 'ddh基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSZCYX', + name: '正常运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZN', + name: '锌', + nameEn: 'ZN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NPJJDDZSL', + name: '南盘江&红水河基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLNONE', + name: '无数据', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'LAS', + name: '阴离子表面活性剂', + nameEn: 'LAS', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅳ', + name: 'IV', + nameEn: '', + color: '#FF8800', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BXSW', + name: '坝下水位', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSBDB', + name: '不达标', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CJSYJDDZSL', + name: '长江上游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: '劣Ⅴ', + name: '劣V', + nameEn: '', + color: '#D9001B', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CKLL', + name: '出库流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TP', + name: '总磷', + nameEn: 'TP', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLXZ', + name: '生态流量限值', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'FE', + name: '铁', + nameEn: 'FE', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.03', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXQT', + name: '其它', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SJZJRL', + name: '装机容量', + nameEn: '', + color: '', + unit: 'MW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TN', + name: '总氮', + nameEn: 'TN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.05', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'TU', + name: '浊度', + nameEn: 'TU', + color: '#91CC75', + unit: 'NTU', + theme: '', + decpos: '1', + mn: '0.1', + mx: '5000', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSSJWJR', + name: '数据未接入', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NJJDDZSL', + name: '怒江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'PB', + name: '铅', + nameEn: 'PB', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BOD5', + name: '五日生化需氧量', + nameEn: 'BOD?', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '2', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'S2', + name: '硫化物', + nameEn: 'S2', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.004', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'pH', + name: 'pH', + nameEn: 'pH', + color: '#73C1DF', + unit: '', + theme: '', + decpos: '1', + mn: '6', + mx: '10', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_90AND95', + name: '90%-95%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '90', + mx: '95', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SE', + name: '硒', + nameEn: 'SE', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00025', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CL', + name: '氯化物', + nameEn: 'CL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SO4', + name: '硫酸盐', + nameEn: 'SO?', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.4', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWSJ', + name: '无数据', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'WJJDDZSL', + name: '乌江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HHZYJDDZSL', + name: '黄河中游基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅴ', + name: 'V', + nameEn: '', + color: '#E55555', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_XY80', + name: '<80%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '80', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSAYQYX', + name: '按要求运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLL', + name: '生态流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CN', + name: '氰化物', + nameEn: 'CN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.002', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'COND', + name: '电导率', + nameEn: 'COND', + color: '#C7C402', + unit: 'uS/cm', + theme: '', + decpos: '1', + mn: '300', + mx: '500', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSXYH', + name: '需优化', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'THRD', + name: '总硬度', + nameEn: 'THRD', + color: '', + unit: 'mmol/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWYX', + name: '未运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'BSSW', + name: '坝上水位', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CU', + name: '铜', + nameEn: 'CU', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.001', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅱ', + name: 'II', + nameEn: '', + color: '#4FC64D', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSWAYQYX', + name: '未按要求运行', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'F', + name: '氟化物', + nameEn: 'F', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YLJJDDZSL', + name: 'ylj基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CD', + name: '镉', + nameEn: 'CD', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.001', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CODCR', + name: '化学需氧量', + nameEn: 'CODcr', + color: '#02B2FF', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0', + mx: '50', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'YJDZSL', + name: '已建', + nameEn: '', + color: '#78C300', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'HG', + name: '汞', + nameEn: 'HG', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00005', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QTJDDZSL', + name: '其他基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NH3N', + name: '氨氮', + nameEn: '', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'NO3', + name: '硝氮/硝酸盐氮', + nameEn: 'NO3', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.02', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CODMN', + name: '高锰酸盐指数', + nameEn: 'CODMN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.5', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZJDZZJRL', + name: '在建', + nameEn: '', + color: '#669ECF', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'MN', + name: '锰', + nameEn: 'MN', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.01', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'JSJJDDZSL', + name: '金沙江基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'STLLWYQ', + name: '无要求', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_DY95', + name: '≥95%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '95', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'XXJDDZSL', + name: '湘西基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXDB', + name: '达标', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CLARITY', + name: '透明度', + nameEn: 'CLARITY', + color: '', + unit: 'mm', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GC', + name: '高程', + nameEn: '', + color: '', + unit: 'm', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CR6', + name: '铬(六价)', + nameEn: 'CR6', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.004', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'GHDZZJRL', + name: '规划', + nameEn: '', + color: '#96B0B5', + unit: '万kW', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'RKLL', + name: '入库流量', + nameEn: '', + color: '', + unit: 'm3/s', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'ZJDZSL', + name: '在建', + nameEn: '', + color: '#669ECF', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'QEC_STLL_80AND90', + name: '80%-90%', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '', + mn: '80', + mx: '90', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CYANO', + name: '蓝绿藻', + nameEn: 'CYANO', + color: '', + unit: '个/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'CHLA', + name: '叶绿素a', + nameEn: 'CHLA', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'SSYXZ', + name: '运行中', + nameEn: '', + color: '', + unit: '个', + theme: '', + decpos: '', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'VLPH', + name: '挥发酚', + nameEn: 'VLPH', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.002', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'AL', + name: '铝', + nameEn: 'AL', + color: '', + unit: 'mg/L', + theme: '', + decpos: '1', + mn: '0.00231', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'Ⅲ', + name: 'III', + nameEn: '', + color: '#FFCC00', + unit: '', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'LCJGLJDDZSL', + name: '澜沧江干流基地', + nameEn: '', + color: '', + unit: '座', + theme: '', + decpos: '1', + mn: '', + mx: '', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + }, + { + fieldName: 'DO', + name: '溶解氧', + nameEn: 'DO', + color: '', + unit: 'mg/L', + theme: '', + decpos: '2', + mn: '1', + mx: '15', + norm: '', + enabled: '', + remark: '', + orderIndex: '', + createUser: '', + createTime: null, + updateUser: '', + updateTime: null, + filterContent: '', + tenantId: '', + isDeleted: '', + deleteUser: '', + deleteTime: null, + systemId: '' + } +]; +const getThemee = (fieldName?: string) => { + const themeecList = themecc_list; + let getitem: any = {}; + if (fieldName && themeecList.length > 0) { + const getitemList = themeecList.filter( + (i: any) => i.fieldName.toUpperCase() == fieldName.toUpperCase() + ); + if (getitemList.length > 0) { + getitem = getitemList[0]; + } + } + return getitem; +}; + +const getImageUrl = (logo: string) => { + if (!logo) return ''; + const token = (typeof window !== 'undefined' && + (window as any).Session?.getToken?.()) || { accessToken: '' }; + const fsAddress = + (typeof window !== 'undefined' && (window as any).__fsAddress) || ''; + return `${fsAddress}?${logo}&view=jpg&token=${token.accessToken}`; +}; + +const getStatusHtml = (props: any) => { + const { dtin, stdSstate, stdSstateName, dtinName, lcjStatus, lcjStatusName } = + props; + const _dtin = `${dtin}`; + const baseId = '02'; + const _stdSstate = lcjStatus; + const _stdSstateName = lcjStatusName; + + if (_dtin == '0') { + return `${dtinName || '未接入'}`; + } else if (_dtin == '1' && _stdSstate == '1') { + return `${ + _stdSstateName || '正常运行' + }`; + } else if (_dtin == '1' && _stdSstate == '3') { + return `${ + _stdSstateName || '未正常运行' + }`; + } + return `${_stdSstateName || '最近1年无数据'}`; +}; + +const getLimitSpanHtml = (minVal: any, maxVal: any) => { + if (!isNil(maxVal) && !isNil(minVal)) { + return `(${minVal}~${maxVal})`; + } else if (!isNil(maxVal)) { + return `(≤${maxVal})`; + } else if (!isNil(minVal)) { + return `(≥${minVal})`; + } + return ''; +}; + +const needNotShow = (minVal: any, maxVal: any, val: any) => { + const _min = isNil(minVal) ? null : Number(minVal); + const _max = isNil(maxVal) ? null : Number(maxVal); + const _val = isNil(val) ? null : Number(val); + if (isNil(_val)) return true; + if (!isNil(_max) && !isNil(_min)) return _val >= _min && _val <= _max; + if (!isNil(_max)) return _val <= _max; + if (!isNil(_min)) return _val >= _min; + return true; +}; + +const getYsListHtml = (props: any) => { + let html = ''; + allYs.forEach((ys: any) => { + const _ys = ys.toLowerCase(); + const val = props[_ys]; + const ystheme = getThemee(ys); + const ysUpper = ys.toUpperCase(); + + let minVal, maxVal; + const ysLimit = props; + + if (ysLimit?.min) { + if (typeof ysLimit.min === 'string') { + const minArr = JSON.parse(ysLimit.min); + const found = minArr.find( + (el: any) => el?.[ysUpper] !== null && el?.[ysUpper] !== undefined + ); + minVal = found?.[ysUpper]; + } else { + const found = ysLimit.min.find( + (el: any) => el?.[ysUpper] !== null && el?.[ysUpper] !== undefined + ); + minVal = found?.[ysUpper]; + } + } + + if (ysLimit?.max) { + if (typeof ysLimit.max === 'string') { + const maxArr = JSON.parse(ysLimit.max); + const found = maxArr.find( + (el: any) => el?.[ysUpper] !== null && el?.[ysUpper] !== undefined + ); + maxVal = found?.[ysUpper]; + } else { + const found = ysLimit.max.find( + (el: any) => el?.[ysUpper] !== null && el?.[ysUpper] !== undefined + ); + maxVal = found?.[ysUpper]; + } + } + + if (!needNotShow(minVal, maxVal, val)) { + const unit = + ysUpper === 'PH' + ? '' + : getUnitConfigByCode('WQ_R', ysUpper)?.unit || ystheme?.unit || ''; + html += ` +
  • +
    ${ystheme?.name}:
    + + ${val} ${unit} + ${getLimitSpanHtml(minVal, maxVal)} + +
  • + `; + } + }); + return html; +}; + +const getStateClass = (props: any) => { + let setclass = ''; + if (props?.anchoPointState) { + if ( + props.anchoPointState.includes('large_eng') || + props.anchoPointState.includes('eef_1') + ) { + setclass = 'large_eng'; + } else if ( + props.anchoPointState.includes('mid_eng') || + props.anchoPointState.includes('eef_2') + ) { + setclass = 'mid_eng'; + } else { + setclass = 'large_eng'; + } + } else { + setclass = 'large_eng'; + } + if (props?.ennm && props.ennm.length > 3) { + setclass += ' smallfont'; + } + if ( + props?.ttpwr && + `${transUnitRender(props.ttpwr, 'Other', 'ZJRL')}`.length > 4 + ) { + setclass += ' leftsmallfont'; + } + if ( + (props?.yrge && + `${transUnitRender(props.yrge, 'Other', 'FDLYKW')}`.length > 4) || + (props?.limit && `${props.limit}`.length > 4) + ) { + setclass += ' rightsmallfont'; + } + return setclass; +}; + +/** + * 根据文字长度获取标题 class + * @param title - 标题文字 + * @returns class 字符串 + */ +const getTitleClass = (title: string) => { + if (!title) return ''; + const len = title.length; + if (len > 6) return 'title-xxs'; // 7个字及以上 + if (len > 5) return 'title-xs'; // 6个字 + if (len > 4) return 'title-sm'; // 5个字 + if (len > 3) return 'title-md'; // 4个字 + return ''; // 3个字及以下,使用默认大小 +}; + +const timegj = [ + new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000) + .toISOString() + .slice(5, 10), + new Date().toISOString().slice(5, 10) +]; + +/** + * 生成 Popup HTML 字符串 + * @param props - 锚点数据对象 + * @returns HTML 字符串 + */ +export function generatePopupHtml( + props: any, + options?: { + forceEng2?: boolean; + } +): string { + const p = props; + const dzFdl = getUnitConfigByCode('Other', 'FDLYKW')?.unit; + const dzZjrl = getUnitConfigByCode('Other', 'ZJRL')?.unit; + const title = p?.ennm || p?.stnm; + const titleClass = getTitleClass(title); + let newsttpMap = p.sttpMap; + if (options?.forceEng2) { + newsttpMap = 'eng2'; + } + let html = ''; + + switch (newsttpMap) { + case 'ENG': + html = ` +
    +
    ${title}
    +
    +
    +
    ${transUnitRender(p?.ttpwr, 'Other', 'ZJRL')}
    +
    ${dzZjrl || '万kW'}
    +
    +
    +
    ${transUnitRender(p?.yrge, 'Other', 'FDLYKW')}
    +
    ${ + dzFdl || `亿kW・h` + }
    +
    +
    +
    + `; + break; + + case 'eng1': + if ( + p?.anchoPointState == 'eef_1_none' || + p?.anchoPointState == 'eef_2_none' + ) { + html = ` +
    +
    ${p?.ennm || p?.stnm}
    +
    暂无数据
    +
    + `; + } else { + html = ` +
    +
    ${p?.ennm || p?.stnm}
    +
    +
    ${transUnitRender( + p?.ttpwr, + 'Other', + 'ZJRL' + )}
    +
    ${p?.limit}
    +
    +
    + `; + } + break; + + case 'eng2': { + let lastTmEngEqDataVo: any = {}; + if (typeof p?.lastTmEngEqDataVo == 'string') { + lastTmEngEqDataVo = JSON.parse(p.lastTmEngEqDataVo); + } else { + lastTmEngEqDataVo = p.lastTmEngEqDataVo; + } + // if (!lastTmEngEqDataVo?.qo && !lastTmEngEqDataVo?.qi) return ''; + + const qecLimitVal = lastTmEngEqDataVo?.qecLimit; + let qecLimitDisplay = '-'; + if (qecLimitVal == 0 || qecLimitVal == null) { + // qecLimitDisplay = app == 'hbb' ? '-' : '无生态流量要求'; + qecLimitDisplay = '无生态流量要求'; + } else { + qecLimitDisplay = `${transUnitRender( + qecLimitVal, + 'HYDROPW_R', + 'QECLIMIT' + )} ${getUnitConfigByCode('HYDROPW_R', 'QECLIMIT')?.unit}`; + } + + const vlsrHtml = lastTmEngEqDataVo?.vlsr + ? `
  • 限值来源:${lastTmEngEqDataVo?.vlsr}
  • ` + : ''; + + html = ` +
    +
    +
    ${p?.ennm || p?.stnm}
    +
    ${lastTmEngEqDataVo?.tm ?? ''}
    +
      + +
    • +
      入库流量:
      +
      + ${transUnitRender( + formatNumber(lastTmEngEqDataVo?.qi), + 'HYDROPW_R', + 'QI' + )} ${getUnitConfigByCode('HYDROPW_R', 'QI')?.unit} +
      +
    • +
    • +
      出库流量:
      +
      + ${transUnitRender( + lastTmEngEqDataVo?.qo, + 'HYDROPW_R', + 'QO' + )} ${getUnitConfigByCode('HYDROPW_R', 'QO')?.unit} +
      +
    • +
    • +
      生态流量限值:
      +
      ${qecLimitDisplay}
      +
    • + ${vlsrHtml} +
    +
    +
    + `; + break; + } + + case 'eng3': + html = ` +
    +
    +
    ${p?.ennm || p?.stnm}
    +
    ${p?.tm ?? ''}
    +
      +
    • +
      入库水温:
      +
      + ${transUnitRender(p?.inTemp, 'WTRV_R', 'INTEMP') ?? '-'} ${ + getUnitConfigByCode('WTRV_R', 'INTEMP')?.unit + } +
      +
    • +
    • +
      出库水温:
      +
      + ${transUnitRender(p?.outTemp, 'WTRV_R', 'OUTTEMP') ?? '-'} ${ + getUnitConfigByCode('WTRV_R', 'OUTTEMP')?.unit + } +
      +
    • +
    +
    +
    + `; + break; + + case 'eng4': { + let devStatusHtml = '数据未接入'; + if (p?.development == '未完成') + devStatusHtml = '未完成'; + else if (p?.development == '未填报') + devStatusHtml = '未填报'; + else if (p?.development == '已完成') + devStatusHtml = '已完成'; + + const targetInfo = p.targetNum + ? `${p?.targetFtp || '-'}种/${p?.targetNum || '-'}万尾` + : '--'; + const actualInfo = p.actualNum + ? `${p?.actualFtp || '-'}种/${p?.actualNum || '-'}万尾` + : '--'; + + html = ` +
    +
    +
    ${ + p?.ennm || p?.stnm || p?.popName + }
    +
      +
    • +
      年份:
      +
      ${p?.year || '-'}
      +
    • +
    • +
      目标放流种类/数量:
      +
      ${targetInfo}
      +
    • +
    • +
      实际放流种类数量:
      +
      ${actualInfo}
      +
    • +
    • +
      工作开展情况:
      +
      ${devStatusHtml}
      +
    • +
    +
    +
    + `; + break; + } + + case 'VA': { + const hbbLi = + app == 'hbb' + ? ` +
  • +
    接入状态:
    +
    ${ + p?.dtin === 0 ? '未接入' : p?.dtin === 1 ? '已接入' : '-' + }
    +
  • + ` + : ''; + + html = ` +
    +
    +
    ${p?.stnm}
    +
      +
    • +
      建设状态:
      +
      + ${ + p?.bldsttCcode == '0' + ? '未建' + : p?.bldsttCcode == '1' + ? '在建' + : p?.bldsttCcode == '2' + ? '已建' + : '-' + } +
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm}
      +
    • + ${hbbLi} +
    +
    +
    + `; + break; + } + + case 'DW': + case 'DW_1': + case 'DW_2': + case 'DW_3': + case 'DW_4': + case 'DW_5': + case 'DW_6': + case 'DW_9': + html = ` +
    +
    +
    ${p?.stnm}
    +
      +
    • +
      设施类型:
      +
      ${ + p?.sttpMap ? dwtpList[p.sttpMap] || '-' : '-' + }
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm}
      +
    • +
    • +
      运行状态:
      +
      ${getStatusHtml(p)}
      +
    • +
    +
    +
    + `; + break; + + case 'FP': + case 'FP_1': + case 'FP_2': + case 'FP_3': + case 'FP_4': + case 'FP_5': + html = ` +
    +
    +
    ${p?.stnm}
    +
      +
    • +
      设施类型:
      +
      ${p?.dwtp ? fptpList[p.dwtp] : '-'}
      +
    • +
    • +
      建设状态:
      +
      ${ + p?.bldstt == '0' + ? '未建' + : p?.bldstt == '1' + ? '在建' + : p?.bldstt == '2' + ? '已建' + : '-' + }
      +
    • +
    • +
      运行状态:
      +
      ${getStatusHtml(p)}
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm}
      +
    • +
    +
    +
    + `; + break; + + case 'FB': + html = ` +
    +
    +
    ${p?.stnm}
    +
      +
    • +
      建设状态:
      +
      ${ + p?.bldstt == '0' + ? '未建' + : p?.bldstt == '1' + ? '在建' + : p?.bldstt == '2' + ? '已建' + : '-' + }
      +
    • +
    • +
      运行状态:
      +
      ${getStatusHtml(p)}
      +
    • +
    • +
      服务电站:
      +
      ${p?.ennm}
      +
    • +
    +
    +
    + `; + break; + + case 'EQ': + html = ` +
    +
    +
    ${p?.ennm || p?.stnm}
    +
      +
    • +
      设施类型:
      +
      ${p?.eqtp ? eqtpList[p.eqtp] : '-'}
      +
    • +
    • +
      生态流量限值:
      +
      ${p?.qecLimit || '-'}
      +
    • +
    +
    +
    + `; + break; + + case 'WT': { + let wtvtInfo: any = {}; + if (typeof p?.wtvtInfo == 'string') { + wtvtInfo = JSON.parse(p.wtvtInfo); + } else { + wtvtInfo = p.wtvtInfo; + } + const tt = p?.deviceType == '1' ? '水深' : '高程'; + const sizeClass = p.enfc === 0 ? 'small' : 'middle'; + + if (p.enfc === 0) { + html = ` +
    +
    +
    ${p?.stnm ?? '-'}
    +
    ${p?.tm ?? ''}
    +
      +
    • +
      水温:
      +
      + ${transUnit(p?.temperature, 'WQ_R', 'WTMP') ?? '-'} + ${getUnitConfigByCode('WQ_R', 'WTMP')?.unit} +
      +
    • +
    +
    +
    + `; + } else { + html = ` +
    +
    +
    ${p?.stnm}
    +
    ${wtvtInfo?.tm ?? ''}
    +
      +
    • +
      + ${tt} ${ + transUnit(wtvtInfo?.minWthg, 'WQ_R', 'WTMP') || '-' + }m: +
      +
      + ${formatToOneDecimal(wtvtInfo?.minWthgWt)} + ${getUnitConfigByCode('WQ_R', 'WTMP')?.unit} +
      +
    • +
    • +
      平均水温:
      +
      + ${formatToOneDecimal(wtvtInfo?.avgWt)} + ${getUnitConfigByCode('WQ_R', 'WTMP')?.unit} +
      +
    • +
    • +
      + ${tt} ${ + transUnit(wtvtInfo?.maxWthg, 'WQ_R', 'WTMP') || '-' + }m: +
      +
      + ${formatToOneDecimal(wtvtInfo?.maxWthgWt)} + ${getUnitConfigByCode('WQ_R', 'WTMP')?.unit} +
      +
    • +
    +
    +
    + `; + } + break; + } + + case 'FH': { + html = ` +
    +
    +
    ${p?.stnm}
    +
      +
    • +
      所在河流:
      +
      ${p?.rvcdName || '-'}
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm || '-'}
      +
    • +
    +
    +
    + `; + break; + } + + case 'WQFB': + case 'WQ': { + const wqGrdTheme = getThemee(p.wqGrdName); + const wwqtgTheme = getThemee(p.wwqtgName); + + html = ` +
    +
    +
    ${p.stnm}
    +
      +
    • +
      监测时间:
      +
      ${p?.tm ?? '-'}
      +
    • +
    • +
      水质等级:
      +
      + ${ + wqGrdTheme?.name ?? '-' + }类 + (目标等级 ${ + wwqtgTheme?.name ?? '-' + }类) +
      +
    • +
    +
      + ${getYsListHtml(p)} +
    +
    +
    + `; + break; + } + + case 'WE': { + const mergedFishList: any[] = []; + const fishList = + typeof p.fishList === 'string' ? JSON.parse(p.fishList) : p.fishList; + fishList?.forEach((item: any) => { + const existingItem = mergedFishList.find( + (mergedItem: any) => mergedItem.fishName === item.fishName + ); + if (existingItem) { + existingItem.count += item.count; + } else { + mergedFishList.push({ ...item }); + } + }); + + let fishItemsHtml = ''; + if (mergedFishList.length > 0) { + mergedFishList.slice(0, 3).forEach((item: any) => { + fishItemsHtml += ` +
  • +
    ${item.fishName}:
    +
    + ${transUnitRender(item.count, 'Other', 'WEI')} + ${getUnitConfigByCode('Other', 'WEI')?.unit} +
    +
  • + `; + }); + } else { + fishItemsHtml = '
  • 暂无数据
  • '; + } + + if (mergedFishList.length > 3) { + fishItemsHtml += `
  • ...
  • `; + } + + html = ` +
    +
    +
    ${p.stnm}
    +
      +
    • +
      调查时间:
      +
      ${p?.tm ?? '-'}
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm ?? '-'}
      +
    • +
    +
    + 调查鱼类 +
    +
      + ${fishItemsHtml} +
    +
    +
    + `; + break; + } + + case 'WE_FISH': { + const fishData = + typeof p.fishList === 'string' ? JSON.parse(p.fishList) : p.fishList; + const imgUrl = getImageUrl(p.logo); + const imgHtml = p.logo + ? `` + : `
    暂无图片
    `; + + let yearsHtml = ''; + fishData?.forEach((item: any) => { + yearsHtml += ` +
    + ${item.year}:${transUnitRender(item.count, 'Other', 'WEI')} + ${getUnitConfigByCode('Other', 'WEI')?.unit} +
    + `; + }); + + html = ` +
    +
    +
    + ${imgHtml} +
    +
    ${fishData?.[0]?.fishName}
    +
    ${yearsHtml}
    +
    +
    +
    +
    + `; + break; + } + + case 'TE': { + let listItemsHtml = ''; + if (p.list?.length > 0) { + p.list.slice(0, 3).forEach((item: any) => { + listItemsHtml += ` +
  • +
    ${item.name}:
    +
    ${item.amount}k㎡
    +
  • + `; + }); + } else { + listItemsHtml = '
  • 暂无数据
  • '; + } + + html = ` +
    +
    +
    ${p.stnm}
    +
      +
    • +
      调查时间:
      +
      ${p?.tm ?? '-'}
      +
    • +
    • +
      关联电站:
      +
      ${p?.ennm ?? '-'}
      +
    • +
    +
    + 调查结果 +
    +
      + ${listItemsHtml} +
    +
    +
    + `; + break; + } + + case 'VP': + html = ` +
    +
    +
    ${p.stnm}
    +
      +
    • +
      建设状态:
      +
      ${ + p.bldsttCcode == '0' + ? '未建' + : p.bldsttCcode == '1' + ? '在建' + : p.bldsttCcode == '2' + ? '已建' + : '-' + }
      +
    • +
    • +
      关联电站:
      +
      ${p.ennm}
      +
    • +
    +
    +
    + `; + break; + + case 'ENG_ALARM': { + const sizeClass = app === 'hbb' ? 'small' : 'middle'; + const timeRange = + app == 'hbb' ? `${p?.yyyy ?? '-'}年` : `${timegj[0]}~${timegj[1]}`; + + let extraLi = ''; + if ( + env !== 'ddh' && + env !== 'ddhpro' && + app !== 'hbb' && + env !== 'ylj' && + env !== 'yljpro' + ) { + extraLi += ` +
  • +
    水位告警:
    +
    ${ + p?.zcount ?? '-' + } 次
    +
  • + `; + } + if (app !== 'hbb' && env !== 'ylj' && env !== 'yljpro') { + extraLi += ` +
  • +
    水温告警:
    +
    ${ + p?.wtCount ?? '-' + } 次
    +
  • + `; + } + + html = ` +
    +
    +
    ${p.ennm}
    +
    + 电站告警统计 +
    +
      +
    • +
      + ${app == 'hbb' ? '统计年份' : '统计时间范围'}: +
      +
      ${timeRange}
      +
    • +
    • +
      生态流量告警:
      +
      ${ + p?.stqCount ?? '-' + } 次
      +
    • +
    • +
      水质告警:
      +
      ${ + p?.wqCount ?? '-' + } 次
      +
    • + ${extraLi} +
    +
    +
    + `; + break; + } + + case 'ylfb': + html = ` +
    +
    ${p?.ftp ?? '-'}
    +
    + `; + break; + + case 'ZQ': + html = ` +
    +
    +
    ${p?.stnm + '流量站'}
    +
    ${p?.tm ?? ''}
    +
      +
    • +
      水位(m):
      +
      ${p?.z ?? '-'}
      +
    • +
    • +
      流量(m³/s):
      +
      ${p?.q ?? '-'}
      +
    • +
    • +
      流速(m/s):
      +
      ${p?.v ?? '-'}
      +
    • +
    +
    +
    + `; + break; + + case 'VD': + case 'AIVD': { + html = ` +
    +
    +
    ${ + p?.stnm?.endsWith('视频站') ? p?.stnm : p?.stnm + '视频站' + }
    +
      +
    • +
      监控内容类型:
      +
      ${ + newsttpMap == 'VD' ? p?.sttpName : p?.aiSttpName + }
      +
    • +
    • 关联电站:
      ${ + p?.ennm + }
    • +
    +
    +
    + `; + break; + } + + case 'REACH': { + const wwqtgTheme = getThemee(p?.wwqtgName); + const wqGrdTheme = getThemee(p?.wqGrdName); + html = ` +
    +
    +
    ${p?.reachname}
    +
    +
    + 水质要求
    + ${ + wwqtgTheme?.name || '-' + } 类 +
    +
    + 监测结果
    + ${ + wqGrdTheme?.name || '-' + } 类 +
    +
    +
    +
    + `; + break; + } + + case 'WT_ALARM': + html = ` +
    +
    +
    ${p?.stnm || p?.ennm}
    +
    ${p?.tm ?? ''}
    +
      +
    • +
      水温:
      +
      ${p?.wt ?? '-'} ℃
      +
    • +
    +
    +
    + `; + break; + + case 'WQ_ALARM': { + let warnItems = ''; + p.warnDataList?.forEach((item: any) => { + const theme = getThemee(item.ys); + warnItems += ` +
  • +
    ${theme.name}:
    +
    + ${item.ssz} ${getUnitConfigByCode('WQ_R', item.ys)?.unit} +
    +
  • + `; + }); + html = ` +
    +
    +
    ${p?.stnm || p?.ennm}
    +
    ${p?.warnDataList?.[0]?.tm ?? ''}
    +
      + ${warnItems} +
    +
    +
    + `; + break; + } + + case 'RZ_ALARM': + html = ` +
    +
    +
    ${p?.ennm || p?.stnm}
    +
    ${p?.tm ?? ''}
    +
      +
    • +
      水位:
      +
      ${p?.rz ?? '-'} m
      +
    • +
    +
    +
    + `; + break; + + case 'OPERAT_ALARM': + html = ` +
    +
    +
    ${p?.ennm || p?.stnm}
    +
    ${p?.dtmel ?? ''}
    +
      +
    • +
      运行情况:
      +
      ${p?.warnStateName ?? '-'}
      +
    • +
    +
    +
    + `; + break; + + case 'WVA': + case 'FD': + html = ` +
    +
    ${p.stnm}
    +
    + `; + break; + + case 'TE_ANIMALS': { + let _pic: string[] = []; + if (p.logo) { + _pic = [p] + .filter((item: any) => item.logo !== null) + .map((item: any) => item.logo?.split(',')) + .flat(); + } + const imgUrl = _pic?.[0] ? getImageUrl(_pic[0]) : ''; + const imgHtml = _pic?.[0] + ? `` + : `
    暂无图片
    `; + + html = ` +
    +
    +
    + ${imgHtml} +
    +
    +
    ${p?.name}
    +
    +
    +
    + `; + break; + } + + default: + html = ` +
    +
    ${p.ennm || p.stnm}
    +
    + `; + } + + return html ? `
    ${html}
    ` : ''; +} + +export function getNormalizedPopupSttpMap(props: any): string { + return String(props?._sttpMap || props?.sttpMap || props?.popupSttpMap || '') + .trim() + .toUpperCase(); +} + +export function isEngPopupFamily(props: any): boolean { + return getNormalizedPopupSttpMap(props).startsWith('ENG'); +} + +export function shouldPreferEng2Popup( + props: any, + options?: { + forceEng2?: boolean; + } +): boolean { + if (options?.forceEng2) { + return true; + } + + return ( + isEngPopupFamily(props) && + (!!props?.lastTmEngEqDataVo || !!props?.qecInterval) + ); +} diff --git a/frontend-sjgl/src/utils/request.ts b/frontend-sjgl/src/utils/request.ts new file mode 100644 index 00000000..e286afcf --- /dev/null +++ b/frontend-sjgl/src/utils/request.ts @@ -0,0 +1,103 @@ +import axios from 'axios'; +import { message, Modal } from 'ant-design-vue'; +import { getToken } from '@/utils/auth'; +import { useUserStoreHook } from '@/store/modules/user'; +import router from '@/router'; + +// 创建 axios 实例 +const service = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 25000, // 15秒 + headers: { 'Content-Type': 'application/json;charset=utf-8' } +}); + +// 请求拦截器 +service.interceptors.request.use( + (config: any) => { + if (!config.headers) { + throw new Error( + `Expected 'config' and 'config.headers' not to be undefined` + ); + } + config.headers.tenant_id = '2'; + if ( + config.url.includes('/dec-lygk-base-server') || + config.url.includes('/wmp-env-server') || + config.url.includes('/wmp-sys-server') || + config.url.includes('/wmp-eng-server') || + config.url.includes('/dec-modules-usm-springcloud-starter') || + config.url.includes('/wmp-swqx-server') + ) { + config.headers._appid = '974975A6-47FD-4C04-9ACD-68938D2992BD'; + config.headers._isolateid = '5b34aecb-adfb-4dfc-ad95-21505a9eb388'; + config.headers._platformid = '31e6d13f-c359-4a19-8e67-b6f868f2401b'; + config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9'; + + config.headers.authorization = + 'bearer b142d8ee-7e9d-4704-97c9-da935615bac3'; + config.baseURL = '/'; + } else { + const user = useUserStoreHook(); + if (user.Token) { + config.headers.token = getToken(); + } + } + return config; + }, + (error: any) => { + return Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (response: any) => { + const { status, msg } = response; + if (status === 200) { + if (response.data.code == 401) { + message.error(response.data.msg || '请求失败'); + setTimeout(() => { + localStorage.clear(); + window.location.href = '/login'; + }, 1000); + return; + } else if (response.data.code == 1) { + message.error(response.data.msg); + return; + } + return response.data; + } else { + // 响应数据为二进制流处理(Excel导出) + if (response.data instanceof ArrayBuffer) { + return response; + } + message.error(msg || '系统出错'); + return Promise.reject(new Error(msg || 'Error')); + } + }, + (error: any) => { + if (error.response.data) { + const { status, msg } = error.response.data; + // token 过期,重新登录 + if (status === '403') { + Modal.confirm({ + title: '提示', + content: '当前页面已失效,请重新登录', + okText: '确定', + cancelButtonProps: { disabled: false }, + onOk: () => { + localStorage.clear(); + router.push('/login'); + window.location.href = '/'; + } + }); + } else { + message.error(msg || '当前页面已失效'); + } + } + return Promise.reject(error.message); + } +); + +// 导出 axios 实例 +export default service; diff --git a/frontend-sjgl/src/utils/resize.ts b/frontend-sjgl/src/utils/resize.ts new file mode 100644 index 00000000..343bb0f3 --- /dev/null +++ b/frontend-sjgl/src/utils/resize.ts @@ -0,0 +1,73 @@ +import { ref } from 'vue'; +export default function () { + const chart = ref(); + const sidebarElm = ref(); + + const chartResizeHandler = () => { + if (chart.value) { + chart.value.resize(); + } + }; + + const sidebarResizeHandler = (e: TransitionEvent) => { + if (e.propertyName === 'width') { + chartResizeHandler(); + } + }; + + const initResizeEvent = () => { + window.addEventListener('resize', chartResizeHandler, {passive:true}); + }; + + const destroyResizeEvent = () => { + window.removeEventListener('resize', chartResizeHandler); + }; + + const initSidebarResizeEvent = () => { + sidebarElm.value = document.getElementsByClassName('sidebar-container')[0]; + if (sidebarElm.value) { + sidebarElm.value.addEventListener( + 'transitionend', + sidebarResizeHandler as EventListener, + {passive:true} + ); + } + }; + + const destroySidebarResizeEvent = () => { + if (sidebarElm.value) { + sidebarElm.value.removeEventListener( + 'transitionend', + sidebarResizeHandler as EventListener + ); + } + }; + + const mounted = () => { + initResizeEvent(); + initSidebarResizeEvent(); + }; + + const beforeDestroy = () => { + destroyResizeEvent(); + destroySidebarResizeEvent(); + }; + + const activated = () => { + initResizeEvent(); + initSidebarResizeEvent(); + }; + + const deactivated = () => { + destroyResizeEvent(); + destroySidebarResizeEvent(); + }; + + return { + chart, + mounted, + beforeDestroy, + activated, + deactivated + }; +} diff --git a/frontend-sjgl/src/utils/rsaEncrypt.ts b/frontend-sjgl/src/utils/rsaEncrypt.ts new file mode 100644 index 00000000..7bbc8297 --- /dev/null +++ b/frontend-sjgl/src/utils/rsaEncrypt.ts @@ -0,0 +1,29 @@ +import JSEncrypt from 'jsencrypt' +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' + + '2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==' + +const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' + + 'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' + + 'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' + + '/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' + + 'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' + + 'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' + + '4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' + + 'tTbklZkD2A==' + +// 加密 +export function encrypt(txt:string) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对需要加密的数据进行加密 +} + +// 解密 +export function decrypt(txt:string) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) + return encryptor.decrypt(txt) +} + diff --git a/frontend-sjgl/src/utils/scroll-to.ts b/frontend-sjgl/src/utils/scroll-to.ts new file mode 100644 index 00000000..591e3ec0 --- /dev/null +++ b/frontend-sjgl/src/utils/scroll-to.ts @@ -0,0 +1,69 @@ +const easeInOutQuad = (t: number, b: number, c: number, d: number) => { + t /= d / 2; + if (t < 1) { + return (c / 2) * t * t + b; + } + t--; + return (-c / 2) * (t * (t - 2) - 1) + b; +}; + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +const requestAnimFrame = (function () { + return ( + window.requestAnimationFrame || + (window as any).webkitRequestAnimationFrame || + (window as any).mozRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60); + } + ); +})(); + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +const move = (amount: number) => { + document.documentElement.scrollTop = amount; + (document.body.parentNode as HTMLElement).scrollTop = amount; + document.body.scrollTop = amount; +}; + +const position = () => { + return ( + document.documentElement.scrollTop || + (document.body.parentNode as HTMLElement).scrollTop || + document.body.scrollTop + ); +}; + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export const scrollTo = (to: number, duration: number, callback?: any) => { + const start = position(); + const change = to - start; + const increment = 20; + let currentTime = 0; + duration = typeof duration === 'undefined' ? 500 : duration; + const animateScroll = function () { + // increment the time + currentTime += increment; + // find the value with the quadratic in-out easing function + const val = easeInOutQuad(currentTime, start, change, duration); + // move the document.body + move(val); + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll); + } else { + if (callback && typeof callback === 'function') { + // the animation is done so lets callback + callback(); + } + } + }; + animateScroll(); +}; diff --git a/frontend-sjgl/src/utils/sessionStorage.ts b/frontend-sjgl/src/utils/sessionStorage.ts new file mode 100644 index 00000000..fae9a210 --- /dev/null +++ b/frontend-sjgl/src/utils/sessionStorage.ts @@ -0,0 +1,22 @@ +/** + * window.sessionStorage 浏览器临时缓存 + */ +export const sessionStorage = { + // 设置临时缓存 + set(key: string, val: any) { + window.sessionStorage.setItem(key, JSON.stringify(val)); + }, + // 获取临时缓存 + get(key: string) { + const json: any = window.sessionStorage.getItem(key); + return JSON.parse(json); + }, + // 移除临时缓存 + remove(key: string) { + window.sessionStorage.removeItem(key); + }, + // 移除全部临时缓存 + clear() { + window.sessionStorage.clear(); + } +}; diff --git a/frontend-sjgl/src/views/conventionalHydropower/Approval/ApprovalSearch.vue b/frontend-sjgl/src/views/conventionalHydropower/Approval/ApprovalSearch.vue new file mode 100644 index 00000000..63865246 --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/Approval/ApprovalSearch.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/Approval/index.vue b/frontend-sjgl/src/views/conventionalHydropower/Approval/index.vue new file mode 100644 index 00000000..b195c75d --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/Approval/index.vue @@ -0,0 +1,330 @@ + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/BasicData/BasicDataSearch.vue b/frontend-sjgl/src/views/conventionalHydropower/BasicData/BasicDataSearch.vue new file mode 100644 index 00000000..0ebe972b --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/BasicData/BasicDataSearch.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/BasicData/CustomColumnModal.vue b/frontend-sjgl/src/views/conventionalHydropower/BasicData/CustomColumnModal.vue new file mode 100644 index 00000000..0bf0c5f6 --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/BasicData/CustomColumnModal.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/BasicData/DeleteConfirmModal.vue b/frontend-sjgl/src/views/conventionalHydropower/BasicData/DeleteConfirmModal.vue new file mode 100644 index 00000000..f47acd92 --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/BasicData/DeleteConfirmModal.vue @@ -0,0 +1,115 @@ + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/BasicData/EditPowerModal.vue b/frontend-sjgl/src/views/conventionalHydropower/BasicData/EditPowerModal.vue new file mode 100644 index 00000000..ca91b39d --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/BasicData/EditPowerModal.vue @@ -0,0 +1,1406 @@ + + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/BasicData/index.vue b/frontend-sjgl/src/views/conventionalHydropower/BasicData/index.vue new file mode 100644 index 00000000..4e66d3e8 --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/BasicData/index.vue @@ -0,0 +1,1057 @@ + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/FishResource/FishResourceSearch.vue b/frontend-sjgl/src/views/conventionalHydropower/FishResource/FishResourceSearch.vue new file mode 100644 index 00000000..a6d4945c --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/FishResource/FishResourceSearch.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/frontend-sjgl/src/views/conventionalHydropower/FishResource/index.vue b/frontend-sjgl/src/views/conventionalHydropower/FishResource/index.vue new file mode 100644 index 00000000..9e622ce1 --- /dev/null +++ b/frontend-sjgl/src/views/conventionalHydropower/FishResource/index.vue @@ -0,0 +1,643 @@ + + + + diff --git a/frontend-sjgl/src/views/error-page/401.vue b/frontend-sjgl/src/views/error-page/401.vue new file mode 100644 index 00000000..2e393696 --- /dev/null +++ b/frontend-sjgl/src/views/error-page/401.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend-sjgl/src/views/error-page/404.vue b/frontend-sjgl/src/views/error-page/404.vue new file mode 100644 index 00000000..567066a4 --- /dev/null +++ b/frontend-sjgl/src/views/error-page/404.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/frontend-sjgl/src/views/login/index.vue b/frontend-sjgl/src/views/login/index.vue new file mode 100644 index 00000000..2f9c5afb --- /dev/null +++ b/frontend-sjgl/src/views/login/index.vue @@ -0,0 +1,1071 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/Export/index.vue b/frontend-sjgl/src/views/monitorData/Export/index.vue new file mode 100644 index 00000000..248776ee --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/Export/index.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FishData/FishDataSearch.vue b/frontend-sjgl/src/views/monitorData/FishData/FishDataSearch.vue new file mode 100644 index 00000000..b33493e8 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FishData/FishDataSearch.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FishData/index.vue b/frontend-sjgl/src/views/monitorData/FishData/index.vue new file mode 100644 index 00000000..300b726a --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FishData/index.vue @@ -0,0 +1,551 @@ + + + + diff --git a/frontend-sjgl/src/views/monitorData/FishRelease/FishReleaseSearch.vue b/frontend-sjgl/src/views/monitorData/FishRelease/FishReleaseSearch.vue new file mode 100644 index 00000000..53684e85 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FishRelease/FishReleaseSearch.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FishRelease/index.vue b/frontend-sjgl/src/views/monitorData/FishRelease/index.vue new file mode 100644 index 00000000..b0fe82c4 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FishRelease/index.vue @@ -0,0 +1,208 @@ + + + + diff --git a/frontend-sjgl/src/views/monitorData/FlowData/FlowDataSearch.vue b/frontend-sjgl/src/views/monitorData/FlowData/FlowDataSearch.vue new file mode 100644 index 00000000..f83762a8 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FlowData/FlowDataSearch.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FlowData/index.vue b/frontend-sjgl/src/views/monitorData/FlowData/index.vue new file mode 100644 index 00000000..4ab0ef9c --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FlowData/index.vue @@ -0,0 +1,465 @@ + + + + diff --git a/frontend-sjgl/src/views/monitorData/FlowStation/EditFlowStationModal.vue b/frontend-sjgl/src/views/monitorData/FlowStation/EditFlowStationModal.vue new file mode 100644 index 00000000..75e38474 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FlowStation/EditFlowStationModal.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FlowStation/FlowStationSearch.vue b/frontend-sjgl/src/views/monitorData/FlowStation/FlowStationSearch.vue new file mode 100644 index 00000000..58291c97 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FlowStation/FlowStationSearch.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/FlowStation/index.vue b/frontend-sjgl/src/views/monitorData/FlowStation/index.vue new file mode 100644 index 00000000..b8d6d602 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/FlowStation/index.vue @@ -0,0 +1,331 @@ + + + + diff --git a/frontend-sjgl/src/views/monitorData/SurfaceTemp/EditSurfaceTempModal.vue b/frontend-sjgl/src/views/monitorData/SurfaceTemp/EditSurfaceTempModal.vue new file mode 100644 index 00000000..d69a1345 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/SurfaceTemp/EditSurfaceTempModal.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/SurfaceTemp/SurfaceTempSearch.vue b/frontend-sjgl/src/views/monitorData/SurfaceTemp/SurfaceTempSearch.vue new file mode 100644 index 00000000..262c67e9 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/SurfaceTemp/SurfaceTempSearch.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/SurfaceTemp/index.vue b/frontend-sjgl/src/views/monitorData/SurfaceTemp/index.vue new file mode 100644 index 00000000..973e39b4 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/SurfaceTemp/index.vue @@ -0,0 +1,295 @@ + + + + diff --git a/frontend-sjgl/src/views/monitorData/VerticalTemp/EditVerticalTempModal.vue b/frontend-sjgl/src/views/monitorData/VerticalTemp/EditVerticalTempModal.vue new file mode 100644 index 00000000..f27450ae --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/VerticalTemp/EditVerticalTempModal.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/VerticalTemp/VerticalTempSearch.vue b/frontend-sjgl/src/views/monitorData/VerticalTemp/VerticalTempSearch.vue new file mode 100644 index 00000000..856f93f8 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/VerticalTemp/VerticalTempSearch.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/VerticalTemp/index.vue b/frontend-sjgl/src/views/monitorData/VerticalTemp/index.vue new file mode 100644 index 00000000..a0f0c372 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/VerticalTemp/index.vue @@ -0,0 +1,699 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/WaterData/EditWaterDataModal.vue b/frontend-sjgl/src/views/monitorData/WaterData/EditWaterDataModal.vue new file mode 100644 index 00000000..bd30f661 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/WaterData/EditWaterDataModal.vue @@ -0,0 +1,405 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/WaterData/WaterDataSearch.vue b/frontend-sjgl/src/views/monitorData/WaterData/WaterDataSearch.vue new file mode 100644 index 00000000..50798744 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/WaterData/WaterDataSearch.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/frontend-sjgl/src/views/monitorData/WaterData/index.vue b/frontend-sjgl/src/views/monitorData/WaterData/index.vue new file mode 100644 index 00000000..2ea914d4 --- /dev/null +++ b/frontend-sjgl/src/views/monitorData/WaterData/index.vue @@ -0,0 +1,453 @@ + + + + diff --git a/frontend-sjgl/src/views/redirect/index.vue b/frontend-sjgl/src/views/redirect/index.vue new file mode 100644 index 00000000..47cad96e --- /dev/null +++ b/frontend-sjgl/src/views/redirect/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/frontend-sjgl/src/views/register/index.vue b/frontend-sjgl/src/views/register/index.vue new file mode 100644 index 00000000..79fccf7a --- /dev/null +++ b/frontend-sjgl/src/views/register/index.vue @@ -0,0 +1,998 @@ + + + + + diff --git a/frontend-sjgl/src/views/shiPinJianKong/components/LiveVideoBox.vue b/frontend-sjgl/src/views/shiPinJianKong/components/LiveVideoBox.vue new file mode 100644 index 00000000..167bcfe5 --- /dev/null +++ b/frontend-sjgl/src/views/shiPinJianKong/components/LiveVideoBox.vue @@ -0,0 +1,435 @@ + + + + + diff --git a/frontend-sjgl/src/views/shiPinJianKong/shiPinJianKongZhuanTi.vue b/frontend-sjgl/src/views/shiPinJianKong/shiPinJianKongZhuanTi.vue new file mode 100644 index 00000000..ecdd7bbb --- /dev/null +++ b/frontend-sjgl/src/views/shiPinJianKong/shiPinJianKongZhuanTi.vue @@ -0,0 +1,1805 @@ + + + + + diff --git a/frontend-sjgl/src/views/shuJuFenXi/components/export.js b/frontend-sjgl/src/views/shuJuFenXi/components/export.js new file mode 100644 index 00000000..3f21ac3e --- /dev/null +++ b/frontend-sjgl/src/views/shuJuFenXi/components/export.js @@ -0,0 +1,225 @@ +import Excel from 'exceljs'; +import FileSaver from 'file-saver'; + +const exportExcel = function (univerData, fileName = 'data') { + // 参数为Univer工作簿数据对象 + const workbook = new Excel.Workbook(); + + // 遍历工作簿中的所有工作表 + const sheetOrder = univerData.sheetOrder || []; + sheetOrder.forEach(sheetId => { + const sheet = univerData.sheets[sheetId]; + if (!sheet || !sheet.cellData) return; + + const worksheet = workbook.addWorksheet(sheet.name || 'Sheet1'); + + // 处理单元格数据 + setCellsData(sheet.cellData, worksheet, univerData.styles || {}); + + // 设置合并单元格 + if (sheet.mergeData) { + setMerge(sheet.mergeData, worksheet); + } + + // 设置行高 + if (sheet.rowData) { + setRowHeight(sheet.rowData, worksheet); + } + + // 设置列宽 + if (sheet.columnData) { + setColumnWidth(sheet.columnData, worksheet); + } + + // 设置冻结行列 + if (sheet.freeze) { + setFreeze(sheet.freeze, worksheet); + } + }); + + // 写入 buffer + const buffer = workbook.xlsx.writeBuffer().then(data => { + const blob = new Blob([data], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' + }); + console.log('导出成功!'); + FileSaver.saveAs(blob, `${fileName}.xlsx`); + }); + + return buffer; +}; + +// 设置单元格数据 +var setCellsData = function (cellData, worksheet, styles = {}) { + for (let row in cellData) { + const rowData = cellData[row]; + for (let col in rowData) { + const cell = rowData[col]; + if (!cell) continue; + + const excelRow = parseInt(row) + 1; + const excelCol = parseInt(col) + 1; + const targetCell = worksheet.getCell(excelRow, excelCol); + + // 设置值 + if (cell.f) { + // 如果是公式 + targetCell.value = { formula: cell.f, result: cell.v }; + } else if (cell.v !== undefined) { + // 如果是普通值 + targetCell.value = cell.v; + } + + // 如果有样式ID,应用样式 + if (cell.s && styles[cell.s]) { + const cellStyle = styles[cell.s]; + applyCellStyle(targetCell, cellStyle); + } + } + } +}; + +// 应用单元格样式 +var applyCellStyle = function (targetCell, cellStyle) { + // 应用字体样式 + if (cellStyle.ff) { + targetCell.font = targetCell.font || {}; + targetCell.font.name = cellStyle.ff; + } + + if (cellStyle.fs) { + targetCell.font = targetCell.font || {}; + targetCell.font.size = cellStyle.fs; + } + + if (cellStyle.bl === 1) { + targetCell.font = targetCell.font || {}; + targetCell.font.bold = true; + } + + if (cellStyle.it === 1) { + targetCell.font = targetCell.font || {}; + targetCell.font.italic = true; + } + + // 应用背景色 + if (cellStyle.bg && cellStyle.bg.rgb) { + targetCell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: cellStyle.bg.rgb.replace('#', '') } + }; + } + + // 应用字体颜色 + if (cellStyle.cl && cellStyle.cl.rgb) { + targetCell.font = targetCell.font || {}; + targetCell.font.color = { argb: cellStyle.cl.rgb.replace('#', '') }; + } + + // 应用水平对齐 + if (cellStyle.ht !== undefined) { + targetCell.alignment = targetCell.alignment || {}; + if (cellStyle.ht === 1) targetCell.alignment.horizontal = 'left'; + else if (cellStyle.ht === 2) targetCell.alignment.horizontal = 'center'; + else if (cellStyle.ht === 3) targetCell.alignment.horizontal = 'right'; + } + + // 应用垂直对齐 + if (cellStyle.vt !== undefined) { + targetCell.alignment = targetCell.alignment || {}; + if (cellStyle.vt === 1) targetCell.alignment.vertical = 'top'; + else if (cellStyle.vt === 2) targetCell.alignment.vertical = 'middle'; + else if (cellStyle.vt === 3) targetCell.alignment.vertical = 'bottom'; + } + + // 应用文本换行 + if (cellStyle.tb !== undefined) { + targetCell.alignment = targetCell.alignment || {}; + targetCell.alignment.wrapText = cellStyle.tb === 1; + } + + // 应用文本旋转 + if (cellStyle.tr !== undefined) { + targetCell.alignment = targetCell.alignment || {}; + targetCell.alignment.textRotation = cellStyle.tr; + } + + // 应用边框(如果有的话) + if (cellStyle.bd) { + // 这里可以处理边框样式 + // 具体实现根据实际边框数据结构 + } +}; + +// 设置合并单元格 +var setMerge = function (mergeData = [], worksheet) { + mergeData.forEach(function (merge) { + worksheet.mergeCells( + merge.startRow + 1, // Excel行号从1开始 + merge.startColumn + 1, // Excel列号从1开始 + merge.endRow + 1, + merge.endColumn + 1 + ); + }); +}; + +// 设置行高 +var setRowHeight = function (rowData = {}, worksheet) { + for (let rowIndex in rowData) { + const rowInfo = rowData[rowIndex]; + if (rowInfo.h) { + const excelRowNum = parseInt(rowIndex) + 1; + // 转换像素到Excel行高单位 (1像素 ≈ 0.75 Excel行高单位) + const excelHeight = rowInfo.h * 0.75; + worksheet.getRow(excelRowNum).height = excelHeight; + } + } +}; + +// 设置列宽 +var setColumnWidth = function (columnData = {}, worksheet) { + for (let colIndex in columnData) { + const colInfo = columnData[colIndex]; + if (colInfo.w) { + const excelColNum = parseInt(colIndex) + 1; + // 转换像素到Excel列宽单位 (1像素 ≈ 0.14 Excel列宽单位,粗略估算) + const excelWidth = colInfo.w * 0.14; + worksheet.getColumn(excelColNum).width = excelWidth; + } + } +}; + +// 设置冻结行列 +var setFreeze = function (freeze, worksheet) { + if (freeze.startRow > 0 || freeze.startColumn > 0) { + // Excel中冻结窗格通过视图设置 + worksheet.views = [ + { + state: 'frozen', + xSplit: freeze.xSplit || freeze.startColumn, + ySplit: freeze.ySplit || freeze.startRow, + topLeftCell: `${getExcelColumnName(freeze.startColumn + 1)}${freeze.startRow + 1}` + } + ]; + } +}; + +// 将数字转换为Excel列名 (A, B, ..., Z, AA, AB, ...) +function getExcelColumnName(colNumber) { + let columnName = ''; + let num = colNumber; + + while (num > 0) { + num--; + const remainder = num % 26; + columnName = String.fromCharCode(65 + remainder) + columnName; + num = Math.floor(num / 26); + } + + return columnName || 'A'; +} + +export { + exportExcel +}; \ No newline at end of file diff --git a/frontend-sjgl/src/views/shuJuFenXi/components/utils.ts b/frontend-sjgl/src/views/shuJuFenXi/components/utils.ts new file mode 100644 index 00000000..bfa12b68 --- /dev/null +++ b/frontend-sjgl/src/views/shuJuFenXi/components/utils.ts @@ -0,0 +1,1011 @@ +import dayjs from 'dayjs'; +import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'; +import UniverPresetSheetsCoreZhCN from '@univerjs/preset-sheets-core/locales/zh-CN'; +import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'; +interface dmFilter { + baseId?: string; + rstcd?: string; + sttpFullPath?: string; + sttpCode?: string; + mway?: string; + rvcd?: any; + dtinType?: any; +} + +// 通用样式设置函数 +const applyCellStyle = ( + range: any, + options: { + value?: string; + fontSize?: number; + fontWeight?: string; + fontColor?: string; + backgroundColor?: string; + fontFamily?: string; + horizontalAlignment?: string; + verticalAlignment?: string; + }, + defaults?: { + fontSize?: number; + fontFamily?: string; + horizontalAlignment?: string; + verticalAlignment?: string; + } +) => { + if (range) { + // 应用默认样式(如果提供) + if (defaults) { + if (defaults.fontSize && options.fontSize === undefined) + range.setFontSize(defaults.fontSize); + if (defaults.fontFamily && options.fontFamily === undefined) + range.setFontFamily(defaults.fontFamily); + if ( + defaults.horizontalAlignment && + options.horizontalAlignment === undefined + ) + range.setHorizontalAlignment(defaults.horizontalAlignment); + if (defaults.verticalAlignment && options.verticalAlignment === undefined) + range.setVerticalAlignment(defaults.verticalAlignment); + } + + // 应用传入的样式(覆盖默认样式) + if (options.value !== undefined) { + range.setValue(options.value); + } + if (options.fontSize) range.setFontSize(options.fontSize); + if (options.fontWeight) range.setFontWeight(options.fontWeight); + if (options.fontColor) range.setFontColor(options.fontColor); + if (options.backgroundColor) + range.setBackgroundColor(options.backgroundColor); + if (options.fontFamily) range.setFontFamily(options.fontFamily); + if (options.horizontalAlignment) + range.setHorizontalAlignment(options.horizontalAlignment); + if (options.verticalAlignment) + range.setVerticalAlignment(options.verticalAlignment); + } +}; + +// 初始化Excel工作表 +const initializeExcelWorksheet = (univerAPI: any) => { + const fWorkbook = univerAPI.getActiveWorkbook(); + const fWorksheet = fWorkbook.getActiveSheet(); + + // 默认样式配置 + const defaultStyle = { + fontSize: 12, + fontFamily: 'SimSun', + horizontalAlignment: 'center', + verticalAlignment: 'middle' + }; + + // 设置标题行(第1行,A到AE列,即A1:AE1) + const titleRange = fWorksheet.getRange('A1:AG1'); + if (titleRange) { + titleRange.merge(); // 合并A1到AG1的单元格 + applyCellStyle( + titleRange, + { + value: '水温站xxxx年监测数据', + fontWeight: 'bold', + fontSize: 18 + }, + defaultStyle + ); + } + + // 设置日期标题(第1行,A到AE列,即A1:AE1) + const dateHeaders = []; + for (let day = 1; day <= 31; day++) { + dateHeaders.push([`${day}日`]); + } + const dateHeaderRange = fWorksheet.getRange('C2:AG2'); + if (dateHeaderRange) { + dateHeaderRange.setValues([dateHeaders.flat()]); // 使用一维数组设置一行 + } + + // 设置标题列 + // A列标题 + const timeHeaderRange = fWorksheet.getRange('A2'); + applyCellStyle( + timeHeaderRange, + { + value: '日期' + }, + defaultStyle + ); + + // B列标题 + const typeHeaderRange = fWorksheet.getRange('B2'); + applyCellStyle( + typeHeaderRange, + { + value: '类型' + }, + defaultStyle + ); + + // 设置月份和类型数据 + // 每个月的数据行,第1个月在第2行,第2个月在第4行,第3个月在第6行... + for (let month = 1; month <= 12; month++) { + const monthRow = (month - 1) * 2 + 3; // 月份名称行 + const dataRow = monthRow + 1; // 数据标识行 + + // 设置月份名称到A列并合并 + const monthRange = fWorksheet.getRange(`A${monthRow}:A${dataRow}`); + if (monthRange) { + monthRange.merge(); // 合并A列的两行 + applyCellStyle( + monthRange, + { + value: `${month}月`, + fontWeight: 'bold', + fontColor: 'black', + backgroundColor: '#A9D08E' + }, + defaultStyle + ); + } + + // 设置类型信息到B列 - 平均值 + const dataTypeRange = fWorksheet.getRange(`B${dataRow}`); + applyCellStyle( + dataTypeRange, + { + value: '平均值', + fontSize: 10, + fontColor: 'black' + }, + defaultStyle + ); + + // 设置类型信息到B列 - 日数据 + const avgTypeRange = fWorksheet.getRange(`B${monthRow}`); + applyCellStyle( + avgTypeRange, + { + value: '日数据', + fontSize: 10, + fontColor: 'black' + }, + defaultStyle + ); + } + + // 设置日期标题行样式(A到AE列) + for (let day = 0; day < 33; day++) { + const colName = getExcelColumnName(day); // A是第0列 + const cellRange = fWorksheet.getRange(`${colName}2`); // A1, B1, C1...AE1 + applyCellStyle( + cellRange, + { + fontWeight: 'bold', + fontColor: '#ffffff', + backgroundColor: '#4472C4' + }, + defaultStyle + ); + } + + // 设置A列(月份列)和B列(类型列)宽度 + fWorksheet.setColumnWidth(0, 60); // A列宽度 + fWorksheet.setColumnWidth(1, 60); // B列宽度 + + // 设置第一行高度 + fWorksheet.setRowHeight(0, 45); // 第一行高度 + fWorksheet.setRowHeight(1, 40); // 第二行高度 + fWorksheet.setRowHeight(2, 40); // 第三行高度 + + // 固定首行和首列 + fWorksheet.setFrozenRows(2); // 固定前两行 + fWorksheet.setFrozenColumns(2); // 固定前两列(日期列和类型列) + + // 设置行高 + for (let month = 1; month <= 12; month++) { + const monthRow = (month - 1) * 2 + 3; + const dataRow = monthRow + 1; + fWorksheet.setRowHeight(monthRow - 1, 40); + fWorksheet.setRowHeight(dataRow - 1, 30); + } + + // 设置列宽(从C列开始是具体日期数据列) + for (let col = 2; col <= 32; col++) { + // C列是索引2,到AE列(31天)是索引32 + fWorksheet.setColumnWidth(col, 60); + } + // 设置整个工作表的默认样式(水平和垂直居中) + const allRange = fWorksheet.getRange('C2:AG30'); // 假设最大范围是A1到AG30 + if (allRange) { + allRange.setHorizontalAlignment('center'); // 水平居中 + allRange.setVerticalAlignment('middle'); // 垂直居中 + allRange.setFontFamily('SimSun'); // 字体 + allRange.setFontSize(12); // 字体大小 + } +}; + +// 创建Excel实例 +export const createExcelInstance = container => { + const { univer, univerAPI } = createUniver({ + locale: LocaleType.ZH_CN, + locales: { + [LocaleType.ZH_CN]: mergeLocales(UniverPresetSheetsCoreZhCN) + }, + presets: [ + UniverSheetsCorePreset({ + container: container, + ribbonType: 'simple', + menu: { + // 菜单栏保护 + 'sheet.command.add-range-protection-from-toolbar': { hidden: true }, + 'sheet.contextMenu.permission': { hidden: true }, + 'sheet.command.add-range-protection-from-context-menu': { + hidden: true + }, + 'sheet.command.set-range-protection-from-context-menu': { + hidden: true + }, + 'sheet.command.delete-range-protection-from-context-menu': { + hidden: true + }, + 'sheet.command.view-sheet-permission-from-context-menu': { + hidden: true + }, + // 右键工作表保护 + 'sheet.command.add-range-protection-from-sheet-bar': { hidden: true }, + 'sheet.command.delete-worksheet-protection-from-sheet-bar': { + hidden: true + }, + 'sheet.command.change-sheet-protection-from-sheet-bar': { + hidden: true + }, + 'sheet.command.view-sheet-permission-from-sheet-bar': { + hidden: true + }, + // 函数 + 'formula-ui.operation.insert-function': { hidden: true }, + 'formula-ui.operation.more-functions': { hidden: true } + }, + footer: { + sheetBar: false + } + }) + ], + plugins: [] + }); + univerAPI.addEvent(univerAPI.Event.BeforeSheetEditEnd, params => { + // 调用函数处理单元格编辑事件 + const fWorkbook = univerAPI.getActiveWorkbook(); + const fWorksheet = fWorkbook.getActiveSheet(); + handleCellEdit(params, fWorksheet, univerAPI.year); + // 取消单元格编辑结束操作 + // params.cancel = true + }); + + // 创建包含多个工作表的工作簿 + const workbook = univerAPI.createWorkbook({ + id: 'workbook-1', + name: '水文数据分析表', + sheetOrder: ['sheet-1'], // 工作表顺序 + sheets: { + 'sheet-1': { + id: 'sheet-1', + name: '水温站数据', + rowCount: 30, + columnCount: 33, // 保持33列 + cellData: {}, + styles: {} + } + } + }); + + // 初始化Excel工作表 + initializeExcelWorksheet(univerAPI); + + return { univer, univerAPI }; +}; +// 检查单元格编辑事件,如果row是奇数,根据column判断是否需要添加平均数公式 +export const handleCellEdit = (params: any, fWorksheet: any, year: string) => { + const { + worksheet, + workbook, + row, + column, + value, + eventType, + keycode, + isZenEditor, + isConfirm + } = params; + + if (row == 0 || row == 1 || column == 0 || column == 1) return; + // 检查row是否为奇数 + if (row % 2 === 0) { + // 计算该列对应的日期(从第3列开始是1日,所以column-2对应日期) + const day = column - 1; // 由于C列(索引2)是第1天,所以要减去1(因为前面修正了计算) + const month = row / 2; + + // 计算当前日期在整个年份中的位置 + let dayOfYear = 0; + for (let i = 1; i < month; i++) { + dayOfYear += getDaysInMonth(year, i); + } + dayOfYear += day; + + console.log( + `当前编辑的行 ${row} 对应第 ${month} 月第 ${day} 天,全年第 ${dayOfYear} 天` + ); + + // 找到当前日期所属的5天组 + // 对于闰年的第366天,应该单独作为一个组 + let groupStartDayOfYear, groupEndDayOfYear; + if (dayOfYear === 366) { + // 闰年的第366天,单独作为一个组 + groupStartDayOfYear = 366; + groupEndDayOfYear = 366; + } else { + const groupIndex = Math.floor((dayOfYear - 1) / 5); // 第几天组(从0开始) + groupStartDayOfYear = groupIndex * 5 + 1; // 该组开始的年中日期 + groupEndDayOfYear = Math.min(groupStartDayOfYear + 4, 366); // 该组结束的年中日期(考虑闰年) + } + + console.log( + `第 ${dayOfYear} 天在第 ${ + Math.floor((groupStartDayOfYear - 1) / 5) + 1 + } 组(全年第 ${groupStartDayOfYear} 天到第 ${groupEndDayOfYear} 天)` + ); + + // 重建该组的所有单元格引用 + const groupCells = []; + const currentDayCount = groupStartDayOfYear; + let currentMonth = 1; + let cumulativeDays = 0; + + // 找到第一个月 + while ( + cumulativeDays + getDaysInMonth(year, currentMonth) < + currentDayCount + ) { + cumulativeDays += getDaysInMonth(year, currentMonth); + currentMonth++; + } + + let currentDay = currentDayCount - cumulativeDays; + + // 添加组中所有单元格的引用(从组开始到组结束) + for (let i = 0; i < groupEndDayOfYear - groupStartDayOfYear + 1; i++) { + // 检查当前日期是否超过当前月的天数,需要进入下一个月 + if (currentDay > getDaysInMonth(year, currentMonth)) { + currentMonth++; + currentDay = 1; + cumulativeDays += getDaysInMonth(year, currentMonth - 1); + } + + const cellCol = getExcelColumnName(currentDay + 1); + const cellRow = currentMonth * 2 + 1; + groupCells.push(`${cellCol}${cellRow}`); + + currentDay++; + } + + console.log('组中单元格:', groupCells); + + // 构建公式 + const formula = `=ROUND(AVERAGE(${groupCells.join(',')}), 1)`; + + // 找到该组的结束位置用于显示公式 + let endMonth = 1; + let endDay = 0; + let tempDayCount = 0; + + // 找到组结束的月份和日期 + while (tempDayCount + getDaysInMonth(year, endMonth) < groupEndDayOfYear) { + tempDayCount += getDaysInMonth(year, endMonth); + endMonth++; + } + endDay = groupEndDayOfYear - tempDayCount; + + console.log( + `5天组从第 ${Math.max( + 1, + Math.floor((groupStartDayOfYear - 1) / 31) + 1 + )} 月开始到第 ${endMonth} 月第 ${endDay} 天` + ); + + // 在该组最后一天的平均值行显示公式 + const avgRow = endMonth * 2 + 2; // 平均值行 + const avgCol = getExcelColumnName(endDay + 1); // 最后一天的列 + + const avgCell = fWorksheet.getRange(`${avgCol}${avgRow}`); + if (avgCell) { + avgCell.setValue(formula); + avgCell + .setFontSize(10) + .setFontWeight('bold') + .setHorizontalAlignment('center') // 水平居中 + .setVerticalAlignment('middle'); // 垂直居中 + } + + console.log(`公式: ${formula}, 显示在: ${avgCol}${avgRow}`); + } +}; + +export const getParams = (searchData: any, Psort?: any, Rstcd?: boolean) => { + const currentBaseId = window.__lyConfigs?.baseId ?? '02'; + const generateArray = (num: any) => { + return Array.from({ length: 13 - num }, (_, i) => i + num); + }; + const generateArrayMonth = (num: any) => { + const start = 1; + const end = num === 12 ? 12 : num; + return Array.from({ length: end - start + 1 }, (_, i) => i + start); + }; + const generateArrayYear = (startYear: any, endYear: any) => { + const result = []; + for (let i = startYear; i <= endYear; i++) { + result.push(i); + } + return result.slice(1, -1); + }; + // if (searchData) { + const params: any = []; + // if (sttpCode) { + // params.push( + // { + // field: 'sttpCode', + // operator: 'eq', + // dataType: 'string', + // value: sttpCode + // } + // ) + // } + + if ( + searchData?.stcd?.dataDimensionData && + searchData?.stcd?.dataDimensionData != 'all' + ) { + params.push({ + field: 'baseId', + operator: 'eq', + dataType: 'string', + value: searchData?.stcd?.dataDimensionData + }); + } + if (searchData?.stcd?.stcdId?.length > 0) { + params.push({ + field: Rstcd ? 'rstcd' : 'stcd', + operator: 'contains', + dataType: 'string', + value: searchData?.stcd?.stcdId + }); + } + if (searchData?.qecType) { + if (searchData?.qecType == 'wstllyq') { + params.push( + { + field: 'sfdb', + operator: 'eq', + dataType: 'string', + value: '3' + }, + { + field: 'mwrSfdb', + operator: 'eq', + dataType: 'string', + value: '3' + }, + { + field: 'avqSfdb', + operator: 'eq', + dataType: 'string', + value: '3' + } + ); + } else { + params.push({ + field: searchData?.qecType, + operator: 'neq', + dataType: 'string', + value: '3' + }); + } + } + if (searchData?.mway) { + params.push({ + field: 'mway', + operator: 'eq', + dataType: 'string', + value: searchData?.mway + }); + } + if (searchData?.dtinType) { + params.push({ + field: 'dtinType', + operator: 'eq', + dataType: 'string', + value: searchData?.dtinType + }); + } + + if (searchData?.dmStcd?.length > 0) { + params.push({ + field: 'stcd', + operator: 'eq', + dataType: 'string', + value: searchData?.dmStcd + }); + } + if (searchData?.trafficStation?.length > 0) { + params.push({ + field: 'stcd', + operator: 'eq', + dataType: 'string', + value: searchData?.trafficStation + }); + } + let sort; + if (searchData?.typeDate == '1') { + params.push( + { + field: 'tm', + operator: 'gte', + dataType: 'date', + value: dayjs(searchData?.RangePickerList?.[0]).format( + 'YYYY-MM-DD HH:mm:ss' + ) + }, + { + field: 'tm', + operator: 'lte', + dataType: 'date', + value: dayjs(searchData?.RangePickerList?.[1]).format( + 'YYYY-MM-DD HH:mm:ss' + ) + } + ); + sort = Psort ?? [ + { + field: 'baseStepSort', + dir: 'asc' + }, + { + field: 'rvcd', + dir: 'asc' + }, + { + field: 'rstcdStepSort', + dir: 'asc' + }, + { + field: 'ennm', + dir: 'asc' + }, + { + field: 'tm', + dir: 'desc' + } + ]; + } else if (searchData?.typeDate == '2') { + params.push( + { + field: 'dt', + operator: 'gte', + dataType: 'date', + value: dayjs(searchData?.RangePickerList?.[0]).format( + 'YYYY-MM-DD 00:00:00' + ) + }, + { + field: 'dt', + operator: 'lte', + dataType: 'date', + value: dayjs(searchData?.RangePickerList?.[1]).format( + 'YYYY-MM-DD 23:59:59' + ) + } + ); + sort = Psort ?? [ + { + field: 'baseStepSort', + dir: 'asc' + }, + { + field: 'rvcd', + dir: 'asc' + }, + { + field: 'rstcdStepSort', + dir: 'asc' + }, + { + field: 'stnm', + dir: 'asc' + }, + { + field: 'dt', + dir: 'desc' + } + ]; + } else if (searchData?.typeDate == '3') { + params.push( + { + field: 'drtp', //维度类型:WEEK=周 TEN=旬 MON=月 QUA=季 YEAR=年 + operator: 'eq', + dataType: 'string', + value: 'WEEK' + }, + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: dayjs(searchData?.RangePickerList).format('YYYY') + } + ); + sort = [ + { + field: 'baseStepSort', + dir: 'asc' + }, + { + field: 'rvcd', + dir: 'asc' + }, + { + field: 'rstcdStepSort', + dir: 'asc' + }, + { + field: 'stnm', + dir: 'asc' + }, + { + field: 'dt', + dir: 'desc' + } + ]; + } else if (searchData?.typeDate == '4' || searchData?.typeDate == '5') { + const start = dayjs(searchData?.RangePickerList?.[0]).format('YYYY-MM-DD'); + const end = dayjs(searchData?.RangePickerList?.[1]).format('YYYY-MM-DD'); + const startMonth = generateArray(parseInt(start.split('-')[1])); + const endMonth = generateArrayMonth(parseInt(end.split('-')[1])); + const year = generateArrayYear(start.split('-')[0], end.split('-')[0]); + params.push({ + field: 'drtp', //维度类型:WEEK=周 TEN=旬 MON=月 QUA=季 YEAR=年 + operator: 'eq', + dataType: 'string', + value: searchData?.typeDate == '4' ? 'TEN' : 'MON' + }); + if (start.split('-')[0] == end.split('-')[0]) { + const list = Array.from( + { length: Number(end.split('-')[1]) - Number(start.split('-')[1]) + 1 }, + (_, index) => Number(start.split('-')[1]) + index + ); + params.push( + { + field: 'month', + operator: 'in', + dataType: 'number', + value: list + }, + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: start.split('-')[0] + '' + } + ); + } else { + params.push({ + logic: 'or', + filters: [ + { + logic: 'and', + filters: [ + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: start.split('-')[0] + }, + { + field: 'month', + operator: 'in', + dataType: 'number', + value: startMonth + } + ] + }, + year?.length > 0 + ? { + field: 'year', + operator: 'in', + dataType: 'string', + value: year + } + : null, + { + logic: 'and', + filters: [ + { + field: 'year', + operator: 'eq', + dataType: 'string', + value: end.split('-')[0] + }, + { + field: 'month', + operator: 'in', + dataType: 'number', + value: endMonth + } + ] + } + ].filter((el: any) => el != null) + }); + } + const list = + searchData?.typeDate == '4' + ? [ + { field: 'stnm', dir: 'desc' }, + { field: 'year', dir: 'desc' }, + { field: 'month', dir: 'desc' }, + { field: 'dr', dir: 'asc' } + ] + : [ + { field: 'stnm', dir: 'desc' }, + { field: 'year', dir: 'desc' }, + { field: 'month', dir: 'desc' } + ]; + sort = Psort ?? list; + } else if (searchData?.typeDate == '6' || searchData?.typeDate == '7') { + const start = dayjs(searchData?.RangePickerList?.[0]).format('YYYY'); + const end = dayjs(searchData?.RangePickerList?.[1]).format('YYYY'); + const list = Array.from( + { length: Number(end) - Number(start) + 1 }, + (_, index) => Number(start) + index + ); + params.push( + { + field: 'drtp', //维度类型:WEEK=周 TEN=旬 MON=月 QUA=季 YEAR=年 + operator: 'eq', + dataType: 'string', + value: searchData?.typeDate == '6' ? 'QUA' : 'YEAR' + }, + { + field: 'year', + operator: 'in', + dataType: 'string', + value: list + } + ); + sort = [ + { field: 'stnm', dir: 'desc' }, + { field: 'year', dir: 'desc' }, + searchData?.typeDate == '6' ? { field: 'dr', dir: 'desc' } : null + ].filter((el: any) => el != null); + } + + const filter = { + logic: 'and', + filters: params + }; + return { + filter: filter, + sort: sort + }; + // } else { + // return null + // } +}; + +// 辅助函数:将数字转换为Excel列名 +export function getExcelColumnName(colNumber: number): string { + let columnName = ''; + let num = colNumber + 1; // 转换为1基索引 + + while (num > 0) { + num--; // 调整为0基索引 + const remainder = num % 26; + columnName = String.fromCharCode(65 + remainder) + columnName; + num = Math.floor(num / 26); + } + + return columnName; +} + +// 渲染数据到Excel中 +export const renderDataToExcel = async ( + data: any[], + univerAPI: any, + year: string, + setLoading: any +) => { + const fWorkbook = univerAPI.getActiveWorkbook(); + const fWorksheet = fWorkbook.getActiveSheet(); + const permission = fWorksheet.getWorksheetPermission(); + // 获取当前所有保护范围规则 + const rules = await permission.listRangeProtectionRules(); + // 清除所有保护范围规则 + for (let i = 0; i < rules.length; i++) { + await permission.unprotectRules([rules[i].id]); + } + // 清除之前的数据(保留标题行) + for (let month = 1; month <= 12; month++) { + const dataRow = month * 2 + 1; // 当前月份的数据行 + const avgRow = dataRow + 1; // 平均值行 + + // 清除数据行的值 + for (let day = 1; day <= 31; day++) { + const colName = getExcelColumnName(day + 1); + const dataCell = fWorksheet.getRange(`${colName}${dataRow}`); + if (dataCell) { + dataCell.setValue(''); + } + + // 清除平均值行的值 + const avgCell = fWorksheet.getRange(`${colName}${avgRow}`); + if (avgCell) { + avgCell.setValue(''); + } + } + } + if (!data || data.length === 0) { + console.log('没有数据需要渲染'); + fWorkbook.getSheetBySheetId('sheet-1')?.setName('水温站数据'); + setLoading.value = false; + return; + } + fWorkbook.getSheetBySheetId('sheet-1')?.setName(data[0].stnm || ''); + + // 按月份分组数据 + const dataByMonth: { [key: string]: any[] } = {}; + + data.forEach((item: any) => { + const date = new Date(item.dt); + const month = date.getMonth() + 1; // 月份从0开始,需要+1 + const year = date.getFullYear(); + const monthKey = `${year}-${month}`; + + if (!dataByMonth[monthKey]) { + dataByMonth[monthKey] = []; + } + + dataByMonth[monthKey].push(item); + }); + + // 将数据渲染到Excel中 + Object.keys(dataByMonth).forEach(monthKey => { + const [year, month] = monthKey.split('-').map(Number); + const monthData = dataByMonth[monthKey]; + const dataRow = month * 2 + 1; // 月份数据行 + + // 遍历当月的每一天数据 + monthData.forEach((item: any) => { + const date = new Date(item.dt); + const day = date.getDate(); // 获取日期中的天数 + + // 获取对应列名 + const colName = getExcelColumnName(day + 1); + const cellRange = fWorksheet.getRange(`${colName}${dataRow}`); + + if (cellRange) { + // 设置wt值 + cellRange.setValue(item.wt); + + // 设置单元格样式 + cellRange + .setFontSize(12) + .setHorizontalAlignment('center') // 水平居中 + .setVerticalAlignment('middle'); // 垂直居中 + } + }); + }); + + // 重新计算并设置每5天的平均值 + setTimeout(() => { + calculateCrossMonthAverages(fWorksheet, permission, year, setLoading); + }, 100); +}; +const getDaysInMonth = (year: string, month: number) => { + return new Date(Number(year), month, 0).getDate(); +}; +// 计算跨月份每5天的平均值(使用公式) +export const calculateCrossMonthAverages = async ( + fWorksheet: any, + permission: any, + year: string, + setLoading: any +) => { + let groupValues: string[] = []; // 存储单元格引用 + let groupPositions: { month: number; day: number }[] = []; // 记录每个值的位置 + let validDataCount = 0; // 记录当前组中有效数据的数量 + const protectedRanges: any[] = []; + for (let month = 1; month <= 12; month++) { + const dataRow = month * 2 + 1; // 当前月份的数据行 + const daysInMonth = getDaysInMonth(year, month); // 根据年份获取该月天数 + if (daysInMonth < 31) { + for (let i = daysInMonth + 1; i < 32; i++) { + const colName = getExcelColumnName(i + 1); + protectedRanges.push({ + ranges: [fWorksheet.getRange(`${colName}${dataRow}`)], + options: { name: '', allowEdit: false, allowViewByOthers: true } + }); + } + } + + for (let day = 1; day <= daysInMonth; day++) { + const colName = getExcelColumnName(day + 1); + const cellRef = `${colName}${dataRow}`; // 单元格引用,如B2, C2等 + + // 获取单元格的值并检查是否为有效数据 + const cell = fWorksheet.getRange(cellRef); + const cellValue = cell?.getValue(); + + // 添加当前单元格引用到组(无论是否有数据) + groupValues.push(cellRef); + groupPositions.push({ month, day }); + + // 检查单元格是否有有效数据(非空、非NaN、非null、非undefined) + if ( + cellValue !== null && + cellValue !== undefined && + cellValue !== '' && + !isNaN(Number(cellValue)) + ) { + validDataCount++; + } + + // 如果组满了5个值,则计算平均值(如果有有效数据) + if (groupValues.length === 5) { + if (validDataCount > 0) { + // 构建平均值公式 + const range = groupValues.join(','); + const formula = `=ROUND(AVERAGE(${range}), 1)`; + + // 在组的最后一天显示平均值 + const lastPosition = groupPositions[groupValues.length - 1]; + const lastDayCol = getExcelColumnName(lastPosition.day + 1); + const avgRow = lastPosition.month * 2 + 2; // 平均值行在数据行的下一行 + const avgCell = fWorksheet.getRange(`${lastDayCol}${avgRow}`); + if (avgCell) { + avgCell.setValue(formula); + avgCell + .setFontSize(10) + .setFontWeight('bold') + .setHorizontalAlignment('center') // 水平居中 + .setVerticalAlignment('middle'); // 垂直居中 + } + } + + // 重置组 + groupValues = []; + groupPositions = []; + validDataCount = 0; + } + } + } + + // 处理最后不足5个数据的情况 - 不计算平均值 + // 如果你想对最后不足5个的剩余数据也计算平均值(只要有有效数据),可以取消下面的注释 + + if (groupValues.length > 0 && groupValues.length < 5 && validDataCount > 0) { + // 构建平均值公式 + const range = groupValues.join(','); + const formula = `=ROUND(AVERAGE(${range}), 1)`; + + // 在组的最后一天显示平均值 + const lastPosition = groupPositions[groupValues.length - 1]; + const lastDayCol = getExcelColumnName(lastPosition.day + 1); + const avgRow = lastPosition.month * 2 + 2; // 平均值行在数据行的下一行 + const avgCell = fWorksheet.getRange(`${lastDayCol}${avgRow}`); + if (avgCell) { + avgCell.setValue(formula); + avgCell + .setFontSize(10) + .setFontWeight('bold') + .setHorizontalAlignment('center') // 水平居中 + .setVerticalAlignment('middle'); // 垂直居中 + } + } + // 禁用 月份不到31天的日期单元格 + await permission.protectRanges(protectedRanges); + setLoading.value = false; +}; diff --git a/frontend-sjgl/src/views/shuJuFenXi/shuiWenShuJuFenXi.vue b/frontend-sjgl/src/views/shuJuFenXi/shuiWenShuJuFenXi.vue new file mode 100644 index 00000000..59ad5c77 --- /dev/null +++ b/frontend-sjgl/src/views/shuJuFenXi/shuiWenShuJuFenXi.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/guoYuDaoShuTongJiSearch.vue b/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/guoYuDaoShuTongJiSearch.vue new file mode 100644 index 00000000..187b3e38 --- /dev/null +++ b/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/guoYuDaoShuTongJiSearch.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/index.vue b/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/index.vue new file mode 100644 index 00000000..07007dc4 --- /dev/null +++ b/frontend-sjgl/src/views/shuJuTianBao/guoYuDaoShuTongJi/index.vue @@ -0,0 +1,437 @@ +