Browse Source

整合框架,功率预测,发电能力分析,报表项目合并

SunZehao 1 year ago
parent
commit
ea2c17abf3
100 changed files with 22385 additions and 0 deletions
  1. 4 0
      .browserslistrc
  2. 12 0
      .env.development
  3. 19 0
      .env.production
  4. 24 0
      .gitignore
  5. 21 0
      LICENSE
  6. 10 0
      auto-imports.d.ts
  7. 5 0
      babel.config.js
  8. 95 0
      components.d.ts
  9. 19 0
      jsconfig.json
  10. 18662 0
      package-lock.json
  11. 47 0
      package.json
  12. BIN
      public/favicon.ico
  13. 24 0
      public/index.html
  14. 299 0
      src/App.vue
  15. 1014 0
      src/api/api.js
  16. 43 0
      src/api/gengra.js
  17. 36 0
      src/api/login.js
  18. 13 0
      src/assets/css/eleCss/el-card.less
  19. 486 0
      src/assets/css/eleCss/el-input.less
  20. 50 0
      src/assets/css/eleCss/el-pagination.less
  21. 13 0
      src/assets/css/eleCss/el-popper.less
  22. 144 0
      src/assets/css/eleCss/el-table.less
  23. 6 0
      src/assets/css/eleCss/index.less
  24. 80 0
      src/assets/css/main.css
  25. BIN
      src/assets/iconNeed/iconFont.png
  26. BIN
      src/assets/images/base/404.png
  27. BIN
      src/assets/images/base/404_cloud.png
  28. BIN
      src/assets/logoGuo_DB.png
  29. BIN
      src/assets/weather/cloudy.png
  30. BIN
      src/assets/weather/overcast.png
  31. BIN
      src/assets/weather/rain.png
  32. BIN
      src/assets/weather/rainBlue.png
  33. BIN
      src/assets/weather/rainOrange.png
  34. BIN
      src/assets/weather/rainRed.png
  35. BIN
      src/assets/weather/rainYellow.png
  36. BIN
      src/assets/weather/snow.png
  37. BIN
      src/assets/weather/snowBlue.png
  38. BIN
      src/assets/weather/snowOrange.png
  39. BIN
      src/assets/weather/snowRed.png
  40. BIN
      src/assets/weather/snowYellow.png
  41. BIN
      src/assets/weather/sunshine.png
  42. BIN
      src/assets/weather/thunder.png
  43. BIN
      src/assets/weather/thunderOrange.png
  44. BIN
      src/assets/weather/thunderRed.png
  45. BIN
      src/assets/weather/thunderYellow.png
  46. BIN
      src/assets/weather/windBlue.png
  47. BIN
      src/assets/weather/windOrange.png
  48. BIN
      src/assets/weather/windRed.png
  49. BIN
      src/assets/weather/windYellow.png
  50. BIN
      src/assets/windFramPicture/Icon_green.png
  51. BIN
      src/assets/windFramPicture/Icon_grey.png
  52. BIN
      src/assets/windFramPicture/Icon_organge.png
  53. BIN
      src/assets/windFramPicture/Icon_purple.png
  54. BIN
      src/assets/windFramPicture/Icon_red.png
  55. BIN
      src/assets/windFramPicture/Icon_redgray.png
  56. BIN
      src/assets/windFramPicture/back1.jpg
  57. BIN
      src/assets/windFramPicture/back2.jpg
  58. BIN
      src/assets/windFramPicture/back3.jpg
  59. BIN
      src/assets/windFramPicture/background1.jpg
  60. BIN
      src/assets/windFramPicture/baojing.png
  61. BIN
      src/assets/windFramPicture/guzhang.png
  62. BIN
      src/assets/windFramPicture/indexPage1.png
  63. BIN
      src/assets/windFramPicture/indexPage2.png
  64. BIN
      src/assets/windFramPicture/indexPage3.png
  65. BIN
      src/assets/windFramPicture/indexPage4.png
  66. BIN
      src/assets/windFramPicture/indexPage4x.png
  67. BIN
      src/assets/windFramPicture/jingzhun.png
  68. BIN
      src/assets/windFramPicture/mahuangshanDQ.png
  69. BIN
      src/assets/windFramPicture/mahuangshan_v.png
  70. BIN
      src/assets/windFramPicture/member.png
  71. BIN
      src/assets/windFramPicture/niushoushan_v.png
  72. BIN
      src/assets/windFramPicture/nodata.jpeg
  73. BIN
      src/assets/windFramPicture/qiciPic.png
  74. BIN
      src/assets/windFramPicture/qiciPic2.png
  75. BIN
      src/assets/windFramPicture/qiciPic3.png
  76. BIN
      src/assets/windFramPicture/qingshan_v.png
  77. BIN
      src/assets/windFramPicture/rain.png
  78. BIN
      src/assets/windFramPicture/run_Icon.gif
  79. BIN
      src/assets/windFramPicture/shibanquan_v.png
  80. BIN
      src/assets/windFramPicture/sun.png
  81. BIN
      src/assets/windFramPicture/wturStatus.png
  82. BIN
      src/assets/windFramPicture/xiangshanDQ.png
  83. BIN
      src/assets/windFramPicture/xiangshan_v.png
  84. BIN
      src/assets/windFramPicture/yichang.png
  85. BIN
      src/assets/windFramPicture/zhunquelv.png
  86. BIN
      src/assets/windStatusPic/000.png
  87. BIN
      src/assets/windStatusPic/0003.png
  88. BIN
      src/assets/windStatusPic/001.png
  89. BIN
      src/assets/windStatusPic/002.png
  90. BIN
      src/assets/windStatusPic/003.png
  91. BIN
      src/assets/windStatusPic/004.png
  92. BIN
      src/assets/windStatusPic/005.png
  93. BIN
      src/assets/windStatusPic/006.png
  94. 350 0
      src/components/commonHeaders.vue
  95. 16 0
      src/components/generatingCapacityComponent/SubmitBtn.vue
  96. 102 0
      src/components/generatingCapacityComponent/excel.vue
  97. 579 0
      src/components/generatingCapacityComponent/kMap/index.vue
  98. 140 0
      src/components/generatingCapacityComponent/kMap/rightMenu.vue
  99. 72 0
      src/components/generatingCapacityComponent/table.vue
  100. 0 0
      src/components/generatingCapacityComponent/tree.vue

+ 4 - 0
.browserslistrc

@@ -0,0 +1,4 @@
+> 1%
+last 2 versions
+not dead
+not ie 11

+ 12 - 0
.env.development

@@ -0,0 +1,12 @@
+# 开发环境配置
+NODE_ENV = 'development'
+
+# 页面标题
+VUE_APP_TITLE = '页面标题'
+
+# 开发环境/重写路径(公共路径)
+VUE_APP_GENERAT_URL = 'http://123.60.219.66:9002'
+VUE_APP_BASE_URL = 'http://123.60.219.66:8086'
+
+# 百度地图KEY
+VUE_APP_BAIDU_MAP_KEY = ''

+ 19 - 0
.env.production

@@ -0,0 +1,19 @@
+###
+ # @Date: 2023-06-18 11:10:52
+ # @LastEditors: zhubj
+ # @LastEditTime: 2023-06-18 11:20:49
+ # @Description: 头部注释
+ # @FilePath: \own-vue3-vuecli-template\.env.production
+### 
+# 生产环境配置
+NODE_ENV = 'production'
+
+# 页面标题
+VUE_APP_TITLE = '页面标题'
+
+# 生产环境/重写路径(公共路径)
+VUE_APP_GENERAT_URL = 'http://123.60.219.66:9002'
+VUE_APP_BASE_URL = 'http://123.60.219.66:8086'
+
+# 百度地图KEY
+VUE_APP_BAIDU_MAP_KEY = ''

+ 24 - 0
.gitignore

@@ -0,0 +1,24 @@
+.DS_Store
+node_modules
+/dist
+/.history/
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 往事随风
+
+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.

+ 10 - 0
auto-imports.d.ts

@@ -0,0 +1,10 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+export {}
+declare global {
+  const ElMessage: typeof import('element-plus/es')['ElMessage']
+  const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
+}

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

+ 95 - 0
components.d.ts

@@ -0,0 +1,95 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+declare module 'vue' {
+  export interface GlobalComponents {
+    '2.5dEcharts': typeof import('./src/components/powerPredictionComponent/homePageAssembly/2.5dEcharts.vue')['default']
+    AllStationSettingPage: typeof import('./src/components/powerPredictionComponent/configPage/stationFlode/allStationSettingPage.vue')['default']
+    CalculationModelConfiguration: typeof import('./src/components/powerPredictionComponent/configPage/calculationModelConfiguration.vue')['default']
+    CollectionLineManagement: typeof import('./src/components/powerPredictionComponent/configPage/stationFlode/collectionLineManagement.vue')['default']
+    CommonHeaders: typeof import('./src/components/commonHeaders.vue')['default']
+    ConfigurationDesign: typeof import('./src/components/powerPredictionComponent/configPage/configurationDesign.vue')['default']
+    DayBatterDialog: typeof import('./src/components/powerPredictionComponent/batteryDivinerDialog/dayBatterDialog.vue')['default']
+    ElButton: typeof import('element-plus/es')['ElButton']
+    ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
+    ElCol: typeof import('element-plus/es')['ElCol']
+    ElContainer: typeof import('element-plus/es')['ElContainer']
+    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
+    ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDivider: typeof import('element-plus/es')['ElDivider']
+    ElDropdown: typeof import('element-plus/es')['ElDropdown']
+    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
+    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
+    ElEmpty: typeof import('element-plus/es')['ElEmpty']
+    ElForm: typeof import('element-plus/es')['ElForm']
+    ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElHeader: typeof import('element-plus/es')['ElHeader']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
+    ElOption: typeof import('element-plus/es')['ElOption']
+    ElProgress: typeof import('element-plus/es')['ElProgress']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
+    ElRow: typeof import('element-plus/es')['ElRow']
+    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElTable: typeof import('element-plus/es')['ElTable']
+    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
+    ElTooltip: typeof import('element-plus/es')['ElTooltip']
+    ElTree: typeof import('element-plus/es')['ElTree']
+    Excel: typeof import('./src/components/generatingCapacityComponent/excel.vue')['default']
+    ForecastReporting: typeof import('./src/components/powerPredictionComponent/configPage/forecastReporting.vue')['default']
+    GenerationPlan: typeof import('./src/components/powerPredictionComponent/configPage/generationPlan.vue')['default']
+    GlobalDialogPage: typeof import('./src/components/powerPredictionComponent/homePageAssembly/globalDialogPage.vue')['default']
+    ImportDailog: typeof import('./src/components/powerPredictionComponent/configPage/importPage/importDailog.vue')['default']
+    KMap: typeof import('./src/components/generatingCapacityComponent/kMap/index.vue')['default']
+    MenuManagement: typeof import('./src/components/powerPredictionComponent/configPage/menuManagement.vue')['default']
+    MenuTreeconfig: typeof import('./src/components/powerPredictionComponent/configPage/menuTreeconfig.vue')['default']
+    MHS: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/MHS.vue')['default']
+    MLiu: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/MLiu.vue')['default']
+    MonthAndYearBatterDialog: typeof import('./src/components/powerPredictionComponent/batteryDivinerDialog/monthAndYearBatterDialog.vue')['default']
+    NSS: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/NSS.vue')['default']
+    NumericalWeatherForecast: typeof import('./src/components/powerPredictionComponent/configPage/numericalWeatherForecast.vue')['default']
+    Nwu: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/Nwu.vue')['default']
+    Overview: typeof import('./src/components/powerPredictionComponent/configPage/Overview.vue')['default']
+    PanoramaPowerDialogPage: typeof import('./src/components/powerPredictionComponent/panoramicPowerDialog/panoramaPowerDialogPage.vue')['default']
+    PeriodManagement: typeof import('./src/components/powerPredictionComponent/configPage/stationFlode/periodManagement.vue')['default']
+    PersonManagement: typeof import('./src/components/powerPredictionComponent/configPage/personManagement.vue')['default']
+    PersonnelRole: typeof import('./src/components/powerPredictionComponent/configPage/personnelRole.vue')['default']
+    PredictionDialogPage: typeof import('./src/components/powerPredictionComponent/powerPredictionDialog/predictionDialogPage.vue')['default']
+    PreviewPicture: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/previewPicture.vue')['default']
+    QS: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/QS.vue')['default']
+    RegionalManagement: typeof import('./src/components/powerPredictionComponent/configPage/regionalManagement.vue')['default']
+    RightMenu: typeof import('./src/components/generatingCapacityComponent/kMap/rightMenu.vue')['default']
+    RoleManagement: typeof import('./src/components/powerPredictionComponent/configPage/roleManagement.vue')['default']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+    SBQ: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/SBQ.vue')['default']
+    SLiu: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/SLiu.vue')['default']
+    StandardizeTheManagement: typeof import('./src/components/powerPredictionComponent/configPage/standardizeTheManagement.vue')['default']
+    StationManagement: typeof import('./src/components/powerPredictionComponent/configPage/stationFlode/stationManagement.vue')['default']
+    StationPowerMeasurementPoint: typeof import('./src/components/powerPredictionComponent/configPage/stationPowerMeasurementPoint.vue')['default']
+    SubmitBtn: typeof import('./src/components/generatingCapacityComponent/SubmitBtn.vue')['default']
+    SvgIcon: typeof import('./src/components/powerPredictionComponent/svgIcon/index.vue')['default']
+    SvgPageShow: typeof import('./src/components/powerPredictionComponent/powerControlSvg/svgPageShow.vue')['default']
+    Table: typeof import('./src/components/generatingCapacityComponent/table.vue')['default']
+    Tree: typeof import('./src/components/generatingCapacityComponent/tree.vue')['default']
+    UnitManagement: typeof import('./src/components/powerPredictionComponent/configPage/unitManagement.vue')['default']
+    UnitMeasurementPoint: typeof import('./src/components/powerPredictionComponent/configPage/unitMeasurementPoint.vue')['default']
+    WeatherDetail: typeof import('./src/components/powerPredictionComponent/homePageAssembly/weatherDetail.vue')['default']
+    XLiu: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/XLiu.vue')['default']
+    XS: typeof import('./src/components/powerPredictionComponent/configPage/configDesignVue/XS.vue')['default']
+  }
+  export interface ComponentCustomProperties {
+    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
+  }
+}

+ 19 - 0
jsconfig.json

@@ -0,0 +1,19 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "module": "esnext",
+    "baseUrl": "./",
+    "moduleResolution": "node",
+    "paths": {
+      "@/*": [
+        "src/*"
+      ]
+    },
+    "lib": [
+      "esnext",
+      "dom",
+      "dom.iterable",
+      "scripthost"
+    ]
+  }
+}

File diff suppressed because it is too large
+ 18662 - 0
package-lock.json


+ 47 - 0
package.json

@@ -0,0 +1,47 @@
+{
+  "name": "own-vue3-vuecli-template",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build"
+  },
+  "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1",
+    "@element-plus/icons-vue": "^2.0.10",
+    "exceljs": "^4.3.0",
+    "file-saver": "^2.0.5",
+    "html2canvas": "^1.4.1",
+    "typescript": "^5.3.3",
+    "vuedraggable": "^4.1.0",
+    "xlsx": "^0.17.1",
+    "xlsx-js-style": "^1.2.0",
+    "xlsx-style": "^0.8.13",
+    "jspdf": "^2.5.1",
+    "echarts": "^5.3.2",
+    "axios": "^1.4.0",
+    "core-js": "^3.8.3",
+    "element-plus": "^2.3.6",
+    "js-cookie": "^3.0.5",
+    "nprogress": "^0.2.0",
+    "vue": "^3.2.13",
+    "vue-router": "^4.0.3",
+    "vuex": "^4.0.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~5.0.0",
+    "@vue/cli-plugin-router": "~5.0.0",
+    "@vue/cli-plugin-vuex": "~5.0.0",
+    "@vue/cli-service": "~5.0.0",
+    "cesium": "^1.110.1",
+    "eslint": "^7.32.0",
+    "eslint-plugin-vue": "^8.0.3",
+    "compression-webpack-plugin": "^10.0.0",
+    "less": "^3.9.0",
+    "less-loader": "^5.0.0",
+    "sass": "^1.32.7",
+    "sass-loader": "^12.0.0",
+    "unplugin-auto-import": "^0.16.4",
+    "unplugin-vue-components": "^0.25.1"
+  }
+}

BIN
public/favicon.ico


+ 24 - 0
public/index.html

@@ -0,0 +1,24 @@
+<!--
+ * @Date: 2023-06-18 10:09:15
+ * @LastEditors: zhubj
+ * @LastEditTime: 2023-06-18 11:23:46
+ * @Description: 头部注释
+ * @FilePath: \own-vue3-vuecli-template\public\index.html
+-->
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title><%= htmlWebpackPlugin.options.title %></title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 299 - 0
src/App.vue

@@ -0,0 +1,299 @@
+<!--
+ * @Date: 2023-06-18 10:09:15
+ * @LastEditors: zhubj
+ * @LastEditTime: 2023-06-19 17:04:11
+ * @Description: 头部注释
+ * @FilePath: \own-vue3-vuecli-template\src\App.vue
+-->
+<template>
+    <common-header v-if="showHeader" @headerName="headerName"></common-header>
+    <div class="menu-body" v-if="isShowMenuDiv" @mouseenter="showMenu" @mouseleave="hideMenu">
+        <ul class="menu-list">
+            <li class="menu-item" v-for="(menu, index) in showMenuData" :key="index"
+                @click="handleNodeClick(menu.index)">
+                <router-link :to="menu.index">
+                    <el-tooltip class="item" effect="dark" :content="menu.name" placement="bottom" :show-after="500"
+                        :enterable="false" hide-after="10">
+                        <component :is="menu.icon">
+                        </component>
+                    </el-tooltip>
+                </router-link>
+            </li>
+        </ul>
+    </div>
+    <div :style="{ paddingLeft: fixed ? '63px' : 0 }">
+        <router-view />
+    </div>
+</template>
+
+<script>
+    import commonHeader from '@/components/commonHeaders.vue'
+    export default {
+        components: {
+            commonHeader,
+        },
+        data() {
+            return {
+                showHeader: false,
+                showHeader: false,
+                loading: true,
+                isShowMenu: false,
+                isShowMenuDiv: false,
+                isFixed: false,
+                showMenuData: [],
+                powerPreDatas: [{
+                        index: '/powerPrediction/index',
+                        icon: 'Collection',
+                        name: '概要'
+                    },
+                    {
+                        index: '/powerPrediction/panoramicPower',
+                        icon: 'DataBoard',
+                        name: '全景功率'
+                    },
+                    {
+                        index: '/powerPrediction/power',
+                        icon: 'DataAnalysis',
+                        name: '功率预测'
+                    },
+                    {
+                        index: '/powerPrediction/batteryDiviner',
+                        icon: 'DataLine',
+                        name: '电量预测'
+                    },
+                    {
+                        index: '/powerPrediction/weather',
+                        icon: 'Sunrise',
+                        name: '天气预报'
+                    },
+                    {
+                        index: '/powerPrediction/statisticalSummary',
+                        icon: 'Tickets',
+                        name: '统计汇总'
+                    },
+                ],
+                generatingCapDatas: [{
+                    icon: 'Coin',
+                    index: '/generatingCap/dataFilter/prepare',
+                    name: '风电数据准备'
+                }, {
+                    icon: 'DataAnalysis',
+                    index: '/generatingCap/dataFilter/process',
+                    name: '风电数据处理'
+                }, {
+                    icon: 'Operation',
+                    index: '/generatingCap/dataAnalysis/combine',
+                    name: '功率曲线拟合分析'
+                }, {
+                    icon: 'ScaleToOriginal',
+                    index: '/generatingCap/dataAnalysis/rateAnalysis',
+                    name: '对风偏差分析'
+                }, {
+                    icon: 'DataLine',
+                    index: '/generatingCap/dataAnalysis/lineAnalysis',
+                    name: '曲线偏差率分析'
+                }, {
+                    icon: 'Odometer',
+                    index: '/generatingCap/dataAnalysis/hotAnalysis',
+                    name: '温度与功率分析'
+                }, {
+                    icon: 'Finished',
+                    index: '/generatingCap/dataAnalysis/windAnalysis',
+                    name: '损失电量分析'
+                }, {
+                    icon: 'Coordinate',
+                    index: '/generatingCap/dataAnalysis/posAnalysis',
+                    name: '微观选址分析'
+                }, {
+                    icon: 'SetUp',
+                    index: '/generatingCap/dataAnalysis/spaceAnalysis',
+                    name: '毛容量分析'
+                }, {
+                    icon: 'Suitcase',
+                    index: '/generatingCap/dataAnalysis/angleAnalysis',
+                    name: '浆距角分析'
+                }, {
+                    icon: 'Monitor',
+                    index: '/generatingCap/dataAnalysis/agcAnalysis',
+                    name: 'AGC曲线偏差分析'
+                }, ],
+                memuCloseTimeout: null,
+                fixed: false
+            }
+        },
+        watch: {
+            $route: {
+                handler: function (route) {
+                    this.showHeader = route.path === '/login' ? false : true
+                    this.isShowMenuDiv = route.path === '/login' || route.path === '/home' ? false : true
+                },
+                immediate: true
+            }
+        },
+        created() {
+            if (this.$route.path.indexOf('powerPrediction') > -1) {
+                this.showMenuData = this.powerPreDatas
+            } else if (this.$route.path.indexOf('generatingCap') > -1) {
+                this.showMenuData = this.generatingCapDatas
+            }
+        },
+        mounted() {
+            this.loadPage()
+        },
+        methods: {
+            headerName(name) {
+                this.showMenuData = []
+                if (name === '功率预测') {
+                    this.showMenuData = this.powerPreDatas
+                } else if (name === '发电能力分析') {
+                    this.showMenuData = this.generatingCapDatas
+                }
+            },
+            loadPage() {
+                setTimeout(() => {
+                    this.loading = false;
+                }, 1000);
+            },
+            showMenu() {
+                if (!this.fixed) {
+                    this.isShowMenu = true;
+                    window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
+                    clearTimeout(this.memuCloseTimeout);
+                    this.memuCloseTimeout = null;
+                }
+            },
+            hideMenu() {
+                if (!this.fixed) {
+                    this.memuCloseTimeout = setTimeout(() => {
+                        this.isShowMenu = false;
+                        window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
+                    }, 500);
+                }
+            },
+            handleNodeClick(index, indexPath) {
+                this.$router.push({
+                    path: index
+                })
+            },
+            handleClickFixed() {
+                this.fixed = !this.fixed
+                console.log('fixed===>>>>', this.fixed)
+                if (this.fixed) {
+                    this.isShowMenu = true
+                    window.sessionStorage.setItem('isShowMenu', this.isShowMenu)
+                }
+            }
+        }
+    }
+</script>
+
+<style lang="less">
+    @import "./assets/css/main.css";
+    @import "./assets/css/eleCss/index.less";
+
+    #app {
+        background: #040c0b;
+    }
+
+    .menu-body {
+        position: absolute;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: space-between;
+
+        flex: 0 0 63px;
+        width: 63px;
+        height: calc(100% - 60px);
+        top: 60px;
+        background-color: fade(#21192a, 75%);
+        z-index: 2002;
+        opacity: 0;
+        transition: opacity 0.2s;
+        transition-timing-function: ease-in;
+
+        &:hover {
+            opacity: 1;
+            transition: opacity 0.2s;
+            transition-timing-function: ease-out;
+            transform: translate(0);
+        }
+
+        .menu-list {
+            margin: 0;
+            padding: 0;
+            list-style: none;
+
+            .menu-item {
+                display: flex;
+                text-align: center;
+                line-height: 2;
+                padding: 12px 0;
+                width: 25px;
+                height: 25px;
+
+                .el-tooltip__trigger {
+                    color: #fff;
+                }
+
+                a {
+                    display: flex;
+                    width: 100%;
+                    height: 100%;
+                    font-size: 14px;
+                    text-decoration: unset;
+                    white-space: nowrap;
+
+                    .menu-icon {
+                        display: flex;
+                        align-items: center;
+
+                        svg {
+                            width: 14px;
+                            height: 14px;
+
+                            use {
+                                fill: fade(#05bb4c, 75);
+                            }
+                        }
+                    }
+                }
+
+                &.active {
+                    background: #323e70;
+
+                    .menu-icon {
+                        display: flex;
+
+                        svg use {
+                            fill: fade(#fff, 75);
+                        }
+                    }
+                }
+
+                .sub-menu-text {
+                    margin-left: 10px;
+                    color: #B3BDC0;
+                }
+
+                &+.menu-item {
+                    border-top: 1px solid fade(#606769, 40);
+                }
+            }
+        }
+
+        .lockpage {
+            position: absolute;
+            bottom: 20px;
+
+            .el-icon {
+                color: #fff;
+
+                svg {
+                    width: 25px;
+                    height: 25px;
+                }
+            }
+        }
+    }
+</style>

File diff suppressed because it is too large
+ 1014 - 0
src/api/api.js


+ 43 - 0
src/api/gengra.js

@@ -0,0 +1,43 @@
+import httpRequest from '@/utils/request.js'
+httpRequest.defaults.baseURL = process.env.VUE_APP_GENERAT_URL;
+
+// 风电数据准备页面
+export function apiGetbaseStation() {
+    return httpRequest({
+        url: 'base/station',
+        method: 'get'
+    })
+}
+
+export function apiGetbaseWindturbine(params) {
+    return httpRequest({
+        url: 'base/windturbine',
+        method: 'get',
+        params: params
+    })
+}
+
+export function apiGetpowerpreparedata(params) {
+    return httpRequest({
+        url: 'power/prepare/data',
+        method: 'get',
+        params: params
+    })
+}
+
+export function apiGetpowerpreparetree() {
+    return httpRequest({
+        url: 'power/prepare/tree',
+        method: 'get'
+    })
+}
+
+export function apiGetpowerprepareshow(params) {
+    return httpRequest({
+        url: 'power/prepare/show',
+        method: 'get',
+        params: params
+    })
+}
+
+//******************************end*******************************************//

+ 36 - 0
src/api/login.js

@@ -0,0 +1,36 @@
+/*
+ * @Date: 2023-06-19 09:02:19
+ * @LastEditors: zhubj
+ * @LastEditTime: 2023-06-19 09:07:37
+ * @Description: 头部注释
+ * @FilePath: \own-vue3-vuecli-template\src\api\login.js
+ */
+import request from '../utils/request.js'
+
+// 登录
+export function login(data) {
+  return request({
+    url: '/login',
+    headers: {
+      isToken: false
+    },
+    method: 'post',
+    data: data
+  })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+  return request({
+    url: '/getInfo',
+    method: 'get'
+  })
+}
+
+// 退出登录
+export function logout() {
+  return request({
+    url: '/logout',
+    method: 'post'
+  })
+}

+ 13 - 0
src/assets/css/eleCss/el-card.less

@@ -0,0 +1,13 @@
+.main-body {
+  .el-card {
+    background: transparent;
+    border-color: fade(@gray, 50);
+    border-radius: 0;
+
+    .el-card__header {
+      color: @gray-l;
+      background: fade(@gray, 20);
+      border: none;
+    }
+  }
+}

+ 486 - 0
src/assets/css/eleCss/el-input.less

@@ -0,0 +1,486 @@
+@green: #05bb4c;
+@yellow: #edbf03;
+@blue: #1a93cf;
+@darkBlue: #4b55ae;
+@darkBlue2: #1529E9;
+@darkgray: #606769;
+@gray: #606769;
+@gray-l: #B3BDC0;
+@black: #000000;
+@write: #ffffff;
+@ligntRed: #ff7a7f;
+@red: #BA3237;
+@darkRed: #710f14;
+@purple: #4b55ae;
+@orange: #e17e23;
+@white: #ffffff;
+@pink: #c531c7;
+@picker-bg-color: fade(#121d1c, 95);
+
+body {
+    .generat-seach {
+        .el-form-item {
+            .el-form-item__label {
+                color: #fff;
+            }
+        }
+    }
+
+    .el-input__inner {
+        background: #606769;
+        color: #B3BDC0;
+    }
+
+    .el-input__wrapper {
+        background: #606769;
+    }
+
+    .el-select-dropdown {
+        background: #606769;
+
+        .el-scrollbar {
+            .el-select-dropdown__wrap {
+                .el-select-dropdown__list {
+                    .el-select-dropdown__item {
+                        background: #606769;
+                        color: #fff;
+                    }
+
+                    .selected {
+                        background: #606769;
+                    }
+
+                    .hover {
+                        background: #504bb5;
+                    }
+                }
+            }
+        }
+    }
+
+    .el-select-tags-wrapper .el-tag {
+        background: #4a4d4e;
+    }
+
+    .el-input {
+        &.is-disabled .el-input__inner {
+            background: #606769;
+            border-color: @gray;
+            color: @gray;
+            cursor: not-allowed;
+        }
+
+        &.is-in-pagination .el-input__inner[type="number"] {
+            width: 48px;
+        }
+
+        .el-input__inner[type="number"] {
+
+            &::-webkit-textfield-decoration-container {
+                appearance: none;
+            }
+
+            &::-webkit-inner-spin-button,
+            &::-webkit-outer-spin-button {
+                appearance: none;
+            }
+        }
+    }
+
+    // 数字组件
+    .el-input-number {
+        &.is-controls-right {
+            .el-input-number__increase {
+                border-bottom: 1px solid @gray;
+            }
+
+            .el-input-number__decrease,
+            .el-input-number__increase {
+                line-height: 15px;
+                color: @gray-l;
+                background: fade(@gray, 40);
+                border-left: 1px solid @gray;
+            }
+        }
+    }
+
+    // 日期组件
+    .el-date-editor {
+        --el-date-editor-daterange-width: 480px;
+
+        &.is-active,
+        &.is-active:hover,
+        &.is-focus .el-input__inner {
+            border-color: @green;
+        }
+
+        &.el-date-editor--datetimerange {
+            border: 1px solid fade(@gray, 20);
+            height: 33px;
+            padding: 0 8px;
+            width: 369px;
+
+            .el-range-separator {
+                color: @gray-l;
+                line-height: 33px;
+            }
+
+            .el-range-input {
+                flex-basis: 145px;
+                line-height: 33px;
+                background: transparent;
+                color: @gray-l;
+
+                &::placeholder {
+                    text-align: center;
+                    color: @gray-l;
+                }
+            }
+        }
+    }
+
+    // 单选框
+    .el-radio {
+        color: @gray-l;
+
+        &.is-checked {
+            .el-radio__inner {
+                background: @green;
+                border-color: @green;
+            }
+
+            .el-radio__label {
+                color: @green;
+            }
+        }
+
+        &.is-bordered.is-checked {
+            border-color: @green;
+        }
+
+        &:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner {
+            box-shadow: 0 0 2px 2px @green;
+        }
+    }
+
+    // 单选框组
+    .el-radio-group {
+        height: 33px;
+
+        &>.el-radio {
+            line-height: 33px;
+        }
+    }
+
+    .el-checkbox {
+        height: 33px;
+        line-height: 33px;
+        color: @gray-l;
+
+        &.is-bordered {
+            height: 33px;
+            line-height: 33px;
+            padding: 0px 20px;
+            border-color: @gray;
+
+            &.is-checked {
+                border-color: @green;
+            }
+        }
+
+        .el-checkbox__inner {
+            background: fade(@gray, 20);
+            border-color: fade(@gray, 40);
+        }
+
+        .el-checkbox__input.is-checked+.el-checkbox__label {
+            color: @green;
+        }
+
+        .el-checkbox__input.is-checked .el-checkbox__inner,
+        .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+            background-color: @green;
+            border-color: @green;
+        }
+
+        .el-checkbox__input.is-focus .el-checkbox__inner {
+            border-color: @green;
+        }
+    }
+
+    .warn-table {
+        .el-checkbox__input.is-checked+.el-checkbox__label {
+            color: #d35400;
+        }
+
+        .el-checkbox__input.is-checked .el-checkbox__inner,
+        .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+            background-color: #d35400;
+            border-color: #d35400;
+        }
+
+        .el-checkbox__input.is-focus .el-checkbox__inner {
+            border-color: #d35400;
+        }
+    }
+
+    // 树组件
+    .el-tree {
+        color: @gray-l;
+        background: fade(@gray, 20);
+
+        .el-tree-node {
+            .el-tree-node__content:hover {
+                background: transparent;
+            }
+        }
+
+        .el-checkbox__inner {
+            background: transparent;
+            border-color: @gray;
+        }
+
+        .el-tree-node:focus>.el-tree-node__content {
+            background: transparent;
+        }
+
+        .el-checkbox__input.is-disabled .el-checkbox__inner {
+            background: @gray;
+            border-color: @gray;
+        }
+
+        &.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
+            background: transparent;
+            color: @green;
+        }
+
+        .el-tree-node__content:hover,
+        .el-upload-list__item:hover {
+            background: transparent;
+            color: @green;
+        }
+
+        .el-checkbox__inner:hover {
+            border-color: @green;
+        }
+
+        .el-checkbox__input.is-focus .el-checkbox__inner {
+            border-color: @green;
+        }
+
+        .el-checkbox__input.is-checked .el-checkbox__inner,
+        .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+            background: @green;
+            border-color: @green;
+        }
+    }
+
+    // Cascader 级联选择器
+    .el-cascader {
+        line-height: 30px;
+
+        .el-cascader__tags {
+            .el-tag {
+                color: white;
+                background-color: fade(@green, 50);
+
+                .el-icon-close {
+                    background-color: fade(@green, 50);
+                }
+            }
+        }
+
+        .el-input__suffix {
+            right: 0px;
+        }
+    }
+
+    .el-select {
+        .el-input.is-focus .el-input__inner {
+            border-color: @green;
+        }
+
+        .el-input__inner:focus {
+            border-color: @green;
+        }
+    }
+
+    .el-select .el-select__tags .el-tag {
+        background: #000;
+    }
+
+    .el-select .el-select__tags .el-tag .el-icon-close {
+        background-color: transparent;
+        border: 1px solid #fff;
+    }
+
+    .el-popper {
+        &.el-cascader__dropdown[role="tooltip"] {
+            background: @picker-bg-color;
+            border-color: @picker-bg-color;
+
+            .el-cascader-menu {
+                border-color: @gray;
+            }
+
+            .el-cascader-node:not(.is-disabled):focus,
+            .el-cascader-node:not(.is-disabled):hover {
+                background: fade(@green, 20);
+                color: @green;
+            }
+
+            .el-cascader-node.in-active-path,
+            .el-cascader-node.is-active,
+            .el-cascader-node.is-selectable.in-checked-path {
+                color: @green;
+            }
+        }
+
+        &.el-select__popper[role="tooltip"] {
+            border-color: @picker-bg-color;
+            background: @picker-bg-color;
+
+            .el-cascader-menu {
+                border-color: @gray;
+            }
+
+            .el-select-dropdown__item.hover,
+            .el-select-dropdown__item:hover {
+                background: fade(@green, 20);
+                color: @green;
+            }
+
+            .el-select-dropdown__item.selected {
+                background: transparent;
+                color: @green;
+            }
+        }
+    }
+}
+
+.el-picker__popper.el-popper[role="tooltip"] {
+    border-color: @picker-bg-color !important;
+    background: @picker-bg-color !important;
+}
+
+.el-picker-panel {
+
+    // el datetimerange  picker Start
+    &.el-date-range-picker {
+        color: @gray-l;
+        background: transparent;
+
+        .el-date-range-picker__time-header {
+            border-color: @gray;
+
+            .el-icon-arrow-right {
+                color: @gray-l;
+            }
+
+            .el-input__inner {
+                background: fade(@gray, 20);
+                color: @gray-l;
+                border-color: @gray;
+            }
+
+            .el-date-range-picker__time-picker-wrap {
+                .el-time-panel {
+                    background-color: @picker-bg-color;
+
+                    .el-time-spinner__item.active:not(.disabled) {
+                        color: @green;
+                    }
+
+                    .el-time-spinner__item:hover:not(.disabled):not(.active) {
+                        background: transparent;
+                        color: @green;
+                    }
+                }
+
+                .el-time-panel__btn.confirm {
+                    color: @green;
+                }
+
+                .el-time-panel__btn.cancel {
+                    color: @gray;
+                }
+            }
+        }
+
+        .el-date-range-picker__content {
+            border-color: @gray;
+
+            .el-date-table {
+                th {
+                    color: @gray-l;
+                }
+
+                td {
+                    &.available:hover {
+                        color: @green;
+                    }
+
+                    &.in-range div,
+                    &.in-range div:hover {
+                        background: fade(@gray, 40);
+                    }
+
+                    &.end-date span,
+                    &.start-date span {
+                        background: @green;
+                    }
+
+                    &.today {
+                        span {
+                            color: @green;
+                        }
+
+                        &.end-date span,
+                        &.start-date span {
+                            color: @white;
+                        }
+                    }
+
+                    &.next-month,
+                    &.prev-month {
+                        color: @gray;
+                    }
+                }
+            }
+        }
+    }
+
+    // el datetimerange  picker End
+
+    .el-picker-panel__body {
+        border-color: @gray;
+    }
+
+    .el-picker-panel__footer {
+        background: transparent;
+        border-color: @gray;
+
+        .el-button--text {
+            color: @gray;
+        }
+
+        .el-button.is-plain {
+            background: transparent;
+            border-color: @green;
+            color: @green;
+        }
+    }
+
+    .el-time-panel__btn.confirm {
+        color: @green;
+    }
+
+    .el-time-panel__btn.cancel {
+        color: @gray;
+    }
+}
+
+.el-popper__arrow::before {
+    background: fade(#121d1c, 95) !important;
+    border: 1px solid fade(#121d1c, 95) !important;
+}

+ 50 - 0
src/assets/css/eleCss/el-pagination.less

@@ -0,0 +1,50 @@
+.main-body {
+    .el-pagination {
+        display: flex;
+        justify-content: flex-end;
+        align-items: center;
+        color: #b3bdc0;
+
+        .el-pagination__total {
+            color: #b3bdc0;
+        }
+
+        .el-pagination__jump {
+            color: #b3bdc0;
+        }
+
+        button {
+
+            &.btn-next,
+            &.btn-prev {
+                background: center center no-repeat fade(@gray, 20);
+                color: @gray-l;
+            }
+
+            &:disabled {
+                color: @gray-l;
+                background-color: fade(@gray, 20);
+                cursor: not-allowed;
+            }
+        }
+
+        .el-pager li {
+            color: @gray-l;
+            background: fade(@gray, 20);
+
+            &.active {
+                color: @green;
+            }
+        }
+
+        .el-input__inner {
+            color: @gray-l;
+            background: fade(@gray, 20);
+            border: 1px solid fade(@gray, 20);
+        }
+
+        .el-pagination__sizes .el-input .el-input__inner:hover {
+            border-color: @green;
+        }
+    }
+}

+ 13 - 0
src/assets/css/eleCss/el-popper.less

@@ -0,0 +1,13 @@
+.el-popper {
+    .el-menu--vertical {
+        background: #161f1e;
+
+        .el-menu {
+            .el-menu-item {
+                height: 30px;
+                line-height: 30px;
+                color: #fff;
+            }
+        }
+    }
+}

+ 144 - 0
src/assets/css/eleCss/el-table.less

@@ -0,0 +1,144 @@
+.main-body,
+.warn-table,
+.df-table {
+
+    .el-table,
+    .custom-table.el-table {
+        background: transparent;
+        border: 0px;
+
+        &.el-table--border::after,
+        &.el-table--group::after,
+        &::before {
+            background-color: transparent;
+        }
+
+        tr {
+            &:hover {
+                td {
+                    color: @green;
+                    background-color: transparent !important;
+                }
+            }
+        }
+
+        td {
+            border: 0px;
+            padding: 0;
+            height: 37px;
+            line-height: 37px;
+            color: #b3bdc0;
+
+            &.light,
+            &.always-light {
+                color: @green !important;
+            }
+        }
+
+        th {
+            border: 0px;
+            padding: 0px;
+            height: 37px;
+            line-height: 37px;
+            font-weight: normal;
+            text-align: center;
+            color: @gray-l;
+            cursor: pointer;
+
+            &.is-leaf {
+                border: 0px;
+            }
+
+            &.light,
+            &.always-light {
+                color: @green !important;
+            }
+        }
+
+        th,
+        tr {
+            background-color: transparent;
+            border: 0px;
+        }
+
+        thead {
+            color: @gray-l;
+            font-weight: 500;
+            font-size: 14px;
+            border: 0px;
+
+            th,
+            &.is-group th {
+                &.el-table__cell {
+                    background: #282f31;
+                }
+            }
+        }
+
+        .el-table__body {
+            border: 0px;
+            font-size: 14px;
+        }
+
+        &.el-table--striped .el-table__body tr.el-table__row--striped {
+            &:hover td {
+                background-color: fade(@gray, 20) !important;
+            }
+
+            td {
+                background-color: fade(@gray, 20);
+            }
+        }
+
+        &.el-table--border,
+        &.el-table--group {
+            border: none;
+        }
+
+        .ascending .sort-caret.ascending {
+            border-bottom-color: @green;
+        }
+
+        .descending .sort-caret.descending {
+            border-top-color: @green;
+        }
+    }
+
+    .el-table__expanded-cell {
+        background: transparent;
+    }
+
+    .el-table__footer-wrapper tbody td {
+        background: #1a1f2fcc;
+    }
+}
+
+.warn-table {
+    .el-table {
+        thead th.el-table__cell {
+            background: rgba(83, 89, 104, 0.3);
+        }
+
+        &.el-table--striped .el-table__body tr.el-table__row--striped td {
+            background-color: #161415;
+        }
+
+        tr {
+            &.isConfirm {
+                &:hover {
+                    td {
+                        color: #05bb4c !important;
+                        background-color: transparent !important;
+                    }
+                }
+            }
+
+            &:hover {
+                td {
+                    color: #d35400 !important;
+                    background-color: transparent !important;
+                }
+            }
+        }
+    }
+}

+ 6 - 0
src/assets/css/eleCss/index.less

@@ -0,0 +1,6 @@
+@import "./el-card.less";
+@import "./el-pagination.less";
+@import "./el-pagination.less";
+@import "./el-input.less";
+@import "./el-table.less";
+@import "./el-popper.less";

+ 80 - 0
src/assets/css/main.css

@@ -0,0 +1,80 @@
+* {
+    margin: 0;
+    padding: 0;
+}
+
+html,
+body,
+#app,
+.wrapper {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+}
+
+body {
+    font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'microsoft yahei', arial, STHeiTi, sans-serif;
+}
+
+a {
+    text-decoration: none;
+}
+
+.content {
+    width: auto;
+    height: 100%;
+    padding: 5px;
+    overflow-y: auto;
+    overflow-x: hidden;
+    box-sizing: border-box;
+}
+
+.content-collapse {
+    left: 65px;
+}
+
+.container {
+    padding: 30px;
+    background: #fff;
+    border: 1px solid #ddd;
+    border-radius: 5px;
+}
+
+.crumbs {
+    margin: 10px 0;
+}
+
+.el-table th {
+    background-color: #161f1e !important;
+    color: #fff;
+    height: 40px;
+}
+.el-table tr {
+    height: 40px;
+}
+.el-table tr{
+    background: #161f1e !important;
+}
+.el-table tr td{
+    color: #fff !important;
+}
+.el-table tr:hover {
+    background: #161f1e;
+}
+
+/* 滚动条的宽度 */
+
+::-webkit-scrollbar {
+    width: 6px;
+    height: 8px;
+    background-color: #e4e4e4;
+    border-radius: 6px;
+}
+
+
+/* 滚动条的滑块 */
+
+::-webkit-scrollbar-thumb {
+    background-color: #a9aaad;
+    border-radius: 6px;
+}

BIN
src/assets/iconNeed/iconFont.png


BIN
src/assets/images/base/404.png


BIN
src/assets/images/base/404_cloud.png


BIN
src/assets/logoGuo_DB.png


BIN
src/assets/weather/cloudy.png


BIN
src/assets/weather/overcast.png


BIN
src/assets/weather/rain.png


BIN
src/assets/weather/rainBlue.png


BIN
src/assets/weather/rainOrange.png


BIN
src/assets/weather/rainRed.png


BIN
src/assets/weather/rainYellow.png


BIN
src/assets/weather/snow.png


BIN
src/assets/weather/snowBlue.png


BIN
src/assets/weather/snowOrange.png


BIN
src/assets/weather/snowRed.png


BIN
src/assets/weather/snowYellow.png


BIN
src/assets/weather/sunshine.png


BIN
src/assets/weather/thunder.png


BIN
src/assets/weather/thunderOrange.png


BIN
src/assets/weather/thunderRed.png


BIN
src/assets/weather/thunderYellow.png


BIN
src/assets/weather/windBlue.png


BIN
src/assets/weather/windOrange.png


BIN
src/assets/weather/windRed.png


BIN
src/assets/weather/windYellow.png


BIN
src/assets/windFramPicture/Icon_green.png


BIN
src/assets/windFramPicture/Icon_grey.png


BIN
src/assets/windFramPicture/Icon_organge.png


BIN
src/assets/windFramPicture/Icon_purple.png


BIN
src/assets/windFramPicture/Icon_red.png


BIN
src/assets/windFramPicture/Icon_redgray.png


BIN
src/assets/windFramPicture/back1.jpg


BIN
src/assets/windFramPicture/back2.jpg


BIN
src/assets/windFramPicture/back3.jpg


BIN
src/assets/windFramPicture/background1.jpg


BIN
src/assets/windFramPicture/baojing.png


BIN
src/assets/windFramPicture/guzhang.png


BIN
src/assets/windFramPicture/indexPage1.png


BIN
src/assets/windFramPicture/indexPage2.png


BIN
src/assets/windFramPicture/indexPage3.png


BIN
src/assets/windFramPicture/indexPage4.png


BIN
src/assets/windFramPicture/indexPage4x.png


BIN
src/assets/windFramPicture/jingzhun.png


BIN
src/assets/windFramPicture/mahuangshanDQ.png


BIN
src/assets/windFramPicture/mahuangshan_v.png


BIN
src/assets/windFramPicture/member.png


BIN
src/assets/windFramPicture/niushoushan_v.png


BIN
src/assets/windFramPicture/nodata.jpeg


BIN
src/assets/windFramPicture/qiciPic.png


BIN
src/assets/windFramPicture/qiciPic2.png


BIN
src/assets/windFramPicture/qiciPic3.png


BIN
src/assets/windFramPicture/qingshan_v.png


BIN
src/assets/windFramPicture/rain.png


BIN
src/assets/windFramPicture/run_Icon.gif


BIN
src/assets/windFramPicture/shibanquan_v.png


BIN
src/assets/windFramPicture/sun.png


BIN
src/assets/windFramPicture/wturStatus.png


BIN
src/assets/windFramPicture/xiangshanDQ.png


BIN
src/assets/windFramPicture/xiangshan_v.png


BIN
src/assets/windFramPicture/yichang.png


BIN
src/assets/windFramPicture/zhunquelv.png


BIN
src/assets/windStatusPic/000.png


BIN
src/assets/windStatusPic/0003.png


BIN
src/assets/windStatusPic/001.png


BIN
src/assets/windStatusPic/002.png


BIN
src/assets/windStatusPic/003.png


BIN
src/assets/windStatusPic/004.png


BIN
src/assets/windStatusPic/005.png


BIN
src/assets/windStatusPic/006.png


+ 350 - 0
src/components/commonHeaders.vue

@@ -0,0 +1,350 @@
+<template>
+    <div class="proheader">
+        <el-container>
+            <el-header :class="getStyle()">
+                <div class="logoSty">
+                    <img src="../assets/logoGuo_DB.png" alt="">
+                </div>
+                <div class="proMenu">
+                    <el-button-group>
+                        <el-button type="primary" v-for="(item,index) in menuData" :key="index" :icon="item.icon"
+                            :class="getColor(item.showBac)" @click="changeRoute(item)">
+                            {{item.name}}
+                        </el-button>
+                    </el-button-group>
+                    <div class="userMsg">
+                        <!-- <span style="margin-right: 10px">{{userName}}</span> -->
+                        <el-tooltip class="box-item" effect="light" content="用户设置">
+                            <el-icon :size="size" :color="color" @click="changePersonRole">
+                                <Avatar />
+                            </el-icon>
+                        </el-tooltip>
+                    </div>
+                    <div class="divider" style="margin: 0 20px">|</div>
+                    <div class="settingStop">
+                        <!-- @click="changeSetting" -->
+                        <el-tooltip class="box-item" effect="light" content="系统设置">
+                            <el-icon size="small" :color="color" @click="changeSetting">
+                                <Setting />
+                            </el-icon>
+                        </el-tooltip>
+                        <el-tooltip class="box-item" effect="light" content="退出">
+                            <el-icon :size="size" :color="color" @click="backLogin" style="margin: 0 15px">
+                                <SwitchButton />
+                            </el-icon>
+                        </el-tooltip>
+                    </div>
+                </div>
+            </el-header>
+        </el-container>
+    </div>
+</template>
+
+<script>
+    import httpRequest from '@/utils/request.js'
+    import {
+        apiGetpersonalInformation
+    } from '@/api/api'
+    import {
+        removeToken
+    } from '@/utils/auth'
+    export default {
+        name: 'headerCom',
+        data() {
+            return {
+                leftIndex: '1',
+                currentTime: '',
+                showRole: true,
+                menuData: [],
+                rainW: false,
+                userName: ''
+            }
+        },
+        created() {
+            this.menuData = [{
+                    index: '/home',
+                    icon: 'Menu',
+                    name: '首页',
+                    showBac: true
+                },
+                {
+                    index: '/generatingCap/dataFilter/prepare',
+                    icon: 'Histogram',
+                    name: '发电能力分析'
+                },
+                {
+                    index: '/weather',
+                    icon: 'PictureFilled',
+                    name: '智能报表'
+                },
+                {
+                    index: '/powerPrediction/index',
+                    icon: 'TrendCharts',
+                    name: '功率预测'
+                },
+            ]
+        },
+        mounted() {
+            let that = this;
+            let userMes = JSON.parse(window.sessionStorage.getItem('userMessage'))
+            that.userName = userMes ? userMes.role : 'administrator'
+            if (this.$route.query.markKey) {
+                that.userName = that.$route.query.userid
+            }
+            if (userMes && userMes.role === 'ordinaryUser') {
+                that.showRole = false
+            }
+            // that.getUserMes(userMes.userId)
+        },
+        watch: {
+            $route: {
+                handler: function (route) {
+                    console.log('route', route)
+                    this.menuData.forEach(it => {
+                        if (route.path.indexOf('powerPrediction') > -1) {
+                            httpRequest.defaults.baseURL = process.env.VUE_APP_BASE_URL;
+                            if (it.name === '功率预测') {
+                                it.showBac = true
+                            } else {
+                                it.showBac = false
+                            }
+                        } else if (route.path.indexOf('generatingCap') > -1) {
+                            httpRequest.defaults.baseURL = process.env.VUE_APP_GENERAT_URL;
+                            if (it.name === '发电能力分析') {
+                                it.showBac = true
+                            } else {
+                                it.showBac = false
+                            }
+                        } else if (route.path === '/index') {
+                            if (it.name === '首页') {
+                                it.showBac = true
+                            } else {
+                                it.showBac = false
+                            }
+                        } else {
+                            it.showBac = false
+                        }
+                    })
+                },
+                immediate: true
+            }
+        },
+        methods: {
+            changeRoute(item) {
+                if (item.name === '智能营销') {
+                    let url = ''
+                    if (location.origin.indexOf('10.15.32.7') !== -1) {
+                        url = location.origin + '/#/dashboard/marketBoundary' + `?userid=uuu&markKey=YXSSO`
+                    } else {
+                        url = item.index
+                    }
+                    window.open(url, '_self')
+                } else {
+                    window.sessionStorage.setItem('headerRoute', item.index)
+                    this.$router.push({
+                        path: item.index
+                    })
+                }
+                this.$emit('headerName', item.name)
+            },
+            async backLogin() {
+                let loginName = this.userName
+                if (loginName) {
+                    await this.LogoutInfor(loginName)
+                }
+            },
+            // 插入登出信息
+            LogoutInfor(name) {
+                let that = this
+                let onlyData = JSON.parse(window.sessionStorage.getItem('userDatamsg'))
+                let loginData = JSON.parse(window.sessionStorage.getItem('loginMsg'))
+                if (onlyData) {
+                    let paramsLogin = onlyData ? onlyData.identifier : loginData.identific
+                    let params = {
+                        identifier: paramsLogin,
+                        loginName: name
+                    }
+                    apiGetinsertLogoutInformation(params).then(datas => {
+                        if (datas) {
+                            let url = location.origin + '/#/login'
+                            window.open(url, '_self')
+                            location.reload()
+                            removeToken()
+                        }
+                    })
+                } else {
+                    let url = location.origin + '/#/login'
+                    window.open(url, '_self')
+                    location.reload()
+                    removeToken()
+                }
+
+            },
+            changeSetting() {
+                this.$router.push({
+                    path: '/systemSettings/Overview'
+                })
+            },
+            changePersonRole() {
+                this.$router.push({
+                    path: '/personnelRole'
+                })
+            },
+            getStyle() {
+                if (this.$route.path === '/weather') {
+                    if (this.rainW) {
+                        return 'weatherSty'
+                    } else {
+                        return 'headerSty'
+                    }
+                }
+            },
+            getColor(val) {
+                let strWea = ''
+                if (val) {
+                    strWea = 'changeBacksty'
+                } else {
+                    strWea = 'defaultBacksty'
+                }
+                return strWea
+            },
+            //获取个人信息
+            getUserMes(id) {
+                let params = {
+                    userId: id
+                }
+                apiGetpersonalInformation(params).then(datas => {
+                    window.sessionStorage.setItem('userInfo', JSON.stringify(datas.data.user))
+                })
+            },
+            changeDate(date) {
+                var y = date.getFullYear();
+                var m = date.getMonth() + 1;
+                m = m < 10 ? ('0' + m) : m;
+                var d = date.getDate();
+                d = d < 10 ? ('0' + d) : d;
+                var h = date.getHours();
+                h = h < 10 ? ('0' + h) : h;
+                var minute = date.getMinutes();
+                minute = minute < 10 ? ('0' + minute) : minute;
+                var second = date.getSeconds();
+                second = second < 10 ? ('0' + second) : second;
+                return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
+            },
+            nowTime() {
+                let that = this;
+                let date = new Date()
+                this.statusTimer = setInterval(function () {
+                    var y = date.getFullYear();
+                    var m = date.getMonth() + 1;
+                    m = m < 10 ? ('0' + m) : m;
+                    var d = date.getDate();
+                    d = d < 10 ? ('0' + d) : d;
+                    var h = date.getHours();
+                    h = h < 10 ? ('0' + h) : h;
+                    var minute = date.getMinutes();
+                    minute = minute < 10 ? ('0' + minute) : minute;
+                    var second = date.getSeconds();
+                    second = second < 10 ? ('0' + second) : second;
+                    that.currentTime = y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
+                }, 1000)
+            },
+            handleSelect(index) {
+                if (this.leftIndex === index) return
+                this.leftIndex = index
+                // this.$router.push({path: index})
+                console.log(index)
+            }
+        }
+    }
+</script>
+
+<style lang="less">
+    .proheader {
+        // position: fixed;
+        // top: 0;
+        width: 100%;
+        z-index: 1999;
+        height: 60px;
+
+        .weatherSty {
+            background: rgb(74, 87, 100);
+        }
+
+        .headerSty {
+            // background: rgb(13, 104, 188);
+            // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#373590), to(#645fef));
+        }
+
+        .el-header {
+            padding: 0 10px;
+            display: flex;
+            justify-content: space-between;
+            // background: rgb(13, 104, 188);
+            // background: rgba(96,103,105,.75);
+            color: #fff;
+            line-height: 60px;
+            height: 60px !important;
+
+            .logoSty {
+                padding: 10px 0 0 0;
+
+                img {
+                    width: 310px;
+                }
+            }
+
+            .proMenu {
+                display: flex;
+                align-items: center;
+
+                .el-button-group {
+                    .changeBacksty {
+                        background: linear-gradient(0deg, transparent, #000);
+                    }
+
+                    .defaultBacksty {
+                        background-color: #000 !important;
+                    }
+
+                    .defaultweathersty {
+                        background-color: #0d68bc !important;
+                    }
+
+                    .defaultweatherRainsty {
+                        background-color: #4a5764 !important;
+                    }
+
+                    .el-button {
+                        background-color: #373590;
+                        border-color: #8679df;
+                        padding: 0 20px;
+
+                        &:hover {
+                            background-color: #504bb5;
+                        }
+                    }
+                }
+
+                .userMsg {
+                    margin-left: 150px;
+
+                    .el-icon {
+                        cursor: pointer;
+                    }
+                }
+
+                .divider {
+                    position: relative;
+                    top: -3px;
+                }
+
+                .settingStop {
+                    .el-icon {
+                        cursor: pointer;
+                    }
+                }
+            }
+        }
+    }
+</style>

+ 16 - 0
src/components/generatingCapacityComponent/SubmitBtn.vue

@@ -0,0 +1,16 @@
+<script setup name="SubmitBtn">
+const props = defineProps({
+	desc: {
+		type: String,
+		default: ''
+	},
+	type: {
+		type: String,
+		default: 'primary'
+	}
+})
+</script>
+<template>
+	<!-- <div class="h-[24px] flex justify-center items-center text-white bg-[rgba(0,70,199,0.5)] px-[15px] cursor-pointer text-[14px] rounded-[13px]">{{props.desc}}</div> -->
+	<el-button :type="type">{{props.desc}}</el-button>
+</template>

+ 102 - 0
src/components/generatingCapacityComponent/excel.vue

@@ -0,0 +1,102 @@
+<template>
+    <div class="excelData" :style="{ height: height, overflow: 'auto' }">
+        <el-empty v-if="!data.length" description="暂无数据" />
+        <el-checkbox-group size="small" v-model="excelCheckIds" v-if="showCheckbox" @change="funCheckChange">
+            <el-checkbox :class="{'!bg-[rgb(236,245,255)]': currentId === item.id}" size="small"
+                class="hover:bg-[rgb(245,247,250)] !mr-0 py-[3px]" :label="item.id" v-for="item in data"
+                :key="item.name">
+                <span
+                    class="whitespace-nowrap cursor-pointer font-bold text-[12px] align-middle inline-flex items-center"
+                    @click.stop="funExcelChange(item)">
+                    <el-icon>
+                        <Document />
+                    </el-icon>{{ item.name }}
+                </span>
+            </el-checkbox>
+        </el-checkbox-group>
+        <div v-else>
+            <div class="excelDataNoCheck" v-for="item in data" :key="item.name"
+                :class="{'!bg-[rgb(236,245,255)]': currentId === item.id}" @click="funExcelChange(item)">
+                <el-icon>
+                    <Document />
+                </el-icon>{{ item.name }}
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        props: {
+            data: {
+                type: Array,
+                default: () => {
+                    return [];
+                },
+            },
+            height: {
+                type: String,
+                default: () => {
+                    return '';
+                },
+            },
+            showCheckbox: {
+                type: Boolean,
+                default: () => {
+                    return false;
+                },
+            },
+            checkIds: {
+                type: Array,
+                default: () => {
+                    return [];
+                },
+            },
+        },
+        data() {
+            return {
+                excelCheckIds: [],
+                currentId: ''
+            }
+        },
+        watch: {
+            checkIds(newVal, oldVal) {
+                this.excelCheckIds = newVal
+            }
+        },
+        methods: {
+            funExcelChange(obj) {
+                this.currentId = obj.id
+                this.$emit('excelChange', obj)
+            },
+            funCheckChange(checkArr) {
+                this.$emit('checkChange', {
+                    checkArr,
+                    data: this.data
+                }) //抛出当前选择checkIds,  和当前的childs数据项
+            }
+        }
+    }
+</script>
+<style lang="less">
+    .excelData {
+
+        .excelDataNoCheck {
+            font-size: 14px;
+            color: #b7b7b7;
+            line-height: 25px;
+            height: 25px;
+            cursor: pointer;
+
+            .el-icon {
+                margin-right: 5px;
+                color: #504bb5;
+            }
+        }
+
+        .excelDataNoCheck:hover {
+            background-color: #504bb5;
+            color: #fff;
+        }
+    }
+</style>

+ 579 - 0
src/components/generatingCapacityComponent/kMap/index.vue

@@ -0,0 +1,579 @@
+<template>
+    <div class="kMapBox">
+        <div id="kMap"></div>
+        <div class="tipBox" v-if="cameraHeight">
+            <span class="tipItem">视角高度≈{{ cameraHeight.toFixed(2) }}</span>
+            <span class="tipItem">视角经度≈{{ cameraLongitude.toFixed(2) }}</span>
+            <span class="tipItem">视角纬度≈{{ cameraLatitude.toFixed(2) }}</span>
+        </div>
+        <RightMenu :rightMenuPosition="rightMenuPosition" :rightMenuShow="rightMenuShow" :clickModel="clickModel"
+            @cliclMenu="clickMenuItem" @closeRightmenu="
+        () => {
+          rightMenuShow = false;
+        }
+      " />
+    </div>
+</template>
+
+<script>
+    import * as Cesium from "cesium";
+    import axios from "axios";
+    import httpRequest from '@/utils/request.js'
+    import RightMenu from "./rightMenu.vue";
+    export default {
+        props: {
+            ids: {
+                type: Array,
+                default: () => [],
+            },
+            parentId: {
+                type: String,
+                default: () => "",
+            },
+        },
+
+        components: {
+            RightMenu,
+        },
+
+        data() {
+            return {
+                mapViewer: null,
+                tilsUrl: "./static/kMapTiles/{z}/{x}/{y}.jpg",
+                labelEntities: [],
+                // 本地化语言配置
+                localSet: {
+                    // 地址搜索栏
+                    ".cesium-viewer-geocoderContainer form>.cesium-geocoder-input": {
+                        placeholder: "在此输入地址或坐标...",
+                    },
+                    ".cesium-sceneModePicker-wrapper.cesium-toolbar-button button:nth-child(3)": {
+                        title: "2D化平面",
+                    },
+                    ".cesium-sceneModePicker-wrapper.cesium-toolbar-button button:last-child": {
+                        title: "哥伦布视图",
+                    },
+                },
+                showEntities: true,
+                isFirstLoad: true,
+                cameraHeight: 0,
+                cameraLatitude: 0,
+                cameraLongitude: 0,
+                wpList: [],
+                wtList: [],
+                mapModelType: "3d",
+                substationId: "",
+                searchId: [],
+                rightMenuShow: false,
+                rightMenuPosition: {
+                    x: 0,
+                    y: 0,
+                },
+                clickModel: {},
+            };
+        },
+
+        created() {
+            console.log('cesium====>>>', Cesium)
+            this.substationId = this.parentId;
+            Cesium.Ion.defaultAccessToken =
+                "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwNGVhZmJlNi03Mzg2LTRhZDQtYTBjYi1hNDk0MjM1NWYzZGEiLCJpZCI6MTcyNDQ1LCJpYXQiOjE2OTc1OTg3Nzd9.tJdKhFXx4JXjcKxUDvJffwwo2tMvIDIGEuwsYXbeeW0";
+        },
+
+        mounted() {
+            this.initKMap();
+            // axios({
+            //         method: "get",
+            //         baseURL: "ping",
+            //         url: "",
+            //     })
+            //     .then(() => {})
+            //     .catch(() => {
+            //         this.initGetLocalTiles();
+            //     })
+            //     .finally(() => {
+
+            //     });
+            this.$nextTick(() => {
+                this.initCurrentOptions();
+                this.getGeoJson();
+                this.getWpList();
+                this.$emit("mapDone", true);
+            });
+        },
+
+        methods: {
+            // 手动将地球工具栏英文内容本地化
+            localToZhCn() {
+                for (let className in this.localSet) {
+                    const dom = document.querySelector(className);
+                    if (dom) {
+                        for (let domOption in this.localSet[className]) {
+                            dom.setAttribute(domOption, this.localSet[className][domOption]);
+                        }
+                    }
+                }
+            },
+
+            initKMap() {
+                this.mapViewer = new Cesium.Viewer("kMap", {
+                    infoBox: false,
+                    animation: false, // 是否显示动画控件
+                    homeButton: false, // 是否显示 home 键
+                    geocoder: false, // 是否显示地名查找控件
+                    baseLayerPicker: false, // 是否显示图层选择控件
+                    timeline: false, // 是否显示时间线控件
+                    fullscreenButton: false, // 是否全屏显示
+                    infoBox: false, // 是否显示点击要素之后显示的信息
+                    sceneModePicker: true, // 是否显示投影方式控件  三维/二维
+                    navigationInstructionsInitiallyVisible: false,
+                    navigationHelpButton: false, // 是否显示帮助信息控件
+                    orderIndependentTranslucency: false,
+                    shouldAnimate: true,
+                    scene3DOnly: false, // 每个几何实例将只能以3D渲染以节省GPU内存
+                    selectionIndicator: false, // 取消点击有绿框
+                    baseLayerPicker: false, //是否显示图层选择控件
+                });
+
+                // 视角移动结束钩子
+                this.mapViewer.scene.camera.moveEnd.addEventListener(() => {
+                    this.getCameraInfo();
+                });
+
+                // 视角发生改变钩子
+                this.mapViewer.scene.camera.changed.addEventListener(() => {
+                    this.rightMenuShow = false;
+                    this.getCameraInfo();
+                });
+
+                // 注册场景点击事件
+                const handler = new Cesium.ScreenSpaceEventHandler(
+                    this.mapViewer.scene.canvas
+                );
+
+                // 左键事件
+                handler.setInputAction(() => {
+                    this.rightMenuShow = false;
+                    return false;
+                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+                // 右键事件
+                handler.setInputAction((e) => {
+                    const pick = this.mapViewer.scene.pick(e.position);
+                    if (pick && pick.id) {
+                        const clickModel = this.mapViewer.entities.getById(pick.id.id) || {};
+                        if (clickModel.modelType === "wt") {
+                            this.clickModel = clickModel;
+                            this.rightMenuPosition = e.position;
+                            this.rightMenuShow = true;
+                        }
+                    }
+                    return false;
+                }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+
+                // 滚轮事件监听
+                handler.setInputAction(() => {
+                    this.rightMenuShow = false;
+                    this.getCameraInfo();
+                }, Cesium.ScreenSpaceEventType.WHEEL);
+            },
+
+            initGetLocalTiles() {
+                const imageryProvider = new Cesium.TileMapServiceImageryProvider({
+                    url: this.tilsUrl, // 本地瓦片的路径
+                    maximumLevel: 18, // 最大级别
+                    minimumLevel: 0, // 最小级别
+                    fileExtension: "jpg", // 图像文件扩展名
+                    flipXY: true, // 如果你的瓦片Y轴方向与通常的瓦片格式相反,设置为true
+                });
+                this.mapViewer.imageryLayers.addImageryProvider(imageryProvider);
+            },
+
+            initCurrentOptions() {
+                // document.querySelector(".cesium-viewer-bottom").remove();
+                this.mapViewer._cesiumWidget._creditContainer.style.display = "none";
+
+                // 创建自定义还原按钮
+                var homeButton = document.createElement("button");
+                homeButton.textContent = "复位";
+                homeButton.className = "cesium-button";
+                homeButton.style.height = "36px";
+
+                // 将按钮添加到Cesium Viewer的界面中
+                var toolbar = document.querySelector(".cesium-viewer-toolbar");
+                toolbar.appendChild(homeButton);
+
+                // 在按钮点击时执行自定义还原视图操作
+                homeButton.addEventListener("click", () => {
+                    // 这里可以编写代码以实现自定义的还原视图操作
+                    // 例如,重置摄像机位置和缩放级别
+                    this.mapViewer.camera.flyTo({
+                        destination: Cesium.Cartesian3.fromDegrees(
+                            112.48699,
+                            37.94036,
+                            1100000
+                        ),
+                    });
+                });
+
+                var entitiesButton = document.createElement("button");
+                entitiesButton.textContent = `${
+        this.showEntities ? "隐藏" : "显示"
+      }区域标记`;
+                entitiesButton.className = "cesium-button cesiumResetBtn";
+                entitiesButton.style.height = "36px";
+
+                toolbar.appendChild(entitiesButton);
+
+                // 在按钮点击时执行自定义还原视图操作
+                entitiesButton.addEventListener("click", () => {
+                    this.showEntities = !this.showEntities;
+                    entitiesButton.textContent = `${
+          this.showEntities ? "隐藏" : "显示"
+        }区域标记`;
+                    this.getGeoJson();
+                    this.showEntities && this.getWpList();
+                });
+
+                const select = document.createElement("select");
+
+                const optionsArray = [{
+                        innerHTML: "3D模型",
+                        value: "3d"
+                    },
+                    {
+                        innerHTML: "2D平面",
+                        value: "2d"
+                    },
+                    {
+                        innerHTML: "2D图标",
+                        value: "icon"
+                    },
+                ];
+
+                optionsArray.forEach((ele) => {
+                    const optionsItem = document.createElement("option");
+                    optionsItem.innerHTML = ele.innerHTML;
+                    optionsItem.setAttribute("value", ele.value);
+                    select.appendChild(optionsItem);
+                });
+
+                toolbar.appendChild(select);
+
+                select.addEventListener("change", (select) => {
+                    this.mapModelType = select.target.value;
+                    this.showEntities && this.getWpList();
+                });
+
+                this.localToZhCn();
+            },
+
+            getGeoJson() {
+                if (this.showEntities) {
+                    const strokeColor = new Cesium.Color.fromCssColorString("yellow");
+                    const fillColor = new Cesium.Color.fromCssColorString(
+                        "rgba(228,141,43,0.3)"
+                    );
+                    Cesium.Math.setRandomNumberSeed(0);
+                    var promise = this.mapViewer.dataSources.add(
+                        Cesium.GeoJsonDataSource.load("./static/geoJson/sx.json", {
+                            stroke: strokeColor,
+                            // fill: Cesium.Color.TRANSPARENT,
+                            fill: fillColor,
+                            clampToGround: false,
+                            strokeWidth: 5.0,
+                            markerSymbol: "?",
+                        })
+                    );
+                    promise.then((dataSource) => {
+                        const entities = dataSource.entities.values;
+                        if (this.labelEntities.length === 0) {
+                            for (let i = 0; i < entities.length; i++) {
+                                const entity = entities[i];
+                                const name = entity.name;
+                                const location = entity.properties._centroid._value;
+                                const labelEntity = this.mapViewer.entities.add({
+                                    modelType: "geo",
+                                    position: Cesium.Cartesian3.fromDegrees(
+                                        location[0],
+                                        location[1]
+                                    ),
+                                    label: {
+                                        text: name,
+                                        font: "14px Helvetica",
+                                        fillColor: Cesium.Color.WHITE,
+                                        showBackground: false,
+                                        backgroundColor: Cesium.Color.fromCssColorString(
+                                            "rgba(52,79,209,1.0)"
+                                        ),
+                                        backgroundPadding: new Cesium.Cartesian2(3, 3),
+                                        scale: 0.9,
+                                        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+                                        outlineColor: Cesium.Color.BLACK,
+                                        outlineWidth: 2,
+                                        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+                                    },
+                                });
+                                this.labelEntities.push(labelEntity);
+                            }
+                        }
+                    });
+                    if (this.isFirstLoad) {
+                        this.isFirstLoad = false;
+                        this.mapViewer.flyTo(promise);
+                    }
+                } else {
+                    this.mapViewer.entities.removeAll();
+                    this.mapViewer.dataSources.removeAll();
+                    this.labelEntities = [];
+                }
+            },
+
+            getCameraInfo() {
+                const camera = this.mapViewer.camera;
+                this.cameraHeight = camera.positionCartographic.height;
+                this.cameraLatitude = camera.positionCartographic.latitude;
+                this.cameraLongitude = camera.positionCartographic.longitude;
+            },
+
+            async getWpList() {
+                if (this.ids.length) {
+                    this.wtList.forEach((ele) => {
+                        this.addWt(ele, "wt");
+                    });
+                    this.switchEntities(["wt"], this.substationId);
+                } else {
+                    if (!this.wpList.length) {
+                        const {
+                            data
+                        } = await httpRequest.get("/base/station");
+                        this.wpList = data || [];
+                        data.forEach((ele) => {
+                            this.addWt(ele, "wp");
+                        });
+                    } else {
+                        this.wpList.forEach((ele) => {
+                            this.addWt(ele, "wp");
+                        });
+                    }
+                    this.switchEntities(["wp"], this.substationId);
+                }
+            },
+
+            addWt(resItem, modelType = "wp") {
+                const hpRoll = new Cesium.HeadingPitchRoll(
+                    modelType === "wt" ? 45 : 20,
+                    0.0,
+                    0.0
+                );
+                const origin = Cesium.Cartesian3.fromDegrees(106.0231304, 37.73323706, 0);
+                const position = Cesium.Cartesian3.fromDegrees(
+                    Number(resItem.longitude),
+                    Number(resItem.latitude),
+                    0
+                );
+                const orientation = Cesium.Transforms.headingPitchRollQuaternion(
+                    position,
+                    hpRoll
+                );
+
+                const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
+                    origin,
+                    hpRoll
+                );
+
+                // const id = `${modelType}_${resItem.id}`;
+                const minimumPixelSize = modelType === "wt" ? 50 : 40;
+                const maximumSize = modelType === "wt" ? 40 : 40;
+                const maximumScale = modelType === "wt" ? 80 : 70;
+                const substationId = this.substationId || "";
+                const fittingId = resItem.fittingId;
+                const processId = resItem.processId;
+                const currentName = resItem.name;
+                const mapModelType = this.mapModelType;
+
+                const modelItem = {
+                    // 模型id
+                    // id,
+                    modelType,
+                    substationId,
+                    fittingId,
+                    processId,
+                    currentName,
+                    mapModelType,
+                    // 模型位置
+                    position,
+                    // 模型方向
+                    orientation,
+                    // 添加描述
+                    description: resItem.name,
+                    label: {
+                        // 文字内容
+                        text: resItem.aname,
+                        // 文本大小与字体
+                        font: "14px Helvetica",
+                        // 文字填充颜色
+                        fillColor: Cesium.Color.WHITE,
+                        // 是否显示背景
+                        showBackground: false,
+                        //背景墙的颜色
+                        backgroundColor: Cesium.Color.fromCssColorString(
+                            "rgba(52,79,209,1.0)"
+                        ),
+                        // 背景宽度
+                        backgroundPadding: new Cesium.Cartesian2(3, 3),
+                        // 文字与背景墙的总大小
+                        scale: 1.2,
+                        // 文本轮廓
+                        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+                        // 外边界颜色
+                        outlineColor: Cesium.Color.fromCssColorString("#000"),
+                        // 外边界宽度
+                        outlineWidth: 4,
+                        // 文本出现的位置
+                        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+                        // 文本的偏移方向
+                        pixelOffset: new Cesium.Cartesian2(0, 25),
+                        eyeOffset: new Cesium.Cartesian3(0, 0, -250),
+                    },
+                };
+
+                if (mapModelType === "3d") {
+                    // 模型资源
+                    modelItem.model = {
+                        // 模型路径
+                        uri: `./static/glb/${modelType}.glb`,
+                        // 模型最小刻度
+                        minimumPixelSize,
+                        // 模型最大刻度
+                        maximumSize,
+                        // 设置模型最大放大大小
+                        maximumScale,
+                        // 模型是否可见
+                        show: true,
+                        // 模型轮廓颜色
+                        silhouetteColor: Cesium.Color.WHITE,
+                        // 模型颜色  ,这里可以设置颜色的变化
+                        color: Cesium.Color.WHITE,
+                        // 仅用于调试,显示魔仙绘制时的线框
+                        debugWireframe: false,
+                        // 仅用于调试。显示模型绘制时的边界球。
+                        debugShowBoundingVolume: false,
+                        scale: 1,
+                        // 是否运行模型中的动画效果
+                        runAnimations: true,
+                        clampAnimations: true, // 是否保持最后一针的动画
+                        // 模型贴地
+                        // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+                    };
+                } else if (mapModelType === "2d") {
+                    const semiMinorAxis = modelType === "wt" ? 350 : 1200;
+                    const semiMajorAxis = modelType === "wt" ? 350 : 1200;
+                    const extrudedHeight = modelType === "wt" ? 5.0 : 200;
+                    const materialColor = modelType === "wt" ? "#f25656" : "#1890ff";
+                    modelItem.ellipse = {
+                        semiMinorAxis, // 椭圆的短半轴
+                        semiMajorAxis, // 椭圆的长半轴
+                        extrudedHeight, // 拉伸高度
+                        material: Cesium.Color.fromCssColorString(materialColor), // 椭圆颜色
+                        outline: true, //是否显示边框
+                        outlineColor: Cesium.Color.fromCssColorString("#000"), //边框颜色
+                        rotation: Cesium.Math.toRadians(45), //旋转角度,从正北方向开始顺时针旋转
+                    };
+                } else if (mapModelType === "icon") {
+                    modelItem.billboard = {
+                        image: "./static/img/markIcon.png",
+                        width: 19,
+                        height: 31,
+                    };
+                }
+
+                this.mapViewer.entities.add(modelItem);
+            },
+
+            switchEntities(modelTypeList = [], substationId = "") {
+                let entities = [];
+                modelTypeList.forEach((type) => {
+                    this.mapViewer.entities.values.forEach((ele, index) => {
+                        if (
+                            ele.modelType === type &&
+                            ele.mapModelType === this.mapModelType &&
+                            (substationId ? substationId === ele.substationId : true)
+                        ) {
+                            if (this.searchId.length) {
+                                const someRes = this.searchId.some((fittingId) => {
+                                    return ele.fittingId === fittingId;
+                                });
+                                someRes && entities.push(ele);
+                            } else {
+                                entities.push(ele);
+                            }
+                        }
+
+                        if (ele.modelType === "geo") {
+                            entities.push(ele);
+                        }
+                    });
+                });
+
+                this.mapViewer.entities.removeAll();
+                entities.forEach((ele) => {
+                    this.mapViewer.entities.add(ele);
+                });
+            },
+
+            clickMenuItem(params) {
+                this.$emit("rightClick", params);
+            },
+        },
+
+        watch: {
+            ids(value) {
+                httpRequest
+                    .get("/base/location", {
+                        params: {
+                            ids: value.join(","),
+                        },
+                    })
+                    .then((res) => {
+                        this.searchId = value || [];
+                        this.wtList = res.data || [];
+                        this.getWpList();
+                    });
+            },
+            parentId(value) {
+                this.substationId = value || "";
+            },
+        },
+    };
+</script>
+<style lang="less" scoped>
+    .kMapBox,
+    .kMapBox #kMap {
+        width: 100%;
+        height: 100%;
+    }
+
+    .kMapBox {
+        position: relative;
+
+        .tipBox {
+            position: absolute;
+            left: 0;
+            bottom: 0;
+            font-size: 12px;
+            padding: 4px;
+            background: rgba(0, 0, 0, 0.5);
+            color: #fff;
+            width: 100%;
+
+            .tipItem {
+                margin-left: 4px;
+
+                &:first-child {
+                    margin-left: 1px;
+                }
+            }
+        }
+    }
+</style>

+ 140 - 0
src/components/generatingCapacityComponent/kMap/rightMenu.vue

@@ -0,0 +1,140 @@
+<template>
+    <div class="kMapRightMenuBox" :style="`left:${(MenuPosition.x + 4).toFixed(1)}px;
+    top:${(MenuPosition.y + 4).toFixed(1)}px;`" v-if="menuShow">
+        <div class="menuItem title sp" v-if="model.currentName">
+            {{ model.currentName }}
+        </div>
+        <div class="menuItem content" @click="clickMenuItem(0, 'fittingId')">
+            功率曲线拟合
+        </div>
+        <div class="menuItem content" @click="clickMenuItem(1, 'processId')">
+            对分偏差分析
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        props: {
+            rightMenuPosition: {
+                type: Object,
+                default: () => {
+                    return {
+                        x: 0,
+                        y: 0
+                    };
+                },
+            },
+
+            rightMenuShow: {
+                type: Boolean,
+                default: () => false,
+            },
+
+            clickModel: {
+                type: Object,
+                default: () => {
+                    return {};
+                },
+            },
+        },
+
+        data() {
+            return {
+                menuShow: false,
+                MenuPosition: {
+                    x: 0,
+                    y: 0
+                },
+                preventStop: false,
+                model: {},
+            };
+        },
+
+        methods: {
+            stopEvent() {
+                this.$nextTick(() => {
+                    if (!this.preventStop) {
+                        const kMapRightMenuBox = document.querySelector(".kMapRightMenuBox");
+                        kMapRightMenuBox.addEventListener("contextmenu", (event) => {
+                            event.preventDefault && event.preventDefault();
+                            this.preventStop = true;
+                            return false;
+                        });
+                    }
+                });
+            },
+
+            clickMenuItem(menuIndex, key) {
+                if (this.model[key]) {
+                    this.$emit("closeRightmenu");
+                    this.$emit("cliclMenu", {
+                        menuIndex,
+                        current: this.model,
+                    });
+                }
+            },
+        },
+
+        watch: {
+            rightMenuShow(bool) {
+                this.menuShow = bool;
+                bool && this.stopEvent();
+            },
+            rightMenuPosition(menuPosition) {
+                this.MenuPosition = menuPosition;
+            },
+            clickModel(model) {
+                this.model = model;
+            },
+        },
+    };
+</script>
+
+<style lang="less" scoped>
+    .kMapRightMenuBox {
+        position: absolute;
+        left: 0;
+        top: 0;
+        border-radius: 0px 8px 8px 8px;
+        background: rgb(249, 249, 249);
+        display: flex;
+        flex-direction: column;
+        justify-content: flex-start;
+        align-items: center;
+        padding: 4px 0;
+        overflow: hidden;
+
+        .menuItem {
+            font-size: 13px;
+            padding: 4px 8px;
+            width: 100%;
+            white-space: nowrap;
+
+            &.title {
+                color: #999;
+            }
+
+            &.sp {
+                border-bottom: 1px solid #999;
+            }
+
+            &.content {
+                cursor: pointer;
+                user-select: none;
+                transition: 0.1s;
+            }
+
+            &.content:hover {
+                background: #1890ff;
+                color: #fff;
+                transition: 0.1s;
+            }
+        }
+
+        *.show {
+            border: 1px solid rgb(229, 229, 229);
+            height: 200px;
+        }
+    }
+</style>

+ 72 - 0
src/components/generatingCapacityComponent/table.vue

@@ -0,0 +1,72 @@
+<template>
+    <div class="warn-table" ref="tableRef" :style="{ height: typeof height === 'string' ? height : height + 'px' }">
+        <div class="tableData_tit">
+            <p>{{tableName}}</p>
+            <!-- <el-button size="small" type="primary" @click="funExport" :disabled="!tableId">数据导出</el-button> -->
+        </div>
+        <el-table :data="data" size="small" v-loading="loading" :max-height="tableHeight" :style="{ width: '100%'}">
+            <el-table-column align="center" show-overflow-tooltip v-for="(item,index) in column" :key="index"
+                :prop="item.prop" :label="item.label" sortable resizable :min-width="item.width? item.width : 80" />
+        </el-table>
+    </div>
+</template>
+<script>
+    export default {
+        props: {
+            data: {
+                type: Array,
+                default: () => {
+                    return [];
+                },
+            },
+            column: {
+                type: Array,
+                default: () => {
+                    return [];
+                },
+            },
+            height: {
+                type: String,
+                default: () => {
+                    return '';
+                },
+            },
+            loading: {
+                type: Boolean,
+                default: () => {
+                    return false;
+                },
+            },
+            tableId: {
+                type: String,
+                default: () => {
+                    return '';
+                },
+            },
+            tableName: {
+                type: String,
+                default: () => {
+                    return '';
+                },
+            },
+        },
+        data() {
+            return {
+                tableHeight: window.innerHeight - 250 + 'px'
+            }
+        },
+    }
+</script>
+<style lang="less" scoped>
+    .warn-table {
+
+        .tableData_tit {
+            p {
+                font-size: 16px;
+                font-weight: bold;
+                margin: 10px;
+                color: #fff;
+            }
+        }
+    }
+</style>

+ 0 - 0
src/components/generatingCapacityComponent/tree.vue


Some files were not shown because too many files changed in this diff