Просмотр исходного кода

完善设备模型页面所有样式

baiyanting 1 год назад
Родитель
Сommit
9d2de556cc
29 измененных файлов с 4548 добавлено и 3177 удалено
  1. 178 0
      src/assets/styles/common/common.css
  2. 1 10
      src/assets/styles/common/common.less
  3. 0 86
      src/assets/styles/theme/light/aqgk.less
  4. 0 181
      src/assets/styles/theme/light/jjyx.css
  5. 0 256
      src/assets/styles/theme/light/jjyx.less
  6. 0 265
      src/assets/styles/theme/light/jsc.less
  7. 0 129
      src/assets/styles/theme/light/light-jjyx.css
  8. 0 167
      src/assets/styles/theme/light/light-jjyx.less
  9. 0 422
      src/assets/styles/theme/light/light-jsc.css
  10. 0 590
      src/assets/styles/theme/light/light-jsc.less
  11. 0 196
      src/assets/styles/theme/light/light-qt.css
  12. 0 272
      src/assets/styles/theme/light/light-qt.less
  13. 0 140
      src/assets/styles/theme/light/light-sp.less
  14. 0 14
      src/assets/styles/theme/light/setting.less
  15. 0 445
      src/assets/styles/theme/light/zhjx.less
  16. 10 0
      src/router/index.js
  17. 1 1
      src/views/IntegratedAlarm/alarmConfig/components/custom_components.vue
  18. 2 2
      src/views/IntegratedAlarm/alarmConfig/customConfig/index.vue
  19. 391 0
      src/views/IntegratedAlarm/deviceConfig/components/custom.vue
  20. 754 0
      src/views/IntegratedAlarm/deviceConfig/components/custom_components.vue
  21. 345 0
      src/views/IntegratedAlarm/deviceConfig/components/faultmode.vue
  22. 77 0
      src/views/IntegratedAlarm/deviceConfig/components/message.vue
  23. 472 0
      src/views/IntegratedAlarm/deviceConfig/components/point.vue
  24. 390 0
      src/views/IntegratedAlarm/deviceConfig/components/windturbine.vue
  25. 456 0
      src/views/IntegratedAlarm/deviceConfig/components/windturbine_components.vue
  26. 529 0
      src/views/IntegratedAlarm/deviceConfig/components/ycpoint.vue
  27. 513 0
      src/views/IntegratedAlarm/deviceConfig/components/yxpoint.vue
  28. 424 0
      src/views/IntegratedAlarm/deviceConfig/index.vue
  29. 5 1
      src/views/IntegratedAlarm/safe/components/safecomponent.vue

+ 178 - 0
src/assets/styles/common/common.css

@@ -0,0 +1,178 @@
+#appBody.dark {
+  transition: 0.25s;
+}
+#appBody.dark .el-popper.is-light {
+  border: none;
+}
+#appBody.dark .gray {
+  transition: 0.25s;
+}
+#appBody.dark .green {
+  transition: 0.25s;
+}
+#appBody.dark .white {
+  transition: 0.25s;
+}
+#appBody.dark #app {
+  transition: 0.25s;
+}
+#appBody.dark .panel-title {
+  transition: 0.25s;
+}
+#appBody.dark .panel-tools {
+  transition: 0.25s;
+}
+#appBody.dark .weather .other-info .text {
+  transition: 0.25s;
+}
+#appBody.dark .weather .other-info div.svg-icon svg use {
+  transition: 0.25s;
+}
+#appBody.dark .security-days .text {
+  transition: 0.25s;
+}
+#appBody.dark .security-days .num {
+  transition: 0.25s;
+}
+#appBody.dark .tab-box .tab-item span svg use {
+  transition: 0.25s;
+}
+#appBody.dark .header-body .header-title svg g:nth-child(1) path,
+#appBody.dark .header-body .header-title svg g:nth-child(1) polygon {
+  transition: 0.25s;
+}
+#appBody.dark .weather-info span svg use {
+  transition: 0.25s;
+}
+#appBody.dark .map .tab-box .tab-item.active {
+  transition: 0.25s;
+}
+#appBody.dark .map .tab-box .tab-item.active::after {
+  transition: 0.25s;
+}
+#appBody.dark .header-menu .header-menu-list .header-menu-item.active::after {
+  transition: 0.25s;
+}
+#appBody.dark .header-menu .header-menu-list .header-menu-item.active {
+  background: linear-gradient(to top, rgba(5, 187, 76, 0.5), rgba(5, 187, 76, 0));
+  border: 0.093vh solid #05bb4c;
+  transition: color 0.25s ease-in-out;
+}
+#appBody.dark .coulometric-analysis .card-1 .card-icon svg use {
+  transition: 0.25s;
+}
+#appBody.dark .map .compass svg g:nth-child(3) g g path {
+  transition: 0.25s;
+}
+#appBody.dark .map .compass svg g:nth-child(4) g g path {
+  transition: 0.25s;
+}
+#appBody.dark .map .compass::after {
+  transition: 0.25s;
+}
+#appBody.dark .name-box-period-label {
+  transition: 0.25s;
+}
+#appBody.dark .name-box-period-value {
+  transition: 0.25s;
+}
+#appBody.dark .svg-map-nx .item-label rect {
+  transition: 0.25s;
+}
+#appBody.dark .svg-map-nx .item-label .mapKey {
+  transition: 0.25s;
+}
+#appBody.dark .svg-map-nx .popup-layer-svg .mapKey {
+  transition: 0.25s;
+}
+#appBody.dark .svg-map-nx #popup-box-svg rect {
+  transition: 0.25s;
+}
+#appBody.dark .com-panel-3,
+#appBody.dark .com-panel,
+#appBody.dark .header-body {
+  transition: 0.25s;
+}
+#appBody.dark .com-panel-3 .dot,
+#appBody.dark .com-panel.line:before {
+  transition: 0.25s;
+}
+#appBody.dark .panel-header {
+  transition: 0.25s;
+}
+#appBody.dark .fengji-icon svg use {
+  transition: 0.25s;
+}
+#appBody.dark .modal.el-dialog {
+  transition: 0.25s;
+}
+#appBody.dark .modal.el-dialog .el-dialog__title {
+  transition: 0.25s;
+}
+#appBody.dark .situation-body .value span:nth-child(2) {
+  transition: 0.25s;
+}
+#appBody.dark .coulometric-analysis .card-title {
+  transition: 0.25s;
+}
+#appBody.dark .com-panel,
+#appBody.dark .panel-header,
+#appBody.dark .home .table-card,
+#appBody.dark .com-panel-3.situation,
+#appBody.dark .el-menu--collapse,
+#appBody.dark .el-sub-menu,
+#appBody.dark .el-sub-menu__title,
+#appBody.dark .el-menu--popup,
+#appBody.dark .el-menu-item {
+  transition: 0.25s;
+}
+#appBody.dark .com-panel.line::before {
+  transition: 0.25s;
+}
+#appBody.dark .lightMenu {
+  width: 0;
+  height: calc(100% - 71px);
+  position: absolute;
+  left: 0;
+  top: 57px;
+  z-index: 100;
+  border-radius: 20px;
+  border: 0;
+  overflow: hidden;
+  transition: 0.25s;
+}
+#appBody.dark .lightMenu.hidden {
+  width: 0;
+  transition: 0.25s;
+}
+#appBody.dark .main-body {
+  margin-left: 0;
+  transition: 0.25s;
+}
+#appBody.dark .dot.top-left {
+  transition: 0.25s;
+}
+#appBody.dark .dot.bottom-left {
+  transition: 0.25s;
+}
+#appBody.dark .dot.top-rignt {
+  transition: 0.25s;
+}
+#appBody.dark .dot.bottom-right {
+  transition: 0.25s;
+}
+#appBody.dark .lightMenu .el-menu--collapse {
+  transition: 0.25s;
+}
+#appBody.dark .lightMenu .el-menu--collapse {
+  height: 100%;
+}
+#appBody.dark .lightMenu .el-sub-menu__title {
+  transition: 0.25s;
+}
+#appBody.dark .lightMenu .el-sub-menu__title i {
+  transition: 0.25s;
+}
+.left {
+  margin-top: 5px;
+}

+ 1 - 10
src/assets/styles/common/common.less

@@ -15,16 +15,7 @@
 
 // 5. 提交代码后如果衍生出冲突需要自行解决
 
-// 亮色主题
-@import "../theme/light/light-jsc.less"; // 驾驶舱
-@import "../theme/light/light-jjyx.less"; // 经济运行
-@import "../theme/light/light-sp.less"; // 沙盘
-@import "../theme/light/light-qt.less"; // 其他
-
-@import "../theme/light/jsc.less"; // 驾驶舱
-@import "../theme/light/jjyx.less"; // 经济运行
-@import "../theme/light/zhjx.less"; // 智慧检修	
-@import "../theme/light/aqgk.less"; // 安全管控
+
 
 // 暗色主题
 @import "../theme/dark/dark-jsc.less"; // 驾驶舱

+ 0 - 86
src/assets/styles/theme/light/aqgk.less

@@ -1,86 +0,0 @@
-//安全管控模块白色主题样式
-@import "./setting.less";
-#appBody.light {
-    .personnel .personnel-btn .i-btn:hover, .personnel .personnel-btn .i-btn.active{
-        border:1px solid rgba(75, 85, 174, 0.6);
-        background: rgba(75, 85, 174, 0.6);
-        color: @white;
-    }
-    .personnel .personnel-btn .i-btn{
-        background: rgb(220 221 223);
-        border: 1px solid @black;
-        color: @black;
-    }
-    //人员矩阵
-    .personnel .personnel-box .personnel-box-item{
-        background: @white;
-        border: 1px solid @black;
-    }
-    .personnel .personnel-box .personnel-box-item:hover{
-        border: 1px solid @deepblue;
-        background: @deepblue;
-    }
-    .personnel .personnel-box .personnel-box-item 
-        .personnel-box-item-h .personnel-box-item-form .personnel-box-item-group .personnel-box-item-label{
-            color: @black;
-            font-weight: bold;
-        }
-    .personnel .personnel-box .personnel-box-item:hover 
-        .personnel-box-item-h .personnel-box-item-form .personnel-box-item-group .personnel-box-item-label{
-            color: @white;
-        }
-    .personnel .personnel-box .personnel-box-item 
-        .personnel-box-item-h .personnel-box-item-form .personnel-box-item-group .personnel-box-item-value{
-            color: @black;
-            font-weight: bold;
-        }
-    .personnel .personnel-box .personnel-box-item:hover 
-        .personnel-box-item-h .personnel-box-item-form .personnel-box-item-group .personnel-box-item-value{
-            color: @white
-        }
-    .personnel .personnel-box .personnel-box-item .personnel-box-item-f .personnel-box-item-name{
-            color: @black;
-            font-weight: bold;
-        }
-    .personnel .personnel-box .personnel-box-item:hover .personnel-box-item-f .personnel-box-item-name{
-            color: @white
-        }
-    .personnel .personnel-box .personnel-box-item .personnel-box-item-f .personnel-box-item-icon{
-            color: @black;
-            font-weight: bold;
-        }
-        .personnel .personnel-box .personnel-box-item:hover .personnel-box-item-f .personnel-box-item-icon{
-            color: @white
-        }
-    .font-md{
-        color: @black;
-    }
-    .date-select.el-picker__popper.el-popper[role="tooltip"] .el-picker-panel .el-picker-panel__footer{
-        background: @deepblue;
-        border-color: @deepblue;
-    }
-    .date-select.el-picker__popper.el-popper[role="tooltip"] .el-picker-panel .el-date-picker__editor-wrap 
-    .el-time-panel .el-time-panel__footer{
-        background: @deepblue;
-    }
-    .el-picker-panel .el-time-panel__btn.cancel{
-        color: @white;
-    }
-    .el-time-panel__btn.confirm{
-        color: @black;
-    }
-
-    .el-picker-panel .el-picker-panel__footer .el-button--text{
-        color: @white;
-    }
-    .el-picker-panel .el-picker-panel__footer .el-button.is-plain{
-        background: @white;
-        border-color: @deepblue;
-        color: @black;
-    }
-    //视频监视
-    .iframe4 .el-dialog{
-        background: @white;
-
-    }
-}

+ 0 - 181
src/assets/styles/theme/light/jjyx.css

@@ -1,181 +0,0 @@
-#appBody.light .com-table thead tr th {
-  color: #000;
-}
-#appBody.light .com-table .el-scrollbar tr td {
-  color: #000;
-}
-#appBody.light .com-table .el-scrollbar tr td.light span,
-#appBody.light .com-table .el-scrollbar tr td.light div {
-  color: #159AFA;
-}
-#appBody.light .el-table__header-wrapper {
-  height: 37px;
-}
-#appBody.light .left {
-  padding-top: 20px;
-}
-#appBody.light .has-gutter {
-  background: #ffffff;
-  height: 30px;
-}
-#appBody.light .has-gutter .is-center {
-  height: 37px;
-}
-#appBody.light .performance {
-  background: #ffffff;
-}
-#appBody.light .btn.green,
-#appBody.light .btn:hover {
-  color: #36348e;
-  border-color: #36348e;
-  background: rgba(54, 52, 142, 0.2);
-}
-#appBody.light .el-select__popper.select,
-#appBody.light .el-picker__popper {
-  background: #ffffff;
-  border-color: #ffffff;
-}
-#appBody.light .el-select__popper.select .el-popper__arrow::before,
-#appBody.light .el-picker__popper .el-popper__arrow::before {
-  border: 1px solid #ffffff !important;
-  background: #ffffff !important;
-}
-#appBody.light .el-select__popper.select .el-select-dropdown__item.selected,
-#appBody.light .el-picker__popper .el-select-dropdown__item.selected,
-#appBody.light .el-select__popper.select .el-select-dropdown__item:hover,
-#appBody.light .el-picker__popper .el-select-dropdown__item:hover {
-  color: #36348e;
-  background: rgba(54, 52, 142, 0.2);
-  border: 1px solid #36348e;
-}
-#appBody.light .el-select__popper.select .el-select-dropdown__item,
-#appBody.light .el-picker__popper .el-select-dropdown__item {
-  color: #000;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] {
-  background: #ffffff !important;
-  border-color: #ffffff !important;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table th {
-  color: #000;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table td.current:not(.disabled) span {
-  color: #ffffff;
-  background: #159AFA;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table td.today span,
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table span:hover {
-  color: #159AFA;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table td.prev-month,
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table td.next-month {
-  background: rgba(0, 0, 0, 0.2);
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-date-table span {
-  color: #000;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-year-table td {
-  color: #000;
-}
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-year-table td.today .cell,
-#appBody.light .el-picker__popper.el-popper[role="tooltip"] .el-year-table td:hover {
-  color: #159AFA;
-}
-#appBody.light .el-input .el-input__inner {
-  background: #ffffff;
-  color: #000;
-}
-#appBody.light .query-item .lable {
-  color: #000;
-}
-#appBody.light .main-body input[type="checkbox"]:checked {
-  background: #159AFA;
-  border-color: #159AFA;
-}
-#appBody.light .main-body input[type="checkbox"] {
-  background: #ffffff;
-  border-color: #B3BDC0;
-}
-#appBody.light .decision-page-2 .com-panel,
-#appBody.light .decision-page-3 .com-panel,
-#appBody.light .decision-page-4 .com-panel {
-  border-radius: 0;
-  padding: 0;
-}
-#appBody.light .action {
-  color: #159AFA;
-}
-#appBody.light .el-select .el-select__tags .el-tag {
-  background-color: rgba(54, 52, 142, 0.2);
-  color: #36348e;
-}
-#appBody.light .el-select .el-select__tags .el-tag .el-icon-close {
-  background-color: rgba(54, 52, 142, 0.5);
-}
-#appBody.light .direction-info .com-table th,
-#appBody.light .direction-info .com-table td {
-  color: #000;
-}
-#appBody.light .newspan {
-  color: #000;
-}
-#appBody.light .newspan:hover {
-  background: linear-gradient(to top, rgba(54, 52, 142, 0.5), rgba(54, 52, 142, 0));
-  color: #36348e;
-}
-#appBody.light .newspan:hover::after {
-  border: 1px solid #36348e;
-}
-#appBody.light .active {
-  background: linear-gradient(to top, rgba(54, 52, 142, 0.5), rgba(54, 52, 142, 0));
-  color: #36348e;
-}
-#appBody.light .active::after {
-  border: 1px solid #36348e;
-}
-#appBody.light .el-month-table td .cell:hover,
-#appBody.light .el-date-picker__header-label.active,
-#appBody.light .el-date-picker__header-label:hover {
-  color: #159AFA;
-}
-#appBody.light .ztfx .table-complex .table tbody tr:nth-child(2n) td {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-#appBody.light .ztfx .table-complex .table tbody tr:nth-child(2n) td.item {
-  background-color: transparent;
-}
-#appBody.light .ztfx .table-complex .table th {
-  background: rgba(0, 0, 0, 0.4);
-  color: #ffffff;
-}
-#appBody.light .ztfx .table-complex .table td {
-  color: #000;
-}
-#appBody.light .ztfx .table-panel .table tbody tr:nth-child(2n) td {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-#appBody.light .ztfx .table-panel .table th {
-  background: rgba(0, 0, 0, 0.4);
-  color: #ffffff;
-}
-#appBody.light .ztfx .table-panel .table td {
-  color: #000;
-}
-#appBody.light .action-bar .selections .item {
-  color: #000;
-}
-#appBody.light .action-bar .selections .item:hover,
-#appBody.light .action-bar .selections .item.active {
-  background: rgba(54, 52, 142, 0.2);
-  border: 1px solid #36348e;
-  color: #36348e;
-}
-#appBody.light .fc-info .fc-item > .title {
-  color: #000;
-}
-#appBody.light .fc-info .fc-item .tags .tag .tag-title {
-  color: #000;
-}
-#appBody.light .fc-info .fc-item .tags .tag .tag-value {
-  color: #36348e;
-}

+ 0 - 256
src/assets/styles/theme/light/jjyx.less

@@ -1,256 +0,0 @@
-// 对标管理
-@import "./setting.less";
-#appBody.light {
-  // 风机绩效榜
-  .com-table {
-    thead tr th {
-      color: @black;
-    }
-
-    .el-scrollbar tr td {
-      color: @black;
-    }
-
-    .el-scrollbar tr td.light span,
-    .el-scrollbar tr td.light div {
-      color: @blue;
-    }
-  }
-  .el-table__header-wrapper {
-    height: 37px;
-  }
-  .left {
-    padding-top: 20px;
-  }
-  .has-gutter {
-    background: @white;
-    height: 30px;
-    .is-center {
-      height: 37px;
-    }
-  }
-  .performance {
-    background: @white;
-  }
-
-  .btn.green,
-  .btn:hover {
-    color: @deepblue;
-    border-color: @deepblue;
-    background: rgba(@deepblueBg, 0.2);
-  }
-
-  .el-select__popper.select,
-  .el-picker__popper {
-    background: @white;
-    border-color: @white;
-    .el-popper__arrow::before {
-      border: 1px solid @white !important;
-      background: @white !important;
-    }
-    .el-select-dropdown__item.selected,
-    .el-select-dropdown__item:hover {
-      color: @deepblue;
-      background: fade(@deepblue, 20);
-      border: 1px solid @deepblue;
-    }
-    .el-select-dropdown__item {
-      color: @black;
-    }
-  }
-
-  .el-picker__popper.el-popper[role="tooltip"] {
-    background: @white !important;
-    border-color: @white !important;
-    .el-date-table {
-      th {
-        color: @black;
-      }
-      td.current:not(.disabled) span {
-        color: @white;
-        background: @blue;
-      }
-      td.today span,
-      span:hover {
-        color: @blue;
-      }
-      td.prev-month,
-      td.next-month {
-        background: fade(@black, 20);
-      }
-      span {
-        color: @black;
-      }
-    }
-    .el-year-table {
-      td {
-        color: @black;
-      }
-      td.today .cell,
-      td:hover {
-        color: @blue;
-      }
-    }
-  }
-  .el-input {
-    .el-input__inner {
-      background: @white;
-      color: @black;
-    }
-  }
-  .query-item .lable {
-    color: @black;
-  }
-
-  // 风机绩效榜-明细
-  .main-body {
-    input[type="checkbox"]:checked {
-      background: @blue;
-      border-color: @blue;
-    }
-    input[type="checkbox"] {
-      background: @white;
-      border-color: @gray-l;
-    }
-  }
-
-  .decision-page-2,
-  .decision-page-3,
-  .decision-page-4 {
-    .com-panel {
-      border-radius: 0;
-      padding: 0;
-    }
-  }
-  .action {
-    color: @blue;
-  }
-
-  //线路对标
-  .el-select {
-    .el-select__tags .el-tag {
-      background-color: fade(@deepblue, 20);
-      color: @deepblue;
-
-      .el-icon-close {
-        background-color: fade(@deepblue, 50);
-      }
-    }
-  }
-
-  //单机横向对比
-  .direction-info {
-    .com-table {
-      th,
-      td {
-        color: @black;
-      }
-    }
-  }
-
-  // 状态转换率
-  .newspan {
-    color: @black;
-  }
-  .newspan:hover {
-    background: linear-gradient(
-      to top,
-      rgba(54, 52, 142, 0.5),
-      rgba(54, 52, 142, 0)
-    );
-    color: @deepblue;
-  }
-  .newspan:hover::after {
-    border: 1px solid @deepblue;
-  }
-  .active {
-    background: linear-gradient(
-      to top,
-      rgba(54, 52, 142, 0.5),
-      rgba(54, 52, 142, 0)
-    );
-    color: @deepblue;
-  }
-  .active::after {
-    border: 1px solid @deepblue;
-  }
-
-  .el-month-table td .cell:hover,
-  .el-date-picker__header-label.active,
-  .el-date-picker__header-label:hover {
-    color: @blue;
-  }
-
-  // 综合分析
-  .ztfx {
-    .table-complex {
-      .table {
-        tbody {
-          tr:nth-child(2n) td {
-            background-color: fade(@black, 20%);
-            &.item {
-              background-color: transparent;
-            }
-          }
-        }
-
-        th {
-          background: fade(@black, 40);
-          color: @white;
-        }
-        td {
-          color: @black;
-        }
-      }
-    }
-    .table-panel {
-      .table {
-        tbody {
-          tr:nth-child(2n) td {
-            background-color: fade(@black, 20%);
-          }
-        }
-        th {
-          background: fade(@black, 40);
-          color: @white;
-        }
-        td {
-          color: @black;
-        }
-      }
-    }
-  }
-
-  .action-bar {
-    .selections {
-      .item {
-        color: @black;
-        &:hover,
-        &.active {
-          background: fade(@deepblue, 20);
-          border: 1px solid @deepblue;
-          color: @deepblue;
-        }
-      }
-    }
-  }
-
-  // 风场信息
-  .fc-info {
-    .fc-item {
-      & > .title {
-        color: @black;
-      }
-      .tags {
-        .tag {
-          .tag-title {
-            color: @black;
-          }
-          .tag-value {
-            color: @deepblue;
-          }
-        }
-      }
-    }
-  }
-}

+ 0 - 265
src/assets/styles/theme/light/jsc.less

@@ -1,265 +0,0 @@
-@import "./setting.less";
-
-#appBody.light {
-
-    // 基础矩阵白色主题样式
-    .panel-body {
-        background: @white;
-        transition: @transition;
-        border-bottom-right-radius: 10px;
-        border-bottom-left-radius: 10px;
-    }
-
-    .card-panel .card-left .tag {
-        color: @black;
-    }
-
-    .light-matrix .panel {
-        background-color: #ffffff;
-        border: 1px solid #ffffff;
-        border-radius: 10px;
-        margin-top: 10px;
-    }
-
-    .green[data-v-065abbc5] {
-        color: @green;
-    }
-
-    .green[data-v-6a0a9536] {
-        color: @green;
-    }
-
-    .light-matrix .panel-box .panel-title .panel-title-name[data-v-065abbc5] {
-        font-size: 1.296vh;
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    .svg-icon.svg-icon-green svg use {
-        fill: @green;
-    }
-
-    //明细矩阵
-    .light-matrix .panel-box .panel-title .panel-title-name[data-v-e0caa1f6] {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    //欠发矩阵
-    .light-matrix .panel-box .panel-title .panel-title-name[data-v-6a0a9536] {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    //光伏矩阵
-    .light-matrix .panel-box .panel-title .panel-title-name[data-v-55c30df5] {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    //驾驶舱模块-矩阵白色主题样式二级页面
-    //基本信息-日发电量1
-    .wind-site-base-info .generation {
-        background: @white;
-    }
-
-    //基本信息-日发电量2
-    .el-col-10 {
-        background: @white;
-    }
-
-    //基本信息-日发电量右侧
-    .wind-site-warning[data-v-40a70b04] {
-        background: @white;
-        transition: @transition;
-    }
-
-    //右侧导航栏第一个-天气
-    .wind-site-weather[data-v-ccb406f8] {
-        background: @white;
-        transition: @transition;
-    }
-
-    .wind-site-base-info .wind-site-name {
-        border: 1px solid @deepblue;
-    }
-
-    .title[data-v-2c3073c8] {
-        font-weight: bold;
-    }
-
-    //右侧导航栏第一个-最右侧
-    .light-matrix-small {
-        background: @white;
-        transition: @transition;
-    }
-
-    //最右侧导航
-    .wind-site .page-common-body .page-common-body-menu .page-common-body-menu-box[data-v-3b6e4be5] {
-        background-color: @white;
-        transition: @transition;
-    }
-
-    .wind-site .page-common-body .page-common-body-menu .page-common-body-menu-box .page-common-body-menu-item[data-v-3b6e4be5] {
-        border: 0.093vh solid @deepblue;
-    }
-
-    //右侧导航栏第二个底色
-    .df-table .custom-table.el-table {
-        background: @white;
-        transition: @transition;
-    }
-
-    .general-appearance-body {
-        background: @white;
-        transition: @transition;
-    }
-
-    .booster-station-body {
-        background: @white;
-        transition: @transition;
-    }
-
-    .Inverter-Info .box-main .Inverter-Info-body .Inverter-Info-title {
-        position: relative;
-        background: @white;
-        transition: @transition;
-    }
-
-    //场站监视
-    .Inverter-Info .box-main .Inverter-Info-body .Inverter-Info-title .title {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    .Inverter-Info .box-main .Inverter-Info-body .Inverter-Info-title .title-tools-left {
-        color: @black;
-    }
-
-    table.table-form.mg-b-8 {
-        background: @white;
-        transition: @transition;
-    }
-
-    .Inverter-Info .box-main .Inverter-Info-body .inverter-datas .inverter-item .inverter-item-info .states {
-        background: @white;
-        transition: @transition;
-    }
-
-    .com-collapse .collapse-box .collapse-items .item.active {
-        color: @deepblue;
-        cursor: pointer;
-        font-weight: bold;
-    }
-
-    .matrix .panel-title .panel-title-name[data-v-2e858362] {
-        color: @deepblue;
-    }
-
-    .com-panel.line {
-        margin-left: 1px;
-        z-index: 1;
-    }
-
-    .wave {
-        z-index: 1;
-    }
-
-    .svg-icon.svg-icon-write svg use {
-        fill: @black;
-    }
-
-    .svg-icon.svg-icon-gray-l svg use {
-        fill: @black;
-    }
-
-    // 状态监视白色主题样式
-    .status-panel .status-com-panel .p-body .category-box[data-v-74094c42] {
-        width: 100%;
-        background-color: @white;
-        transition: @transition;
-        display: flex;
-        margin-bottom: 0.37vh;
-    }
-
-    .el-scrollbar__wrap {
-        background: rgb(220, 220, 220);
-        transition: @transition;
-    }
-
-    .map-1 .btn-group-tabs[data-v-0ec6dd0b] {
-        display: flex;
-        flex-direction: row;
-        background: @white;
-        height: 50px;
-    }
-
-    .status-panel .status-com-panel .p-body .item-box .data-item.light[data-v-74094c42] {
-        background-color: #ffffff;
-        position: relative;
-    }
-
-    .status-panel .status-com-panel .p-body .item-box .data-item.borders[data-v-74094c42] {
-        border-bottom: 2px solid @gray;
-    }
-
-    .status-panel .status-com-panel .p-body .item-box .data-item.light .f1[data-v-74094c42] {
-        color: @gray;
-    }
-    .status-panel .status-com-panel .p-body .item-box .data-item.light .f2[data-v-74094c42] {
-        color: @gray;
-    }
-    .status-panel .status-com-panel .p-body .item-box .data-item.light .f3[data-v-74094c42] {
-        color: @deepblue;
-    }
-    .status-panel .status-com-panel .p-body .item-box .data-item.light .f4[data-v-74094c42] {
-        color: @gray;
-    }
-    .status-panel .status-com-panel .p-body .item-box .data-item.light .f5[data-v-74094c42] {
-        color: @deepblue;
-    }
-
-    .status-panel .status-com-panel .p-body .category-box .score span[data-v-74094c42] {
-        color: @deepblue;
-    }
-
-    //驾驶舱模块-Agc白色主题样式
-    .com-panel2 .panel-header2 .panel-tools2 {
-        color: @black;
-        opacity: 0.3;
-    }
-
-    .panel-table .data-item .data-item-count {
-        color: @deepblue;
-    }
-
-    .com-panel2 .panel-header2 .panel-title2 {
-        color: @deepblue;
-    }
-
-    .com-panel2.green .panel-header2 .panel-title2 .panel-icon2 {
-        color: @black;
-    }
-
-    .com-panel2.green .panel-header2::after {
-        background-image: linear-gradient(to right, @white, rgba(5, 187, 76, 0));
-    }
-
-    // 风场
-    .station-tip {
-        background-color: @gray-l;
-        color: @black;
-    }
-
-    .el-table td.light,
-    .df-table .el-table td.light,
-    .main-body .custom-table.el-table td.light,
-    .df-table .custom-table.el-table td.light,
-    .main-body .el-table td.always-light,
-    .df-table .el-table td.always-light,
-    .main-body .custom-table.el-table td.always-light,
-    .df-table .custom-table.el-table td.always-light {
-        color: @deepblue  !important;
-        font-weight: bold;
-    }
-}

+ 0 - 129
src/assets/styles/theme/light/light-jjyx.css

@@ -1,129 +0,0 @@
-#appBody.light .static-main {
-  background: #fff;
-  border-color: #36348e;
-  border-radius: 12px;
-  flex: 0 0 130px;
-  margin-right: 5px;
-  transition: 0.25s;
-}
-#appBody.light .static-main .icon i {
-  background: #36348e;
-  border-color: #808080;
-  transition: 0.25s;
-}
-#appBody.light .static-main .icon i svg use {
-  fill: #fff;
-  transition: 0.25s;
-}
-#appBody.light .static-main .info .value {
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .com-panel {
-  background: #ffffff;
-}
-#appBody.light .static-items {
-  background: #fff;
-  margin-right: 4px;
-  border-radius: 12px;
-  transition: 0.25s;
-}
-#appBody.light .static-items .static-items-title {
-  color: #36348e;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .static-items .items .item {
-  margin-left: 4px;
-  border-radius: 12px;
-  background: rgba(128, 128, 128, 0.15);
-  transition: 0.25s;
-  font-weight: 700;
-}
-#appBody.light .static-items .items .item .title {
-  color: #36348e;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-left .top-left-header .header-right > div.active,
-#appBody.light .power-benchmarking-page .top .top-left .top-left-header .header-right > div:hover {
-  background: rgba(54, 52, 142, 0.2);
-  border-color: #36348e;
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-title::before {
-  background: linear-gradient(135deg, rgba(54, 52, 142, 0.4), transparent, transparent, transparent, rgba(54, 52, 142, 0.4));
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-title {
-  border-color: #36348e;
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-title .border {
-  border-color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-table.el-table thead tr th {
-  background: #F0F0F0;
-  color: #000;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-block {
-  border-color: #36348e;
-  background: rgba(54, 52, 142, 0.2);
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-table {
-  border-color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .top-right .el-table__body-wrapper {
-  background: #fff;
-  transition: 0.25s;
-}
-#appBody.light .main-body .el-table td,
-#appBody.light .main-body .custom-table.el-table td {
-  color: #000;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .main-body .el-table tr:hover td,
-#appBody.light .main-body .custom-table.el-table tr:hover td {
-  color: #36348e;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-table.el-table.el-table--striped .el-table__body tr.el-table__row--striped td {
-  background: rgba(54, 52, 142, 0.1);
-  transition: 0.25s;
-}
-#appBody.light .power-benchmarking-page .top .top-right .rank-table.el-table.el-table--striped .el-table__body tr.el-table__row--striped:hover td {
-  background: rgba(54, 52, 142, 0.1) !important;
-  transition: 0.25s;
-}
-#appBody.light .top-left .el-table table {
-  background: #fff;
-  transition: 0.25s;
-}
-#appBody.light .top-left .el-table th,
-#appBody.light .top-left .el-table td {
-  font-weight: bold;
-  font-weight: 700;
-}
-#appBody.light .top-left .el-table thead tr:first-child th {
-  background: #F0F0F0;
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .top-left .el-table thead tr:last-child th {
-  background: #F0F0F0;
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .top-left .el-table th.light,
-#appBody.light .top-left .el-table td.light {
-  color: #36348e !important;
-  transition: 0.25s;
-}

+ 0 - 167
src/assets/styles/theme/light/light-jjyx.less

@@ -1,167 +0,0 @@
-// 经济运行模块白色主题样式
-
-@import "./setting.less";
-
-#appBody.light {
-    .static-main {
-        background   : #fff;
-        border-color : @deepblue;
-        border-radius: @borderRaduis;
-        transition   : @transition;
-        flex         : 0 0 130px;
-        margin-right : 5px;
-        transition   : @transition;
-
-        .icon i {
-            background  : @deepblue;
-            border-color: rgb(128, 128, 128);
-            transition  : @transition;
-
-            svg use {
-                fill      : #fff;
-                transition: @transition;
-            }
-        }
-
-        .info .value {
-            color     : @deepblue;
-            transition: @transition;
-        }
-    }
-.com-panel{
-    background: @white ;
-}
-    .static-items {
-        background   : #fff;
-        margin-right : 4px;
-        border-radius: @borderRaduis;
-        transition   : @transition;
-
-        .static-items-title {
-            color      : @deepblue;
-            font-weight: 700;
-            transition : @transition;
-        }
-
-        .items {
-            .item {
-                margin-left  : 4px;
-                border-radius: @borderRaduis;
-                background   : rgba(128, 128, 128, 0.15);
-                transition   : @transition;
-                font-weight  : 700;
-
-                .title {
-                    color      : @deepblue;
-                    font-weight: 700;
-                    transition : @transition;
-                }
-            }
-        }
-    }
-
-    .power-benchmarking-page .top .top-left .top-left-header .header-right>div.active,
-    .power-benchmarking-page .top .top-left .top-left-header .header-right>div:hover {
-        background  : rgba(54, 52, 142, 0.2);
-        border-color: @deepblue;
-        color       : @deepblue;
-        transition  : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-title::before {
-        background: linear-gradient(135deg, rgba(54, 52, 142, 0.4), transparent, transparent, transparent, rgba(54, 52, 142, 0.4));
-    }
-
-    .power-benchmarking-page .top .top-right .rank-title {
-        border-color: @deepblue;
-        color       : @deepblue;
-        transition  : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-title .border {
-        border-color: @deepblue;
-        transition  : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-table.el-table thead tr th {
-        background : #F0F0F0;
-        color      : @black;
-        font-weight: 700;
-        transition : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-block {
-        border-color: @deepblue;
-        background  : rgba(54, 52, 142, 0.2);
-        transition  : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-table {
-        border-color: @deepblue;
-        transition  : @transition;
-    }
-
-    .top-right .el-table__body-wrapper {
-        background: #fff;
-        transition: @transition;
-    }
-
-    .main-body .el-table td,
-    .main-body .custom-table.el-table td {
-        color      : @black;
-        font-weight: 700;
-        transition : @transition;
-    }
-
-    .main-body .el-table tr:hover td,
-    .main-body .custom-table.el-table tr:hover td {
-        color      : @deepblue;
-        font-weight: 700;
-        transition : @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-table.el-table.el-table--striped .el-table__body tr.el-table__row--striped td {
-        background: rgba(54, 52, 142, 0.1);
-        transition: @transition;
-    }
-
-    .power-benchmarking-page .top .top-right .rank-table.el-table.el-table--striped .el-table__body tr.el-table__row--striped:hover td {
-        background: rgba(54, 52, 142, 0.1) !important;
-        transition: @transition;
-    }
-
-    .top-left .el-table {
-        // background: #fff;
-        // transition: @transition;
-
-        table {
-            background: #fff;
-            transition: @transition;
-        }
-
-        th,
-        td {
-            font-weight: bold;
-            font-weight: 700;
-        }
-
-        thead tr:first-child th {
-            background: #F0F0F0;
-            color     : @black;
-            transition: @transition;
-        }
-
-        thead tr:last-child th {
-            background: #F0F0F0;
-            color     : @black;
-            transition: @transition;
-        }
-
-
-        th.light,
-        td.light {
-            color     : @deepblue  !important;
-            transition: @transition;
-        }
-    }
-}

+ 0 - 422
src/assets/styles/theme/light/light-jsc.css

@@ -1,422 +0,0 @@
-#appBody.light {
-  color: #000;
-  background: #dcdddf;
-  transition: 0.25s;
-}
-#appBody.light .gray {
-  color: #000;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .green {
-  color: #05bb4c;
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .green1 {
-  color: rgba(255, 255, 255, 0.8);
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .white {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light #app {
-  transition: 0.25s;
-}
-#appBody.light .panel-title {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .panel-tools {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .weather .other-info .text {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .weather .other-info div.svg-icon svg use {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .security-days .text {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .security-days .num {
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .security-days .text1 {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .save-item .save-value {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .save-item .save-name {
-  color: #5e6269;
-  transition: 0.25s;
-}
-#appBody.light .tab-box .tab-item span svg use {
-  fill: #000;
-  transition: 0.25s;
-}
-#appBody.light . {
-  border: 0;
-  transition: 0.25s;
-}
-#appBody.light . .header-title svg g:nth-child(1) path,
-#appBody.light . .header-title svg g:nth-child(1) polygon {
-  fill: #000;
-  transition: 0.25s;
-}
-#appBody.light .weather-info span svg use {
-  fill: #000;
-  transition: 0.25s;
-}
-#appBody.light .tab-box .tab-item.active {
-  color: #36348e;
-  position: relative;
-  background-image: linear-gradient(to top, rgba(57, 54, 143, 0.5), rgba(5, 187, 76, 0));
-  transition: 0.25s;
-}
-#appBody.light .tab-box .tab-item.active1,
-#appBody.light .rightTitle .active1 {
-  color: #36348e;
-  position: relative;
-  background-image: linear-gradient(to top, rgba(57, 54, 143, 0.5), #ffffff);
-  transition: 0.25s;
-}
-#appBody.light .tab-box .tab-item.active::after,
-#appBody.light .rightTitle .active1::after {
-  transition: 0.25s;
-}
-#appBody.light .header-menu .header-menu-list .header-menu-item.active::after {
-  border: 0.093vh solid #36348e;
-  transition: 0.25s;
-}
-#appBody.light .header-menu .header-menu-list .header-menu-item.active {
-  color: #36348e;
-  position: relative;
-  background: linear-gradient(to top, rgba(57, 54, 143, 0.5), rgba(5, 187, 76, 0));
-  border: 0.093vh solid #36348e;
-  transition: color 0.25s ease-in-out;
-}
-#appBody.light .home .table-card {
-  outline: none;
-  transition: 0.25s;
-  overflow: hidden;
-}
-#appBody.light .coulometric-analysis .card-1 .card-icon svg use {
-  fill: #36348e;
-  filter: drop-shadow(0 0 6px #36348e);
-  transition: 0.25s;
-}
-#appBody.light .map .compass svg g:nth-child(3) g g path {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .map .compass svg g:nth-child(4) g g path {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .map .compass::after {
-  box-shadow: inset 0px -5px 10px 0px #36348e;
-  transition: 0.25s;
-}
-#appBody.light .name-box-period-label {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .name-box-period-value {
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .query.mg-b-8 {
-  padding-top: 10px;
-}
-#appBody.light .query.mg-b-16 {
-  padding-top: 10px;
-}
-#appBody.light .svg-map-nx .item-label rect {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .svg-map-nx .item-label .mapKey {
-  fill: #fff;
-  transition: 0.25s;
-}
-#appBody.light .svg-map-nx .popup-layer-svg .mapKey {
-  fill: #fff;
-  transition: 0.25s;
-}
-#appBody.light .svg-map-nx #popup-box-svg rect {
-  fill: #36348e;
-  opacity: 0.8;
-  transition: 0.25s;
-}
-#appBody.light .svg-map-nx .esp-1 {
-  stroke: #36348e;
-}
-#appBody.light .svg-map-nx .esp-6 {
-  stroke: #36348e;
-}
-#appBody.light .svg-map-nx .esp-c {
-  stroke: #36348e;
-}
-#appBody.light .svg-map .item-label rect {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .svg-map .item-label .mapKey {
-  fill: #fff;
-  transition: 0.25s;
-}
-#appBody.light .svg-map .popup-layer-svg .mapKey {
-  fill: #fff;
-  transition: 0.25s;
-}
-#appBody.light .svg-map #popup-box-svg rect {
-  fill: #36348e;
-  opacity: 0.8;
-  transition: 0.25s;
-}
-#appBody.light .svg-map .esp-1 {
-  stroke: #36348e;
-}
-#appBody.light .svg-map .esp-6 {
-  stroke: #36348e;
-}
-#appBody.light .svg-map .esp-c {
-  stroke: #36348e;
-}
-#appBody.light .status {
-  background-color: #ffffff;
-  padding: 10px;
-  margin-top: 10px;
-  border-radius: 10px;
-}
-#appBody.light .status .table-box1 {
-  border: 0.093vh solid #ffffff;
-}
-#appBody.light .status .com-table tbody tr:nth-child(2n) {
-  background-color: #ffffff;
-}
-#appBody.light .monitorOverview .stationName {
-  color: #000000;
-}
-#appBody.light .monitorOverview .station-info .item-title {
-  color: #000000;
-}
-#appBody.light .monitorOverview .station-info .item-name {
-  color: #000000;
-}
-#appBody.light .monitorOverview .station-info .item-unit {
-  color: #000000;
-}
-#appBody.light .monitorOverview .model .energy-title {
-  color: #000000;
-  background-color: rgba(83, 98, 104, 0.4);
-}
-#appBody.light .monitorOverview .model1 .energy-title {
-  color: #000000;
-  background-color: rgba(83, 98, 104, 0.4);
-}
-#appBody.light .monitorOverview .energy-content .num {
-  color: #000000;
-}
-#appBody.light .com-panel-3,
-#appBody.light .com-panel,
-#appBody.light . {
-  background: #fff;
-  transition: 0.25s;
-}
-#appBody.light .com-panel-3 .dot,
-#appBody.light .com-panel.line:before {
-  background: #000;
-  transition: 0.25s;
-}
-#appBody.light .panel-header {
-  background: #fff;
-  transition: 0.25s;
-}
-#appBody.light .fengji-icon svg use {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .modal.el-dialog {
-  background: rgba(255, 255, 255, 0.85);
-  border: 1px solid rgba(57, 54, 143, 0.5);
-  box-shadow: 0px 8px 17px 1px rgb(57, 54, 143 / 30%);
-  border-radius: 12px;
-  transition: 0.25s;
-}
-#appBody.light .modal.el-dialog .el-dialog__title {
-  transition: 0.25s;
-}
-#appBody.light .situation-body .value span:nth-child(2) {
-  font-weight: 700;
-  transition: 0.25s;
-}
-#appBody.light .coulometric-analysis .card-title {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .com-panel,
-#appBody.light .panel-header,
-#appBody.light .home .table-card,
-#appBody.light .com-panel-3.situation,
-#appBody.light .el-menu--collapse,
-#appBody.light .el-sub-menu,
-#appBody.light .el-sub-menu__title,
-#appBody.light .el-menu--popup,
-#appBody.light .el-menu-item {
-  border-radius: 12px;
-  transition: 0.25s;
-}
-#appBody.light .com-panel {
-  padding-bottom: 10px;
-  transition: 0.25s;
-}
-#appBody.light .com-panel.line::before {
-  width: 4px;
-  height: 4px;
-  background: #000;
-  margin: 0.85vh 0.556vh 0vh 0.85vh;
-  transition: 0.25s;
-}
-#appBody.light .com-panel.line {
-  border-left: 0;
-  transition: 0.25s;
-}
-#appBody.light .lightMenu {
-  width: 0;
-  height: calc(100% - 71px);
-  position: absolute;
-  left: 14px;
-  top: 57px;
-  z-index: 100;
-  border-radius: 20px;
-  border: 0;
-  overflow: hidden;
-  transition: 0.25s;
-}
-#appBody.light .lightMenu.show {
-  width: 54px;
-  transition: 0.25s;
-}
-#appBody.light .main-body {
-  transition: 0.25s;
-}
-#appBody.light .dot.top-left {
-  top: 0.85vh;
-  left: 0.85vh;
-  background: #000;
-  transition: 0.25s;
-}
-#appBody.light .dot.bottom-left {
-  bottom: 0.85vh;
-  left: 0.85vh;
-  background: #000;
-  transition: 0.25s;
-}
-#appBody.light .dot.top-rignt {
-  top: 0.85vh;
-  right: 0.85vh;
-  background: #000;
-  transition: 0.25s;
-}
-#appBody.light .dot.bottom-right {
-  bottom: 0.85vh;
-  right: 0.85vh;
-  background: #000;
-  transition: 0.25s;
-}
-#appBody.light .lightMenu .el-menu--collapse {
-  width: 54px;
-  transition: 0.25s;
-}
-#appBody.light .lightMenu .el-menu--collapse {
-  height: 100%;
-}
-#appBody.light .lightMenu .el-sub-menu__title {
-  text-align: center;
-  vertical-align: middle;
-  padding: 0 20px;
-  transition: 0.25s;
-}
-#appBody.light .lightMenu .el-sub-menu__title i {
-  color: #fff;
-  transition: 0.25s;
-}
-#appBody.light .el-popper.is-light.is-pure .el-menu--popup {
-  padding: 0;
-}
-#appBody.light .el-popper.is-light.is-pure .el-menu--popup .el-menu-item-group__title {
-  padding: 0;
-}
-#appBody.light .el-popper.is-light.is-pure .el-menu--popup .el-menu-item {
-  height: 46px;
-  line-height: 46px;
-}
-#appBody.light .el-popper.is-light {
-  border: none;
-}
-#appBody.light .el-popper.is-light .el-menu {
-  border-radius: 0px;
-}
-#appBody.light .com-panel-3 {
-  border: 0;
-  transition: 0.25s;
-}
-#appBody.light .map .return {
-  color: rgba(0, 0, 0, 0.8);
-  transition: 0.25s;
-}
-#appBody.light .map .return use {
-  fill: #000;
-  transition: 0.25s;
-}
-#appBody.light .map .return:hover {
-  color: #36348e;
-  border-color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .map .return:hover use {
-  fill: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .name-box .name-box-title {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-up .zbtjfx-up-panel {
-  background: #ffffff;
-  border: 1px solid #ffffff;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-up .zbtjfx-up-panel .zbtjfx-up-panel-l {
-  border-right: 1px dashed #36348e;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-up .zbtjfx-up-panel .zbtjfx-up-panel-r-t {
-  color: #36348e;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-up .zbtjfx-up-panel .zbtjfx-up-panel-r-b {
-  color: #000000;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-mi .zbtjfx-mi-panel {
-  background: #ffffff;
-  border: 1px solid #ffffff;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-mi .zbtjfx-mi-panel .zbtjfx-mi-panel-text {
-  color: #666666;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-mi .zbtjfx-mi-panel .zbtjfx-mi-panel-text .zbtjfx-mi-panel-text-green {
-  color: #05bb4c;
-}
-#appBody.light .zbtjfx .zbtjfx-body .zbtjfx-dn {
-  color: #000000;
-}

+ 0 - 590
src/assets/styles/theme/light/light-jsc.less

@@ -1,590 +0,0 @@
-// 驾驶舱模块白色主题样式
-
-@import "./setting.less";
-
-#appBody.light {
-  color: @black;
-  transition: @transition;
-
-  .gray {
-    color: @black;
-    font-weight: 700;
-    transition: @transition;
-  }
-
-  .green {
-    color: #05bb4c;
-    font-weight: 700;
-    transition: @transition;
-  }
-
-  .green1 {
-    color: fade(@white, 80);
-    font-weight: 700;
-    transition: @transition;
-  }
-
-  .white {
-    color: @black;
-    transition: @transition;
-  }
-
-  #app {
-    // background: rgb(220, 221, 223);
-    transition: @transition;
-  }
-
-  .panel-title {
-    color: @black;
-    transition: @transition;
-  }
-
-  .panel-tools {
-    color: @black;
-    transition: @transition;
-  }
-
-  .weather {
-    .other-info {
-      .text {
-        color: @black;
-        transition: @transition;
-      }
-
-      div.svg-icon svg use {
-        fill: @deepblue;
-        transition: @transition;
-      }
-    }
-  }
-
-  .security-days {
-    .text {
-      color: @black;
-      transition: @transition;
-    }
-
-    .num {
-      color: @deepblue;
-      transition: @transition;
-    }
-    .text1 {
-      color: @black;
-      transition: @transition;
-    }
-  }
-
-  .save-item {
-    .save-value {
-      color: @black;
-      transition: @transition;
-    }
-    .save-name {
-      color: #5e6269;
-      transition: @transition;
-    }
-  }
-
-  .tab-box {
-    .tab-item {
-      span {
-        svg {
-          use {
-            fill: @black;
-            transition: @transition;
-          }
-        }
-      }
-    }
-  }
-
-  .header-body {
-    border: 0;
-    transition: @transition;
-
-    .header-title {
-      svg {
-        g:nth-child(1) {
-          path,
-          polygon {
-            fill: @black;
-            transition: @transition;
-          }
-        }
-      }
-    }
-  }
-
-  .weather-info {
-    span svg use {
-      fill: @black;
-      transition: @transition;
-    }
-  }
-
-  .tab-box .tab-item.active {
-    color: @deepblue;
-    position: relative;
-    background-image: linear-gradient(
-      to top,
-      rgba(57, 54, 143, 0.5),
-      rgba(5, 187, 76, 0)
-    );
-    transition: @transition;
-  }
-  .tab-box .tab-item.active1,
-  .rightTitle .active1 {
-    color: @deepblue;
-    position: relative;
-    background-image: linear-gradient(
-      to top,
-      rgba(57, 54, 143, 0.5),
-      rgba(255, 255, 255, 1)
-    );
-    transition: @transition;
-  }
-
-  .tab-box .tab-item.active::after,
-  .rightTitle .active1::after {
-    // border: 0.093vh solid @deepblue;
-    transition: @transition;
-  }
-
-  .header-menu .header-menu-list .header-menu-item.active::after {
-    border: 0.093vh solid @deepblue;
-    transition: @transition;
-  }
-
-  .header-menu .header-menu-list .header-menu-item.active {
-    color: @deepblue;
-    position: relative;
-    background: linear-gradient(
-      to top,
-      rgba(57, 54, 143, 0.5),
-      rgba(5, 187, 76, 0)
-    );
-    border: 0.093vh solid @deepblue;
-    transition: color @transition ease-in-out;
-  }
-
-  .home .table-card {
-    outline: none;
-    transition: @transition;
-    overflow: hidden;
-  }
-
-  .coulometric-analysis {
-    .card-1 {
-      .card-icon {
-        svg use {
-          fill: @deepblue;
-          filter: drop-shadow(0 0 6px @deepblue);
-          transition: @transition;
-        }
-      }
-    }
-  }
-
-  .map .compass {
-    svg g:nth-child(3) {
-      g g path {
-        fill: @deepblue;
-        transition: @transition;
-      }
-    }
-
-    svg g:nth-child(4) {
-      g g path {
-        fill: @deepblue;
-        transition: @transition;
-      }
-    }
-
-    &::after {
-      box-shadow: inset 0px -5px 10px 0px @deepblue;
-      transition: @transition;
-    }
-  }
-
-  .name-box-period-label {
-    color: @black;
-    transition: @transition;
-  }
-
-  .name-box-period-value {
-    color: @deepblue;
-    transition: @transition;
-  }
-
-  .query {
-    &.mg-b-8 {
-      padding-top: 10px;
-    }
-    &.mg-b-16 {
-      padding-top: 10px;
-    }
-  }
-
-  .svg-map-nx {
-    .item-label {
-      rect {
-        fill: @deepblue;
-        transition: @transition;
-      }
-
-      .mapKey {
-        fill: #fff;
-        transition: @transition;
-      }
-    }
-
-    .popup-layer-svg {
-      .mapKey {
-        fill: #fff;
-        transition: @transition;
-      }
-    }
-
-    #popup-box-svg rect {
-      fill: @deepblue;
-      opacity: 0.8;
-      transition: @transition;
-    }
-
-    .esp-1 {
-      stroke: @deepblue;
-    }
-
-    .esp-6 {
-      stroke: @deepblue;
-    }
-
-    .esp-c {
-      stroke: @deepblue;
-    }
-  }
-
-  .svg-map {
-    .item-label {
-      rect {
-        fill: @deepblue;
-        transition: @transition;
-      }
-
-      .mapKey {
-        fill: #fff;
-        transition: @transition;
-      }
-    }
-
-    .popup-layer-svg {
-      .mapKey {
-        fill: #fff;
-        transition: @transition;
-      }
-    }
-
-    #popup-box-svg rect {
-      fill: @deepblue;
-      opacity: 0.8;
-      transition: @transition;
-    }
-
-    .esp-1 {
-      stroke: @deepblue;
-    }
-
-    .esp-6 {
-      stroke: @deepblue;
-    }
-
-    .esp-c {
-      stroke: @deepblue;
-    }
-  }
-  .status {
-    background-color: #ffffff;
-    padding: 10px;
-    margin-top: 10px;
-    border-radius: 10px;
-    .table-box1 {
-      border: 0.093vh solid #ffffff;
-    }
-    .com-table tbody tr:nth-child(2n) {
-      background-color: #ffffff;
-    }
-  }
-  .monitorOverview {
-    .stationName {
-      color: #000000;
-    }
-    .station-info .item-title {
-      color: #000000;
-    }
-    .station-info .item-name {
-      color: #000000;
-    }
-    .station-info .item-unit {
-      color: #000000;
-    }
-    .model .energy-title {
-      color: #000000;
-      background-color: rgba(83, 98, 104, 0.4);
-      // background: #fff;
-    }
-
-    .model1 .energy-title {
-      color: #000000;
-      background-color: rgba(83, 98, 104, 0.4);
-      // background: #fff;
-    }
-
-    .energy-content .num {
-      color: #000000;
-    }
-  }
-  .com-panel-3,
-  .com-panel,
-  .header-body {
-    background: #fff;
-    transition: @transition;
-  }
-
-  .com-panel-3 .dot,
-  .com-panel.line:before {
-    background: @black;
-    transition: @transition;
-  }
-
-  .panel-header {
-    background: #fff;
-    transition: @transition;
-  }
-
-  .fengji-icon {
-    svg use {
-      fill: @deepblue;
-      transition: @transition;
-    }
-  }
-
-  .modal.el-dialog {
-    background: rgba(255, 255, 255, 0.85);
-    border: 1px solid rgba(57, 54, 143, 0.5);
-    box-shadow: 0px 8px 17px 1px rgb(57, 54, 143 / 30%);
-    border-radius: @borderRaduis;
-    transition: @transition;
-  }
-
-  .modal.el-dialog .el-dialog__title {
-    // color: rgba(0, 0, 0, 0.75);
-    transition: @transition;
-  }
-
-  .situation-body {
-    .value span:nth-child(2) {
-      font-weight: 700;
-      transition: @transition;
-    }
-  }
-
-  .coulometric-analysis .card-title {
-    color: @black;
-    transition: @transition;
-  }
-
-  .com-panel,
-  .panel-header,
-  .home .table-card,
-  .com-panel-3.situation,
-  .el-menu--collapse,
-  .el-sub-menu,
-  .el-sub-menu__title,
-  .el-menu--popup,
-  .el-menu-item {
-    border-radius: @borderRaduis;
-    transition: @transition;
-  }
-
-  .com-panel {
-    padding-bottom: 10px;
-    transition: @transition;
-  }
-
-  .com-panel.line::before {
-    width: 4px;
-    height: 4px;
-    background: @black;
-    margin: 0.85vh 0.556vh 0vh 0.85vh;
-    transition: @transition;
-  }
-
-  .com-panel.line {
-    border-left: 0;
-    transition: @transition;
-  }
-
-  .lightMenu {
-    width: 0;
-    height: calc(100% - 71px);
-    position: absolute;
-    left: 14px;
-    top: 57px;
-    z-index: 100;
-    border-radius: 20px;
-    border: 0;
-    overflow: hidden;
-    transition: @transition;
-  }
-
-  .lightMenu.show {
-    width: 54px;
-    transition: @transition;
-  }
-
-  .main-body {
-    transition: @transition;
-  }
-
-  .dot.top-left {
-    top: 0.85vh;
-    left: 0.85vh;
-    background: @black;
-    transition: @transition;
-  }
-
-  .dot.bottom-left {
-    bottom: 0.85vh;
-    left: 0.85vh;
-    background: @black;
-    transition: @transition;
-  }
-
-  .dot.top-rignt {
-    top: 0.85vh;
-    right: 0.85vh;
-    background: @black;
-    transition: @transition;
-  }
-
-  .dot.bottom-right {
-    bottom: 0.85vh;
-    right: 0.85vh;
-    background: @black;
-    transition: @transition;
-  }
-
-  .lightMenu .el-menu--collapse {
-    width: 54px;
-    transition: @transition;
-  }
-
-  .lightMenu .el-menu--collapse {
-    height: 100%;
-  }
-
-  .lightMenu .el-sub-menu__title {
-    text-align: center;
-    vertical-align: middle;
-    padding: 0 20px;
-    transition: @transition;
-  }
-
-  .lightMenu .el-sub-menu__title i {
-    color: #fff;
-    transition: @transition;
-  }
-
-  .el-popper.is-light.is-pure .el-menu--popup {
-    padding: 0;
-
-    .el-menu-item-group__title {
-      padding: 0;
-    }
-
-    .el-menu-item {
-      height: 46px;
-      line-height: 46px;
-    }
-  }
-
-  .el-popper.is-light {
-    border: none;
-
-    .el-menu {
-      border-radius: 0px;
-    }
-  }
-
-  .com-panel-3 {
-    border: 0;
-    transition: @transition;
-  }
-
-  .map .return {
-    color: rgba(0, 0, 0, 0.8);
-    transition: @transition;
-
-    use {
-      fill: @black;
-      transition: @transition;
-    }
-  }
-
-  .map .return:hover {
-    color: @deepblue;
-    border-color: @deepblue;
-    transition: @transition;
-
-    use {
-      fill: @deepblue;
-      transition: @transition;
-    }
-  }
-
-  .name-box {
-    .name-box-title {
-      color: @black;
-      transition: @transition;
-    }
-  }
-
-  background: rgb(220, 221, 223);
-  transition: @transition;
-
-  .zbtjfx .zbtjfx-body {
-    .zbtjfx-up .zbtjfx-up-panel {
-      background: #ffffff;
-      border: 1px solid #ffffff;
-
-      .zbtjfx-up-panel-l {
-        border-right: 1px dashed #36348e;
-      }
-
-      .zbtjfx-up-panel-r-t {
-        color: #36348e;
-      }
-
-      .zbtjfx-up-panel-r-b {
-        color: #000000;
-      }
-    }
-
-    .zbtjfx-mi .zbtjfx-mi-panel {
-      background: #ffffff;
-      border: 1px solid #ffffff;
-
-      .zbtjfx-mi-panel-text {
-        color: #666666;
-
-        .zbtjfx-mi-panel-text-green {
-          color: #05bb4c;
-        }
-      }
-    }
-
-    .zbtjfx-dn {
-      color: #000000;
-    }
-  }
-}

+ 0 - 196
src/assets/styles/theme/light/light-qt.css

@@ -1,196 +0,0 @@
-#appBody.light .sjcx-item {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .sjcx-item:hover {
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .imgTitle {
-  color: #000;
-  transition: 0.25s;
-}
-#appBody.light .imgItem1:hover .imgTitle {
-  color: #36348e;
-  transition: 0.25s;
-}
-#appBody.light .el-carousel__item {
-  border-radius: 12px;
-}
-#appBody.light .el-date-editor.is-active,
-#appBody.light body .el-date-editor.is-active:hover,
-#appBody.light body .el-date-editor.is-focus .el-input__inner {
-  border-color: #36348e;
-}
-#appBody.light .el-date-editor .el-range__icon {
-  color: #000;
-}
-#appBody.light .el-date-editor .el-range__close-icon {
-  color: #000;
-}
-#appBody.light .el-picker-panel .el-picker-panel__footer {
-  background: #36348e;
-  border-color: #36348e;
-}
-#appBody.light .el-picker-panel .el-picker-panel__footer .el-button.is-plain {
-  color: #36348e;
-}
-#appBody.light .el-date-editor.el-date-editor--datetimerange .el-range-input {
-  color: #000;
-}
-#appBody.light .el-date-editor.el-date-editor--datetimerange .el-range-separator {
-  color: #000;
-}
-#appBody.light .main-body .el-card .el-card__header {
-  color: #000;
-  background: #ffffff;
-}
-#appBody.light .el-radio.is-bordered.el-radio--small .el-radio__label {
-  color: #000;
-}
-#appBody.light .el-radio.is-bordered.is-checked {
-  border-color: #36348e;
-}
-#appBody.light .el-radio.is-checked .el-radio__inner {
-  background: #36348e;
-  border-color: #36348e;
-}
-#appBody.light .el-radio.is-checked .el-radio__label {
-  color: #36348e;
-}
-#appBody.light .el-tree {
-  color: #000;
-  background: #ffffff;
-}
-#appBody.light .el-tree-node__expand-icon {
-  color: #000;
-}
-#appBody.light .el-tree.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
-  color: #36348e;
-}
-#appBody.light .el-tree .el-tree-node__content:hover,
-#appBody.light body .el-tree .el-upload-list__item:hover {
-  color: #36348e;
-  font-weight: bold;
-}
-#appBody.light .el-tree .el-checkbox__inner:hover {
-  border-color: #159AFA;
-}
-#appBody.light .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.end-date span,
-#appBody.light .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.start-date span {
-  background: rgba(54, 52, 142, 0.2);
-}
-#appBody.light .com-table td {
-  color: #000 !important;
-}
-#appBody.light .el-input__prefix {
-  color: #000;
-}
-#appBody.light .el-input__suffix {
-  color: #000;
-}
-#appBody.light .el-popper.el-select__popper[role="tooltip"] {
-  background: #ffffff;
-}
-#appBody.light .el-popper__arrow::before {
-  background: #ffffff !important;
-  border: 1px solid #ffffff !important;
-}
-#appBody.light .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item.selected {
-  color: #36348e;
-}
-#appBody.light .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item.hover {
-  background: #36348e;
-  color: #ffffff;
-}
-#appBody.light .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item:hover {
-  background: #36348e;
-  color: #ffffff;
-}
-#appBody.light .el-select .el-input .el-select__caret {
-  color: #000;
-}
-#appBody.light .el-picker-panel.el-date-picker td.current .cell {
-  background-color: rgba(54, 52, 142, 0.2);
-  color: #36348e;
-}
-#appBody.light .el-tabs--card > .el-tabs__header .el-tabs__nav {
-  border: 1px solid #36348e;
-  background: rgba(54, 52, 142, 0.2);
-}
-#appBody.light .tab .el-tabs__item.is-active {
-  color: #36348e;
-  font-weight: bold;
-}
-#appBody.light .el-tabs--card > .el-tabs__header .el-tabs__item {
-  border-bottom: 1px solid #36348e;
-}
-#appBody.light .tab .el-tabs__item {
-  color: #000;
-}
-#appBody.light .el-pagination .btn-next .el-icon,
-#appBody.light .el-pagination .btn-prev .el-icon {
-  color: #000;
-}
-#appBody.light .el-pagination.is-background .el-pager li:not(.disabled).active {
-  background: linear-gradient(to top, #4b55ae, #36348e);
-  color: #ffffff;
-}
-#appBody.light .el-table__row {
-  background: #ffffff;
-}
-#appBody.light .el-popper.el-cascader__dropdown[role="tooltip"] .el-cascader-node.is-selectable.in-checked-path {
-  color: #000;
-}
-#appBody.light .el-popper.el-cascader__dropdown[role="tooltip"] .el-cascader-node:not(.is-disabled):hover {
-  color: #36348e;
-}
-#appBody.light .alarm-center .fj .fj-item .fj-title {
-  color: #000;
-}
-#appBody.light .action-bar .selections .item {
-  background: #ffffff;
-}
-#appBody.light .number {
-  background: #ffffff;
-  color: #000;
-}
-#appBody.light .custom-report-items .title {
-  background: #ffffff;
-  color: #000;
-}
-#appBody.light .el-pagination .el-pager li {
-  color: #000;
-}
-#appBody.light .know-info .table-card tr[data-v-68c7e6e4] {
-  font-size: 12px;
-  color: #000;
-}
-#appBody.light .mg-b-8 {
-  background: #dcdddf;
-}
-#appBody.light .mg-b-8[data-v-85e4c29a] {
-  width: 150vh;
-}
-#appBody.light .main-body .query .query-items[data-v-2fab00f5] {
-  padding-bottom: 1vh;
-}
-#appBody.light .main-body .query .query-items[data-v-2d26d8fa] {
-  padding-bottom: 1vh;
-}
-#appBody.light .el-table th.el-table__cell > .cell {
-  color: #000;
-  height: 3.8vh;
-  padding-top: 0.6vh;
-}
-#appBody.light .el-time-panel__footer {
-  background: #36348e;
-}
-#appBody.light .swiperBox .imageBox1 .imgItem1 .img1[data-v-247ee960]:hover,
-#appBody.light .itemBox .imageBox1 .imgItem1 .img1[data-v-247ee960]:hover {
-  border: 3px solid #36348e;
-}
-#appBody.light .el-picker-panel.el-date-range-picker .el-date-range-picker__time-header .el-date-range-picker__time-picker-wrap .el-time-panel .el-time-spinner__item:hover:not(.disabled):not(.active) {
-  color: #36348e;
-  font-weight: bold;
-}

+ 0 - 272
src/assets/styles/theme/light/light-qt.less

@@ -1,272 +0,0 @@
-// 其他模块白色主题样式
-
-@import "./setting.less";
-
-#appBody.light {
-
-    .sjcx-item {
-        color: @black;
-        transition: @transition;
-    }
-
-    .sjcx-item:hover {
-        color: @deepblue;
-        transition: @transition;
-    }
-
-    .imgTitle {
-        color: @black;
-        transition: @transition;
-    }
-
-    .imgItem1:hover .imgTitle {
-        color: @deepblue;
-        transition: @transition;
-    }
-
-    .el-carousel__item {
-        border-radius: @borderRaduis;
-    }
-
-
-    //原始数据查询-测点历史数据查询
-    .el-date-editor.is-active,
-    body .el-date-editor.is-active:hover,
-    body .el-date-editor.is-focus .el-input__inner {
-        border-color: @deepblue;
-    }
-
-    .el-date-editor .el-range__icon {
-        color: @black;
-    }
-
-    .el-date-editor .el-range__close-icon {
-        color: @black;
-    }
-
-    .el-picker-panel .el-picker-panel__footer {
-        background: @deepblue;
-        border-color: @deepblue;
-    }
-
-    .el-picker-panel .el-picker-panel__footer .el-button.is-plain {
-        color: @deepblue;
-    }
-
-    .el-date-editor.el-date-editor--datetimerange .el-range-input {
-        color: @black;
-    }
-
-    .el-date-editor.el-date-editor--datetimerange .el-range-separator {
-        color: @black;
-    }
-
-    .main-body .el-card .el-card__header {
-        color: @black;
-        background: @white;
-    }
-
-    .el-radio.is-bordered.el-radio--small .el-radio__label {
-        color: @black;
-    }
-
-    .el-radio.is-bordered.is-checked {
-        border-color: @deepblue;
-    }
-
-    .el-radio.is-checked .el-radio__inner {
-        background: @deepblue;
-        border-color: @deepblue;
-    }
-
-    .el-radio.is-checked .el-radio__label {
-        color: @deepblue;
-    }
-
-    .el-tree {
-        color: @black;
-        background: @white;
-    }
-
-    .el-tree-node__expand-icon {
-        color: @black;
-    }
-
-    .el-tree.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
-        color: @deepblue;
-    }
-
-    .el-tree .el-tree-node__content:hover,
-    body .el-tree .el-upload-list__item:hover {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    .el-tree .el-checkbox__inner:hover {
-        border-color: @blue;
-    }
-
-    .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.end-date span,
-    .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.start-date span {
-        background: rgba(@deepblueBg, 0.2);
-    }
-
-    // 原始数据查询-数据导出
-    .com-table td {
-        color: @black  !important;
-    }
-
-    .el-input__prefix {
-        color: @black;
-    }
-
-    .el-input__suffix {
-        color: @black;
-    }
-
-    .el-popper.el-select__popper[role="tooltip"] {
-        background: @white;
-    }
-
-    .el-popper__arrow::before {
-        background: @white  !important;
-        border: 1px solid @white  !important;
-    }
-
-    .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item.selected {
-        color: @deepblue;
-    }
-
-    .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item.hover {
-        background: @deepblue;
-        color: @white;
-    }
-
-    .el-popper.el-select__popper[role="tooltip"] .el-select-dropdown__item:hover {
-        background: @deepblue;
-        color: @white;
-    }
-
-    .el-select .el-input .el-select__caret {
-        color: @black;
-    }
-    .el-picker-panel.el-date-picker td.current .cell{
-        background-color: rgba(@deepblueBg, 0.2);
-        color: @deepblue;
-    }   
-
-    //设备管理
-    .el-tabs--card>.el-tabs__header .el-tabs__nav {
-        border: 1px solid @deepblue;
-        background: rgba(@deepblueBg, 0.2);
-    }
-
-    .tab .el-tabs__item.is-active {
-        color: @deepblue;
-        font-weight: bold;
-    }
-
-    .el-tabs--card>.el-tabs__header .el-tabs__item {
-        border-bottom: 1px solid @deepblue;
-    }
-
-    .tab .el-tabs__item {
-        color: @black;
-    }
-
-    .el-pagination .btn-next .el-icon,
-    .el-pagination .btn-prev .el-icon {
-        color: @black;
-    }
-
-    .el-pagination.is-background .el-pager li:not(.disabled).active {
-        background: linear-gradient(to top, #4b55ae, #36348e);
-        color: @white;
-    }
-
-    .el-table__row {
-        background: @white;
-    }
-
-    .el-popper.el-cascader__dropdown[role="tooltip"] .el-cascader-node.is-selectable.in-checked-path {
-        color: @black;
-    }
-
-    .el-popper.el-cascader__dropdown[role="tooltip"] .el-cascader-node:not(.is-disabled):hover {
-        color: @deepblue;
-    }
-
-    //预警记录-预警管理
-    .alarm-center .fj .fj-item .fj-title {
-        color: @black;
-    }
-
-    .action-bar .selections .item {
-        background: @white;
-    }
-
-    //预警记录-升压站报警
-    .number {
-        background: @white;
-        color: @black;
-    }
-
-    //预警记录-自定义报警记录
-    .custom-report-items .title {
-        background: @white;
-        color: @black;
-    }
-
-    .el-pagination .el-pager li {
-        color: @black;
-    }
-
-    .title {
-        // background: @white;
-    }
-
-    //专家知识-故障知识列表
-    .know-info .table-card tr[data-v-68c7e6e4] {
-        font-size: 12px;
-        color: @black;
-    }
-
-    //样本库-故障训练样本库
-    .mg-b-8 {
-        background: @gray-2;
-    }
-
-    .mg-b-8[data-v-85e4c29a] {
-        width: 150vh;
-    }
-
-    .main-body .query .query-items[data-v-2fab00f5] {
-        padding-bottom: 1vh;
-    }
-
-    .main-body .query .query-items[data-v-2d26d8fa] {
-        padding-bottom: 1vh;
-    }
-
-    //样本库-知识库
-    .el-table th.el-table__cell>.cell {
-        color: @black;
-        height: 3.8vh;
-        padding-top: 0.6vh;
-    }
-    .el-time-panel__footer{
-        background: @deepblue;
-    }
-
-    .swiperBox .imageBox1 .imgItem1 .img1[data-v-247ee960]:hover,
-    .itemBox .imageBox1 .imgItem1 .img1[data-v-247ee960]:hover {
-        border: 3px solid @deepblue;
-    }
-
-    .el-picker-panel.el-date-range-picker .el-date-range-picker__time-header 
-    .el-date-range-picker__time-picker-wrap 
-    .el-time-panel .el-time-spinner__item:hover:not(.disabled):not(.active){
-        color: @deepblue;
-        font-weight: bold;
-    }
-}

+ 0 - 140
src/assets/styles/theme/light/light-sp.less

@@ -1,140 +0,0 @@
-// 沙盘模块白色主题样式
-
-@import "./setting.less";
-
-#appBody.light {
-    .com-panel-sand {
-        background   : #fff;
-        border-top   : 1px solid transparent;
-        border-radius: @borderRaduis;
-        transition   : @transition;
-    }
-
-    .com-panel-sand::after {
-        background: transparent;
-        transition: @transition;
-    }
-
-    .com-panel-sand-header {
-        border-color: @deepblue;
-        font-weight : 700;
-        transition  : @transition;
-    }
-
-    .com-panel-sand .com-panel-sand-header::after,
-    .com-panel-sand .com-panel-sand-header::before {
-        background: @deepblue;
-        transition: @transition;
-    }
-
-    .com-panel-sand .com-panel-body .other-info {
-        .value {
-            color      : @black;
-            font-weight: 700;
-            transition : @transition;
-        }
-
-        .text {
-            color      : @black;
-            font-weight: 700;
-            transition : @transition;
-        }
-    }
-
-    .com-panel-sand .rank-table th {
-        color      : @black;
-        font-weight: 700;
-        transition : @transition;
-    }
-
-    .com-panel-sand .rank-table td {
-        font-weight: 700;
-        transition : @transition;
-    }
-
-    .sand-table-bottom {
-        .p-panel {
-            background   : #fff;
-            border-radius: @borderRaduis;
-        }
-
-        .p-panel-title {
-            color      : @black;
-            font-weight: 700;
-            transition : @transition;
-        }
-
-        .pp-info-data .gray-l {
-            color      : rgb(128, 128, 128);
-            font-weight: 700;
-            transition : @transition;
-        }
-    }
-
-    .sand-table-right .com-panel-body .com-table {
-        th {
-            color      : rgb(128, 128, 128);
-            font-weight: 700;
-            transition : @transition;
-        }
-
-
-        th.light {
-            color      : @deepblue  !important;
-            font-weight: 700;
-            transition : @transition;
-        }
-
-        td {
-            color      : @black;
-            font-weight: 700;
-            transition : @transition;
-        }
-
-        td.light {
-            color      : @deepblue  !important;
-            font-weight: 700;
-            transition : @transition;
-        }
-    }
-
-    .modal {
-        .el-dialog__body {
-            background: rgba(255, 255, 255, 0.8);
-            transition: @transition;
-
-
-            .el-form-item__label {
-                color     : @black;
-                transition: @transition;
-            }
-
-            .el-input__inner {
-                // background   : rgba(0, 0, 0, 0.5);
-                border :1px solid rgba(0, 0, 0, 0.5);
-                border-radius: @borderRaduis;
-                transition   : @transition;
-            }
-        }
-    }
-
-    .weatherBox {
-        .r {
-            .el-collapse-item__content {
-                background : transparent;
-                color      : @black;
-                font-weight: 700;
-                padding    : 20px;
-                transition : @transition;
-            }
-
-            .el-collapse-item__header {
-                background   : transparent;
-                border-bottom: 1px solid #999;
-                color        : rgba(0, 0, 0, 0.75);
-                transition   : @transition;
-            }
-        }
-
-    }
-}

+ 0 - 14
src/assets/styles/theme/light/setting.less

@@ -1,14 +0,0 @@
-// 亮色样式配置
-
-@black      : #000;
-@transition : 0.25s;
-@deepblue   : #36348e;
-@mapContentBright : red;
-@borderRaduis: 12px;
-@blue : #159AFA;
-@white : #ffffff;
-@gray-l     : #B3BDC0;
-@darkgray-1 : #7b7d7e;
-@green      : #05bb4c;
-@deepblueBg : 54, 52, 142;
-@gray-2:#dcdddf;

+ 0 - 445
src/assets/styles/theme/light/zhjx.less

@@ -1,445 +0,0 @@
-@import "./setting.less";
-#appBody.light {
-	// 故障诊断
-	.el-table{
-		th{
-			color:@black;
-		}
-		
-		.el-table__body tr.hover-row.current-row > td,
-		.el-table__body tr.hover-row.el-table__row--striped.current-row > td,
-		.el-table__body tr.hover-row.el-table__row--striped > td,
-		.el-table__body tr.hover-row > td {
-		  color: @blue;
-		}
-		
-		.ascending .sort-caret.ascending {
-		  border-bottom-color: @deepblue;
-		}
-		
-		.descending .sort-caret.descending {
-		  border-top-color: @deepblue;
-		}
-	} 
-	
-	
-	// 故障回溯
-	.el-checkbox {
-	  color: @black;
-	
-	  &.is-bordered {
-	    &.is-checked {
-	      border-color: @deepblue;
-	    }
-	  }
-	
-	  .el-checkbox__input.is-checked + .el-checkbox__label {
-	    color: @deepblue;
-	  }
-	  .el-checkbox__input.is-disabled+span.el-checkbox__label{
-		  color: @black;
-	  }
-	  .el-checkbox__input.is-checked .el-checkbox__inner,
-	  .el-checkbox__input.is-indeterminate .el-checkbox__inner {
-	    background-color: @deepblue;
-	    border-color: @deepblue;
-	  }
-	
-	  .el-checkbox__input.is-focus .el-checkbox__inner {
-	    border-color: @deepblue;
-	  }
-	}
-	
-	.time-axis-box {
-	    .time-axis-progress-box {
-	        .time-axis-progress {
-	            background: fade(@deepblue, 60);
-	        }
-	        .time-axis-progress-scale {
-	            border: 1px solid @deepblue;
-	        }
-	    }
-	}
-	
-	.fdp-sub-title {
-	    color: @deepblue;
-	}
-	
-	// 健康推荐
-  .selections {
-	.item {
-	  color: @black;
-	  background: fade(@black, 20);
-	  border: 1px solid fade(@black, 20);
-
-	  &:hover,
-	  &.active {
-		background: fade(@deepblue, 20);
-		border: 1px solid @deepblue;
-		color: @deepblue;
-	  }
-	}
-  }
-
-  .power-info {
-
-	.info-tab {
-	  .tab {
-		color: @black;
-		background: fade(@black, 20);
-		border: 1px solid fade(@black, 20);
-		i {
-		  svg use {
-			fill: @black;
-		  }
-		}
-
-		&:hover,
-		&.active {
-		  background: fade(@deepblue, 20);
-		  border: 1px solid @deepblue;
-		  color: @deepblue;
-
-		  i svg use {
-			fill: @deepblue;
-		  }
-		}
-
-		&.active::after {
-		  border-bottom: 9px solid @deepblue;
-		}
-
-		&.active::before {
-		  border-bottom: 9px solid #063319;
-		}
-	  }
-
-	}
-  }
-
-  .health-report {
-	// 健康报告 按钮样式
-	.actions {
-		.active{
-			border: 1px solid @deepblue;
-		}
-	  .item {
-		color: fade(@white, 75);
-		&.green {
-		  background: @deepblue;
-		}
-
-		&.purple {
-		  background: @purple;
-		}
-
-		&.gray {
-		  background: @black;
-		}
-	  }
-	}
-
-	.report-items {
-
-	  .item {
-		.title {
-		  background: fade(@black, 40);
-		  color: @black;
-		}
-
-		.info {
-		  background: fade(@black, 20);
-		  color: @font-color;
-		  .actions {
-			.success {
-			  border-color:@deepblue;
-			  color: @deepblue;
-			  background: fade(@deepblue,20);
-			}
-		  }
-		}
-	  }
-	}
-  }
-  
-  // 健康推荐-已分配任务
-  .track-info {
-    .form-info {
-      .work-flow {
-        background: fade(@gray, 20);
-        .work-flow-line {
-          background: @deepblue;
-        }
-  
-        .work-flow-item {
-          &.active {
-			  background: none;
-            .work-flow-icon-item {
-              .work-flow-icon-o {
-                  border: 1px solid @deepblue;
-                }
-  
-                .work-flow-icon-i {
-                  border: 2px solid @deepblue;
-                  background: linear-gradient(to bottom, @gray-l 0%,@gray-l 20%,@deepblue 100%);
-                }
-  
-                .svg-icon {
-                  svg {
-                    use {
-                      fill: @deepblue;
-                    }
-                  }
-                }
-            }
-  
-            .work-flow-text {
-              color: @deepblue;
-            }
-          }
-  
-          .work-flow-icon-item {
-            .work-flow-icon-o {
-              border: 1px solid #B3BDC0;
-            }
-  
-            .work-flow-icon-m {
-              border: 4px solid #212b2b;
-            }
-  
-            .work-flow-icon-i {
-              border: 2px solid @gray-l;
-              background: linear-gradient(to bottom, @gray 0%,@gray 20%,@gray-l 100%);
-            }
-  
-            .svg-icon {
-              svg {
-                use {
-                  fill: @gray-l;
-                }
-              }
-            }
-          }
-          .work-flow-text {
-              color: @black;
-            }
-        }
-      }
-    }
-  
-    .evaluate {
-  
-      .evaluate-item {
-        .evaluate-label,
-        .evaluate-unit {
-          color: @black;
-        }
-      }
-    }
-    .tabs {
-      border-left: 1px solid #53626833;
-  
-      .tab-box {
-  
-      .tab-item {
-        &.active {
-          color: @deepblue;
-          background-image: @deepblueLinearTop;
-  
-          &::after {
-            border: 1px solid @deepblue;
-          }
-        }
-      }
-    }
-    }
-  }
-  
-  .el-textarea {
-    .el-textarea__inner {
-      color: @black;
-	  background: fade(@gray-l, 20);
-    }
-  }
-  
-  .defect-elimination-tracking {
-	  background: fade(@white, 95);
-	  border: 1px solid fade(@deepblue, 50);
-	  
-    .defect-elimination-tracking-close {
-      &:hover {
-        i {
-          color: @blue;
-        }
-      }
-    }
-  
-    .header-tile-box {
-      .header-tile {
-  
-        .info-form-box {
-          .info-form {
-            .info-form-label {
-              color: @gray;
-            }
-            .info-form-value {
-              color: @black;
-            }
-          }
-        }
-      }
-    }
-    .det-chart-title {
-      color: @black;
-    }
-  
-    .det-chart-sub-title {
-      color: @black;
-    }
-  
-    .det-chart-sub-title-big {
-      color: @black;
-    }
-  }
-  
-  .health-2 {
-    // 电量健康情况
-    .power-info {
-      .info-tab {
-  
-        .tab {
-          color: @black;
-  
-          &:hover,
-          &.active {
-            background: fade(@deepblue, 20);
-            border: 1px solid @deepblue;
-            color: @deepblue;
-            i {
-              svg use {
-                fill: @deepblue;
-              }
-            }
-          }
-  
-          &.active::after {
-            border-bottom: 9px solid @deepblue;
-          }
-        }
-      }
-  
-    }
-    // 风场信息
-    .fc-info {
-      .fc-item {
-  
-        & > .title {
-          color: fade(@black, 75);
-        }
-  
-  
-        .tags {
-          .tag {
-            .tag-title {
-              color: @black;
-            }
-  
-            .tag-value {
-              color: @deepblue;
-              .unit {
-                color: @gray;
-              }
-            }
-          }
-        }
-        .health-info {
-          .title {
-            color: @black;
-            .actions {
-              .action {
-				  color: @gray;
-				  svg use {
-				    fill: @gray;
-				  }
-                &.active,
-                &:hover {
-					background: none;
-                  color: @deepblue;
-                  svg use {
-                    fill: @deepblue;
-                  }
-                }
-              }
-            }
-          }
-  
-          .info-body {
-            .device-list {
-              .item {
-                color: @black;
-                &.green {
-                  color: @green;
-                  background: fade(@green, 20);
-                  border-color: @green;
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  .health-3{
-	  .com-panel{
-		  .green{
-		  		color:@green;
-				&.lengend{
-					background:@blue;
-				}
-		  }
-	  }
-  }
-  .el-time-panel__btn.confirm {
-    color: @deepblue;
-  }
-  
-  // .el-time-panel__btn.cancel {
-  //   color: @gray;
-  // }
-  .health-6 .header-info .selections .item:hover i svg use, .health-6 .header-info .selections .item.active i svg use {
-      fill: @deepblue;
-  }
-  .health-matrix{
-	  .green{
-		  color:@green;
-	  }
-	  .health-matrix-panel {
-		  .header{
-			  .svg-icon svg use{
-				  fill:@black;
-			  }
-			  .tools .tool-block .legend-value{
-			  		color: @black;
-			  }
-		  } 
-	  }
-  }
-  
-  .wind-site .page-common-body .page-common-body-menu .page-common-body-menu-box {
-	  .page-common-body-menu-item{
-	  	  border: 0.093vh solid rgba(@deepblue, 0.4);
-		  &.active{
-			  background:transparent;
-			  border: 0.093vh solid #edbf03;
-			  &::after{
-				border: 0.093vh solid #edbf03;
-			  }
-		  }
-	  }
-  }
-  .main-body input{
-	  color:@black;
-	  background:@white;
-  }
-}

+ 10 - 0
src/router/index.js

@@ -696,6 +696,16 @@ export const asyncRoutes = [
           },
         ],
       },
+      {
+        path: "deviceConfig", // 设备模型配置
+        name: "deviceConfig",
+        component: () => import("@/views/IntegratedAlarm/deviceConfig"),
+        meta: {
+          title: "设备模型配置",
+          icon: "svg-bjpz",
+          permissions: ["jn_alarmConfig"],
+        },
+      },
     ],
   },
   //经济运行

+ 1 - 1
src/views/IntegratedAlarm/alarmConfig/components/custom_components.vue

@@ -173,7 +173,7 @@
                 fit
                 :show-header="false"
                 stripe
-                height="204"
+                height="240"
                 :data="func"
                 @row-dblclick="tabFuncRowClickHandle"
               >

+ 2 - 2
src/views/IntegratedAlarm/alarmConfig/customConfig/index.vue

@@ -181,11 +181,11 @@
       </el-table>
       <div class="pagination">
         <el-pagination
-          layout="total, sizes, prev, pager, next"
           :current-page="query.pageNum"
           :page-size="query.pageSize"
-          :page-sizes="[22, 50, 100, 200, 500]"
           :total="total"
+          layout="total, sizes, prev, pager, next"
+          :page-sizes="[22, 50, 100, 200, 500]"
           @size-change="
             (value) => {
               query.pageSize = value;

+ 391 - 0
src/views/IntegratedAlarm/deviceConfig/components/custom.vue

@@ -0,0 +1,391 @@
+<template>
+  <el-row type="flex" justify="space-between">
+    <div class="handle-box" style="margin-bottom: 10px">
+      <el-button class="buttons" size="mini" round @click="handleInsert">
+        新增记录
+      </el-button>
+      <el-button class="buttons" size="mini" round @click="export2Excel">
+        批量导出</el-button
+      >
+      <el-button class="buttons" size="mini" round @click="outExe">
+        模板下载</el-button
+      >
+      <el-upload
+        style="display: inline; margin-left: 10px"
+        action="/sharding/alertrule2/import"
+        :headers="token"
+        :show-file-list="false"
+        :on-success="handleSuccess"
+        :on-progress="handleProgress"
+        :on-error="handleError"
+      >
+        <el-button class="buttons" size="mini" round @click="exportShow = true">
+          批量导入</el-button
+        >
+      </el-upload>
+    </div>
+    <div style="display: flex; flex-direction: row; margin-bottom: 10px">
+      <el-select
+        v-model="query.category"
+        size="mini"
+        style="width: 150px"
+        popper-class="select"
+      >
+        <el-option
+          key="windturbine"
+          label="风机"
+          value="windturbine"
+        ></el-option>
+        <el-option key="inverter" label="逆变器" value="inverter"></el-option>
+        <!-- <el-option
+          key="booststation"
+          label="升压站"
+          value="booststation"
+        ></el-option> -->
+      </el-select>
+      <el-select
+        v-model="query.station"
+        clearable
+        filterable
+        size="mini"
+        style="width: 150px"
+        placeholder="全部场站"
+        popper-class="select"
+        @change="changeStation()"
+      >
+        <el-option
+          v-for="item in stationList"
+          :key="item.id"
+          :value="item.id"
+          :label="item.name"
+        ></el-option>
+      </el-select>
+      <el-select
+        v-model="query.modelId"
+        clearable
+        filterable
+        size="mini"
+        style="width: 150px"
+        placeholder="全部机型"
+        popper-class="select"
+      >
+        <el-option
+          v-for="item in state.modelList"
+          :key="item"
+          :value="item"
+          :label="item"
+        ></el-option>
+      </el-select>
+      <el-select
+        v-model="query.rank"
+        clearable
+        filterable
+        size="mini"
+        style="width: 150px"
+        placeholder="全部级别"
+        popper-class="select"
+      >
+        <el-option
+          v-for="item in state.rankList"
+          :key="item.id"
+          :value="item.id"
+          :label="item.name"
+        ></el-option>
+      </el-select>
+      <el-input
+        placeholder="请输入名称"
+        v-model="query.name"
+        style="width: 150px; margin-right: 10px"
+        size="mini"
+        clearable
+      ></el-input>
+      <el-button
+        icon="el-icon-search"
+        class="buttons"
+        round
+        size="mini"
+        @click="getData"
+        >搜索</el-button
+      >
+    </div>
+  </el-row>
+  <div class="custom-table">
+    <el-table
+      :data="state.tableData"
+      stripe
+      height="calc(100% - 45px)"
+      style="width: 100%"
+    >
+      <el-table-column label="编码" align="center" prop="id" width="50" />
+      <el-table-column
+        label="场站"
+        align="center"
+        prop="stationName"
+        min-width="50"
+      />
+      <el-table-column
+        label="机型"
+        align="center"
+        prop="modelId"
+        min-width="50"
+      />
+      <el-table-column label="名称" align="left" prop="name" min-width="50" />
+      <el-table-column label="表达式" align="left" prop="expression" />
+      <el-table-column label="级别" align="center" prop="rank" min-width="20">
+        <template #default="scope">{{ rankConvert(scope.row.rank) }}</template>
+      </el-table-column>
+      <el-table-column
+        label="类型"
+        align="center"
+        prop="category"
+        min-width="20"
+      >
+        <template #default="scope">{{
+          categoryConvert(scope.row.category)
+        }}</template>
+      </el-table-column>
+      <el-table-column label="描述" align="left" prop="description" />
+      <el-table-column
+        label="是否启用"
+        align="center"
+        prop="enabled"
+        width="80"
+      >
+        <template #default="scope">
+          {{ scope.row.enabled ? "启用" : "未启用" }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="所属部件"
+        align="center"
+        prop="relatedPartsName"
+        min-width="30"
+      />
+      <el-table-column label="操作" align="center" width="80">
+        <template #default="scope">
+          <el-button
+            style="color: #05bb4c"
+            type="text"
+            icon="el-icon-lx-edit"
+            :disabled="scope.row.range == 1"
+            @click="handleEditClick(scope.row)"
+            >编辑</el-button
+          >
+          <!-- <el-button type="primary" plain round size="mini" icon="el-icon-search" @click="handleViewClick(scope.$index, scope.row)">查看</el-button> -->
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination">
+      <el-pagination
+        layout="total, sizes, prev, pager, next"
+        :page-sizes="[19, 50, 100, 200, 500]"
+        @size-change="
+          (value) => {
+            query.pageSize = value;
+            query.pageNum = 1;
+            getData();
+          }
+        "
+        :current-page="query.pageNum"
+        :page-size="query.pageSize"
+        :total="total"
+        @current-change="handlePageChange"
+      ></el-pagination>
+    </div>
+  </div>
+  <customcomponents
+    @close="dialogclose"
+    :isVisible="state.visible"
+    :form="state.form"
+  />
+</template>
+<script setup>
+import { custombj_fetchTableData, getWtModel } from "@/api/zhbj/index.js";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+import { ref, onMounted, provide, computed, reactive, watch } from "vue";
+import { useStore } from "vuex";
+import { ElMessageBox, ElMessage } from "element-plus";
+import customcomponents from "./custom_components.vue";
+const token = { token: sessionStorage.getItem("token") };
+const store = useStore();
+const stationList = computed(() => store.state.stationList);
+const isStation = computed(() => store.getters.isStation);
+const state = reactive({
+  tableData: [],
+  modelList: [],
+  rankList: [
+    {
+      id: 1,
+      name: "低级",
+    },
+    {
+      id: 2,
+      name: "低中",
+    },
+    {
+      id: 3,
+      name: "中级",
+    },
+    {
+      id: 4,
+      name: "中高级",
+    },
+    {
+      id: 5,
+      name: "高级",
+    },
+  ],
+  visible: false,
+  form: {},
+});
+const query = reactive({
+  pageNum: 1,
+  pageSize: 19,
+  name: "",
+  station: "",
+  rank: "",
+  modelId: "",
+  category: "windturbine",
+});
+let total = ref(0);
+onMounted(() => {
+  getData();
+  getequipmentmodel_list();
+});
+const dialogclose = () => {
+  state.visible = false;
+  getData();
+};
+const getData = async () => {
+  const { data } = await custombj_fetchTableData(query);
+  state.tableData = data.records;
+  total.value = data.total;
+};
+const handleEditClick = (row) => {
+  let obj = Object.assign({}, row);
+  state.form = obj;
+  state.visible = true;
+};
+const handleInsert = () => {
+  state.visible = true;
+};
+
+//changeStation
+const changeStation = async () => {
+  query.modelId = "";
+  await getequipmentmodel_list();
+};
+// 机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getWtModel(query.station);
+  state.modelList = data;
+};
+// 分页导航
+const handlePageChange = (val) => {
+  query.pagenum = val;
+  getData();
+};
+const tableHeader = [
+  "id",
+  "规则名称",
+  "报警类别(1:风气;2:升压站)",
+  "报警级别(1:低级;2:低中级;3:中级;4:中高级;5:高级)",
+  "是否启用(0:停用;1:启用)",
+  "风场",
+  "风机类型",
+  "所属部件",
+  "表达式",
+  "规则描述",
+];
+
+const tableKey = [
+  "id",
+  "name",
+  "category",
+  "rank",
+  "enabled",
+  "station",
+  "modelId",
+  "relatedParts",
+  "expressionShow",
+  "descriptionShow",
+];
+// 批量导出
+const export2Excel = async () => {
+  let { name, station, rank, modelId, category } = query;
+  const res = await custombj_fetchTableData({
+    pageNum: 1,
+    pageSize: 999999,
+    name,
+    station,
+    rank,
+    modelId,
+    category,
+  });
+
+  ElMessage.success(`导出成功!`);
+  outExportExcel(tableHeader, tableKey, res.records, "自定义预警配置导出excel");
+};
+// 模板下载
+const outExe = () => {
+  const data = [];
+  ElMessage.success(`导出成功!`);
+  outExportExcel(tableHeader, tableKey, data, "自定义报警模板");
+};
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  ElMessage.success("导入成功!");
+  getData();
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+const rankConvert = (val) => {
+  if (val === 1) {
+    return "低级";
+  } else if (val === 2) {
+    return "低中级";
+  } else if (val === 3) {
+    return "中级";
+  } else if (val === 4) {
+    return "中高级";
+  } else if (val === 5) {
+    return "高级";
+  }
+};
+// 类型
+const categoryConvert = (val) => {
+  if (val === "windturbine") {
+    return "风机";
+  } else if (val === "inverter") {
+    return "逆变器";
+  } else if (val === "booststation") {
+    return "升压站";
+  }
+};
+</script>
+<style scoped lang="less">
+.custom-table {
+  height: calc(100% - 40px);
+}
+.buttons {
+  background-color: rgba(5, 187, 76, 0.2);
+  border: 1px solid #3b6c53;
+  color: #b3b3b3;
+  font-size: 14px;
+  &:hover {
+    background-color: rgba(5, 187, 76, 0.5);
+    color: #ffffff;
+  }
+}
+.el-select ::v-deep {
+  margin-right: 10px;
+}
+.el-button + .el-button {
+  margin-left: 10px;
+}
+.pagination {
+  padding-top: 10px;
+}
+</style>

+ 754 - 0
src/views/IntegratedAlarm/deviceConfig/components/custom_components.vue

@@ -0,0 +1,754 @@
+<template>
+  <el-dialog v-model="isShow" width="1100px" :before-close="handleClose">
+    <el-form
+      ref="ruleFormRef"
+      :model="form"
+      :rules="rules"
+      label-position="top"
+      label-width="200px"
+      class="custom-comp-form"
+    >
+      <el-row
+        type="flex"
+        justify="space-between"
+        align="middle"
+        :gutter="10"
+        class="first-row"
+      >
+        <el-col :span="15" class="first-row-first-col">
+          <el-form-item prop="name">
+            <el-tag size="small">规则名称</el-tag>
+            <el-input v-model="form.name" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="9" class="first-row-second-col">
+          <el-form-item prop="category">
+            <el-tag size="small">报警类别</el-tag>
+            <el-select v-model="form.category" class="select-mini">
+              <el-option
+                key="windturbine"
+                label="风机"
+                value="windturbine"
+              ></el-option>
+              <el-option
+                key="inverter"
+                label="逆变器"
+                value="inverter"
+              ></el-option>
+              <el-option
+                key="booststation"
+                label="升压站"
+                value="booststation"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="rank">
+            <el-tag size="small">报警级别</el-tag>
+            <el-select v-model="form.rank" class="select-mini">
+              <el-option key="1" label="低级" value="1" />
+              <el-option key="2" label="低中级" value="2" />
+              <el-option key="3" label="中级" value="3" />
+              <el-option key="4" label="中高级" value="4" />
+              <el-option key="5" label="高级" value="5" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="enabled">
+            <el-tag size="small">是否启用</el-tag>
+            <el-switch
+              v-model="form.enabled"
+              :active-value="true"
+              :inactive-value="false"
+              active-color="#13ce66"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="10" class="second-row">
+        <el-col :span="6">
+          <el-form-item prop="stationId">
+            <el-tag size="small">风场</el-tag>
+            <el-select
+              v-model="form.stationId"
+              style="width: 100%"
+              @change="stationChange"
+            >
+              <el-option
+                v-for="item in stationList"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="modelId">
+            <el-tag size="small">风机型号</el-tag>
+            <el-select
+              v-model="form.modelId"
+              style="width: 100%"
+              @change="modelIdChange"
+            >
+              <el-option
+                v-for="item in state.modelList"
+                :key="item"
+                :value="item"
+                :label="item"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="relatedParts">
+            <el-tag size="small">所属部件</el-tag>
+            <el-select v-model="form.relatedParts" style="width: 100%">
+              <el-option
+                v-for="i in state.relatePartList"
+                :key="i.partCode"
+                :value="i.partCode"
+                :label="i.name"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="fault">
+            <el-tag size="small">预警类型</el-tag>
+            <el-select v-model="form.project" style="width: 100%">
+              <el-option
+                v-for="i in faultList"
+                :key="i.value"
+                :value="i.value"
+                :label="i.name"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="9">
+          <el-form-item prop="expression">
+            <el-tag size="small">表达式</el-tag>
+            <el-input
+              type="textarea"
+              rows="14"
+              v-model="form.expression"
+              :value="form.expression"
+              id="expressionInput"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="9">
+          <el-tabs type="border-card">
+            <el-tab-pane label="AI测点">
+              <el-input v-model="state.AIPointSearch"> </el-input>
+              <el-table
+                size="mini"
+                fit
+                :show-header="false"
+                stripe
+                height="204"
+                :data="filterAIList"
+                @row-dblclick="rowDbclick"
+              >
+                <el-table-column prop="uniformCode" />
+                <el-table-column prop="name" />
+              </el-table>
+            </el-tab-pane>
+            <el-tab-pane label="DI测点">
+              <el-input v-model="state.DIPointSearch"> </el-input>
+              <el-table
+                size="mini"
+                fit
+                :show-header="false"
+                stripe
+                height="204"
+                :data="filterDIList"
+                @row-dblclick="rowDbclick"
+              >
+                <el-table-column prop="uniformCode" />
+                <el-table-column prop="name" />
+              </el-table>
+            </el-tab-pane>
+            <el-tab-pane label="函数">
+              <el-table
+                size="mini"
+                fit
+                :show-header="false"
+                stripe
+                height="240"
+                :data="func"
+                @row-dblclick="tabFuncRowClickHandle"
+              >
+                <el-table-column min-width="60%">
+                  <template #default="scope">
+                    <el-popover trigger="hover" placement="bottom">
+                      <p>描述:{{ scope.row.describe }}</p>
+                      <p>参数:{{ scope.row.param }}</p>
+                      <template #reference>
+                        <span size="medium" transition="fade-in-linear">{{
+                          scope.row.lab
+                        }}</span>
+                      </template>
+                    </el-popover>
+                  </template>
+                </el-table-column>
+                <el-table-column min-width="40%">
+                  <template #default="scope">
+                    <el-popover trigger="hover" placement="bottom">
+                      <p>描述:{{ scope.row.describe }}</p>
+                      <p>参数:{{ scope.row.param }}</p>
+                      <template #reference>
+                        <span size="medium" transition="fade-in-linear">{{
+                          scope.row.name
+                        }}</span>
+                      </template>
+                    </el-popover>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </el-tab-pane>
+            <el-tab-pane label="运算符">
+              <div class="operator">
+                <el-button
+                  v-for="item in operator"
+                  :key="item"
+                  size="mini"
+                  class="buttons"
+                  @click="elInputSplit(item)"
+                >
+                  {{ item }}
+                </el-button>
+              </div>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="24">
+          <el-form-item prop="descriptionShow">
+            <el-tag size="small">规则描述</el-tag>
+            <el-input type="textarea" rows="4" v-model="form.descriptionShow" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <span class="footerButton">
+        <el-button round size="mini" @click="closeDialog">取 消</el-button>
+        <el-button round size="mini" @click="submitForm(ruleFormRef)"
+          >确 定</el-button
+        >
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import { ref, onMounted, reactive, computed, watch, nextTick } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import {
+  //   fetchAIPointList,
+  //   fetchDIPointList,
+  //   fetchRelatePart,
+  custombj_postSave,
+  fetch_electrical_point_ai,
+  fetch_electrical_point_di,
+  getWtModel,
+  fetchRelatePartAndAlarmType,
+} from "@/api/zhbj/index.js";
+import { useStore } from "vuex";
+const store = useStore();
+const stationList = computed(() => store.state.stationList);
+onMounted(() => {
+  getfetchRelatePart();
+});
+watch(
+  () => props.isVisible,
+  (val, old) => {
+    isShow.value = val;
+  },
+  {
+    deep: true,
+  }
+);
+watch(
+  () => props.form?.id,
+  (val, old) => {
+    if (val != "") {
+      nextTick(async () => {
+        getfetchAIPointList();
+        getfetchDIPointList();
+      });
+    }
+  },
+  {
+    deep: true,
+  }
+);
+watch(
+  () => props.form,
+  (val, old) => {
+    nextTick(() => {
+      form.value = val;
+    });
+  },
+  {
+    deep: true,
+  }
+);
+const isShow = ref(false);
+const form = ref({
+  id: "",
+  name: "",
+  descriptionShow: "",
+  expression: "",
+  tag: "",
+  rank: "",
+  enabled: "1", // 1可用-0禁用
+  modelId: "",
+  ednaValue: "",
+  category: "",
+  range: 0,
+  station: "",
+  windturbine: "",
+  line: "",
+  project: "",
+  electrical: "",
+  taskstart: "",
+  relatedParts: "",
+  userName: "",
+});
+const emits = defineEmits(["close"]);
+const props = defineProps({
+  isVisible: {
+    type: Boolean,
+    defaule: false,
+  },
+  form: {
+    type: Object,
+  },
+});
+const toEmits = () => {
+  emits("close"); // 向父组件传递数据
+};
+const state = reactive({
+  relatePartList: [],
+  modelList: [],
+  AIPointList: [],
+  DIPointList: [],
+  AIPointSearch: "",
+  DIPointSearch: "",
+});
+const operator = [
+  "+",
+  "-",
+  "*",
+  "/",
+  "(",
+  ")",
+  ">",
+  ">=",
+  "<",
+  "<=",
+  "==",
+  "!=",
+  "&&",
+  "||",
+  "!",
+  "%",
+  "true",
+  "false",
+  ".",
+];
+const func = [
+  {
+    lab: "MR",
+    name: "移动极差",
+    param: "测点名,时间(秒)",
+    describe: "是指两个或多个连续样本值中最大值与最小值之差",
+    scene: "测点的移动极差超限报警",
+  },
+  {
+    lab: "MAR",
+    name: "均值极差",
+    param: "测点名,时间(秒)",
+    describe: "",
+    scene: "测点的均值极差计算",
+  },
+  {
+    lab: "RiseExceed",
+    name: "上升趋势",
+    param: "测点名,时间(秒),阈值",
+    describe: "取测点在给定的时间范围内数据上升的量是否超过阈值",
+    scene: "测点值的上升速度过快等",
+  },
+  {
+    lab: "Sustain",
+    name: "持续时间",
+    param: "表达式,时间(秒)",
+    describe:
+      "判定状态(表达式成立)持续的时间是否超过给定的时间判断状态持续的时间",
+    scene: "",
+  },
+  {
+    lab: "LastUpdateTime",
+    name: "最近数据时间",
+    param: "测点名",
+    describe: "",
+    scene: "判定离线,状态持续时间等",
+  },
+  {
+    lab: "abs",
+    name: "取绝对值",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "acos",
+    name: "反余弦",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "asin",
+    name: "反正弦",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "atan",
+    name: "反正切",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "atan2",
+    name: "xy坐标转为极坐标",
+    param: "x,y",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "ceiling",
+    name: "向上取整",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "cos",
+    name: "余弦",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "cosh",
+    name: "双曲线余弦",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "exp",
+    name: "欧拉数 e 的 double 次幂的值",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "floor",
+    name: "向下取整",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "log",
+    name: "自然对数",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "log10",
+    name: "底数为 10 的对数",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "max",
+    name: "比较最大值",
+    param: "double a, double b",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "min",
+    name: "比较最小值",
+    param: "double a, double b",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "pow",
+    name: "返回第一个参数的第二个参数次幂的值",
+    param: "double a, double b",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "round",
+    name: "返回最接近参数的 long,或int",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "sign",
+    name: "负数返回-1.0,整数返回1.0,0返回0.0",
+    param: "float f/double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "sin",
+    name: "三角正弦值",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "sinh",
+    name: "双曲线正弦",
+    param: "double x",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "sqrt",
+    name: "正平方根",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "tan",
+    name: "正切",
+    param: "double a",
+    describe: "",
+    scene: "",
+  },
+  {
+    lab: "tanh",
+    name: "双曲线正切",
+    param: "double x",
+    describe: "",
+    scene: "",
+  },
+  { lab: "PI", name: "圆周率", param: "", describe: "", scene: "" },
+  { lab: "E", name: "自然对数", param: "", describe: "", scene: "" },
+];
+const faultList = [
+  {
+    value: "sensors",
+    name: "传感器异常",
+  },
+  {
+    value: "parts",
+    name: "零部件隐患",
+  },
+  {
+    value: "control",
+    name: "控制参数优化",
+  },
+  {
+    value: "performance",
+    name: "性能下降",
+  },
+];
+const ruleFormRef = ref(null);
+const rules = reactive({
+  name: [{ required: true, message: "请输入规则名称", trigger: "blur" }],
+  category: [{ required: true, message: "请选择报警类别", trigger: "change" }],
+  rank: [{ required: true, message: "请选择报警级别", trigger: "change" }],
+  stationId: [{ required: true, message: "请选择风场", trigger: "change" }],
+  expression: [
+    { required: true, message: "表达式不能为空", trigger: "change" },
+  ],
+});
+
+//stationChange
+const stationChange = async () => {
+  form.value.modelId = "";
+  getequipmentmodel_list();
+};
+//modelIdChange
+const modelIdChange = async () => {
+  getfetchAIPointList();
+  getfetchDIPointList();
+};
+//机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getWtModel(form.value.stationId);
+  state.modelList = data;
+};
+//所属部件
+const getfetchRelatePart = async () => {
+  const res = await fetchRelatePartAndAlarmType();
+  state.relatePartList = res;
+};
+// 查询风场AI、DI测点
+const getfetchAIPointList = async () => {
+  //   const res = await fetchAIPointList(form.value.station, form.value.modelId);
+  //   state.AIPointList = res.sort(function (a, b) {
+  //     return a.uniformCode - b.uniformCode;
+  //   });
+};
+const filterAIList = computed(() =>
+  state.AIPointList?.filter(
+    (data) =>
+      !state.AIPointSearch ||
+      data.uniformCode.includes(state.AIPointSearch) ||
+      data.name.includes(state.AIPointSearch)
+  )
+);
+const filterDIList = computed(() =>
+  state.DIPointList?.filter(
+    (data) =>
+      !state.DIPointSearch ||
+      data.uniformCode.includes(state.DIPointSearch) ||
+      data.name.includes(state.DIPointSearch)
+  )
+);
+const getfetchDIPointList = async () => {
+  const res = await fetchDIPointList(form.value.station, form.value.modelId);
+  state.DIPointList = res.sort(function (a, b) {
+    return a.uniformCode - b.uniformCode;
+  });
+};
+// 函数点击事件
+const tabFuncRowClickHandle = (row) => {
+  let elInput = document.getElementById("expressionInput");
+  let startPos = elInput.selectionStart; //第0个字符到选中的字符
+  let endPos = elInput.selectionEnd; //选中字符到末尾字符
+  if (startPos === undefined || endPos === undefined) return;
+  let txt = elInput.value;
+  let func;
+  if (
+    row.lab === "MR" ||
+    row.lab === "MAR" ||
+    row.lab === "RiseExceed" ||
+    row.lab === "Sustain" ||
+    row.lab === "LastUpdateTime"
+  ) {
+    func = row.lab + "()";
+  } else if (row.lab === "PI" || row.lab === "E") {
+    func = "Math." + row.lab;
+  } else {
+    func = "Math." + row.lab + "()";
+  }
+  // 将插值添加到选中光标位置
+  let result = txt.substring(0, startPos) + func + txt.substring(endPos);
+  elInput.value = result;
+  // 重新定义光标位置
+  elInput.focus();
+  if (row.lab === "PI" || row.lab === "E") {
+    elInput.selectionStart = startPos + func.length;
+    elInput.selectionEnd = startPos + func.length;
+  } else {
+    elInput.selectionStart = startPos + func.length - 1;
+    elInput.selectionEnd = startPos + func.length - 1;
+  }
+  form.value.expression = result; // 赋值给表单中的的字段
+};
+//rowDbclick
+const rowDbclick = (row) => {
+  elInputSplit(row.uniformCode);
+};
+// 表达式字符串拼接
+const elInputSplit = async (val) => {
+  let elInput = document.getElementById("expressionInput");
+  let startPos = elInput.selectionStart;
+  let endPos = elInput.selectionEnd;
+  if (startPos === undefined || endPos === undefined) return;
+  let txt = elInput.value;
+  let txtSplit = val;
+  let result = txt.substring(0, startPos) + txtSplit + txt.substring(endPos);
+  elInput.value = result;
+  elInput.focus();
+  elInput.selectionStart = startPos + txtSplit.length;
+  elInput.selectionEnd = startPos + txtSplit.length;
+};
+//保存
+const save = async () => {
+  const res = await custombj_postSave(form.value);
+  console.warn(res);
+  ElMessage.success(`保存成功!`);
+  closeDialog();
+};
+//提交
+const submitForm = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      save();
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+//reset
+const resetForm = (formEl) => {
+  formEl.resetFields();
+};
+//confirm关闭
+const handleClose = () => {
+  ElMessageBox.confirm("确认关闭?")
+    .then(() => {
+      closeDialog();
+    })
+    .catch(() => {
+      // catch error
+    });
+};
+//关闭触发事件
+const closeDialog = () => {
+  resetForm(ruleFormRef.value);
+  state.AIPointList = [];
+  state.DIPointList = [];
+  toEmits();
+};
+</script>
+<style lang="scss" scoped>
+.col-box {
+  display: flex;
+  flex-direction: column;
+}
+
+.select-mini {
+  width: 120px;
+}
+
+.el-tabs__content {
+  padding: 0 !important;
+}
+
+.el-tabs--border-card {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+
+.border {
+  border: solid red 1px;
+}
+
+.el-table--mini td {
+  padding: 3px 0;
+}
+
+.el-button-group .el-button--primary {
+  border: none;
+}
+
+.el-form--label-top .el-form-item__label {
+  padding: 0;
+}
+</style>

+ 345 - 0
src/views/IntegratedAlarm/deviceConfig/components/faultmode.vue

@@ -0,0 +1,345 @@
+<template>
+  <div style="width: 100%; height: 100%">
+    <div class="btns">
+      <el-button
+        size="mini"
+        class="buttons"
+        round
+        @click="handleEdit(state.addFormData)"
+        >新增</el-button
+      >
+      <el-upload
+        style="display: inline-block; margin: 0 10px 10px 10px"
+        class="upload-demo"
+        action="/sharding/device/faultmode/input"
+        :show-file-list="false"
+        :on-success="handleSuccess"
+        :on-progress="handleProgress"
+        :on-error="handleError"
+      >
+        <el-button
+          size="mini"
+          class="buttons"
+          round
+          :disabled="state.faultmodeTableData.length == 0"
+          >导入</el-button
+        >
+      </el-upload>
+      <el-button
+        size="mini"
+        class="buttons"
+        round
+        @click="export2Excel"
+        :disabled="state.faultmodeTableData.length == 0"
+        >导出</el-button
+      >
+    </div>
+
+    <el-table
+      :data="state.faultmodeTableData"
+      stripe
+      style="width: 100%"
+      height="calc(100% - 38px)"
+    >
+      <el-table-column type="index" width="50" />
+      <el-table-column prop="name" label="名称"></el-table-column>
+      <el-table-column prop="code" label="故障编码"></el-table-column>
+      <el-table-column label="频度" width="50">
+        <template #default="scope">
+          {{ rank(scope.row.occurence) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="严酷度" width="70">
+        <template #default="scope">
+          {{ rank(scope.row.severity) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="难检度" width="70">
+        <template #default="scope">
+          {{ rank(scope.row.detection) }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="cause" label="原因"></el-table-column>
+      <el-table-column prop="effects" label="导致结果"></el-table-column>
+      <el-table-column prop="measure" label="处理方法"></el-table-column>
+      <el-table-column label="操作" width="180" align="center">
+        <template #default="scope">
+          <el-button
+            type="text"
+            style="color: #05bb4c"
+            @click="handleEdit(scope.row)"
+            >编辑</el-button
+          >
+          <el-button
+            type="text"
+            style="color: red"
+            @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 传感点编辑弹出框 -->
+    <el-dialog v-model="editVisible" width="40%">
+      <el-form :model="editFormData" label-width="80px">
+        <el-form-item label="故障编码">
+          <el-input v-model="editFormData.code"></el-input>
+        </el-form-item>
+        <el-form-item label="名称">
+          <el-input v-model="editFormData.name"></el-input>
+        </el-form-item>
+        <el-form-item label="导致结果">
+          <el-input
+            v-model="editFormData.effects"
+            :rows="2"
+            clearable
+            type="textarea"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="原因">
+          <el-input
+            v-model="editFormData.cause"
+            :rows="2"
+            clearable
+            type="textarea"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="处理方法">
+          <el-input
+            v-model="editFormData.measure"
+            :rows="3"
+            clearable
+            type="textarea"
+          ></el-input>
+        </el-form-item>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="严酷度">
+              <el-select v-model="editFormData.severity">
+                <el-option
+                  v-for="item in selectOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="频度">
+              <el-select v-model="editFormData.occurence">
+                <el-option
+                  v-for="item in selectOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option
+              ></el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12"
+            ><el-form-item label="难检度">
+              <el-select v-model="editFormData.detection">
+                <el-option
+                  v-for="item in selectOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option
+              ></el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="结构">
+              <el-cascader
+                v-model="editFormData.structurecode"
+                :options="cascaderdata"
+                :props="{ checkStrictly: true, emitPath: false }"
+                clearable
+              /> </el-form-item
+          ></el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <span class="footerButton">
+          <el-button size="mini" round @click="editVisible = false"
+            >取 消</el-button
+          >
+          <el-button size="mini" round type="primary" @click="saveEdit"
+            >确 定</el-button
+          >
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, onMounted, reactive, inject, watch } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+import {
+  faultmode_windturbine,
+  faultmode_structurecode,
+  faultmode_delete,
+  faultmode_add_edit,
+} from "@/api/zhbj/index.js";
+let cascaderdata = inject("cascaderdata");
+let desc = inject("desc");
+let treeId = inject("treeId");
+watch(
+  () => treeId,
+  (val, old) => {
+    getfaultmode(desc.value.code);
+  },
+  {
+    deep: true,
+  }
+);
+let editVisible = ref(false);
+let editFormData = ref({});
+onMounted(() => {
+  getfaultmode(desc.value.code);
+});
+const selectV = {
+  1: "I",
+  2: "II",
+  3: "III",
+  4: "IV",
+  5: "V",
+};
+const selectOptions = [
+  {
+    label: "I",
+    value: 1,
+  },
+  {
+    label: "II",
+    value: 2,
+  },
+  {
+    label: "III",
+    value: 3,
+  },
+  {
+    label: "IV",
+    value: 4,
+  },
+  {
+    label: "V",
+    value: 5,
+  },
+];
+const rank = (v) => {
+  return selectV[v] || "";
+};
+let state = reactive({
+  faultmodeTableData: [],
+  addFormData: {
+    code: "",
+    name: "",
+    effects: "",
+    cause: "",
+    measure: "",
+    severity: null,
+    occurence: null,
+    detection: null,
+    deviceid: "windturbine",
+    structurecode: "",
+    models: null,
+  },
+});
+// 新增 编辑
+const handleEdit = (row) => {
+  editFormData.value = row;
+  editVisible.value = true;
+};
+
+// 测点 删除
+const handleDelete = (row) => {
+  // 二次确认删除
+  ElMessageBox.confirm("确定要删除吗?", "提示", {
+    type: "warning",
+  })
+    .then(async () => {
+      const res = await faultmode_delete(row.id);
+      if (res == 1) {
+        ElMessage.success(`删除成功!`);
+      } else {
+        ElMessage.success("删除失败");
+      }
+      getfaultmode(desc.value.code);
+    })
+    .catch(() => {});
+};
+// 保存编辑
+const saveEdit = async () => {
+  const res = await faultmode_add_edit(editFormData.value);
+  if (res.code === 200) {
+    ElMessage.success(`操作成功!`);
+    editVisible.value = false;
+    getfaultmode(desc.value.code);
+  } else {
+    ElMessage.success(res.msg);
+  }
+};
+// getData
+const getfaultmode = async (code) => {
+  const res = await faultmode_structurecode(code);
+  state.faultmodeTableData = res;
+};
+
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  ElMessage.success(response.msg);
+  getfaultmode(desc.value.code);
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+// 批量导出
+const export2Excel = () => {
+  const tableData = state.faultmodeTableData;
+  // loading.close();
+  ElMessage.success(`导出成功!`);
+  const tableHeader = [
+    "上级结构编码",
+    "名称",
+    "故障编码",
+    "频度",
+    "严酷度",
+    "难检度",
+    "原因",
+    "导致结果",
+    "处理方法",
+  ];
+  const tableKey = [
+    "structurecode",
+    "name",
+    "code",
+    "occurence",
+    "severity",
+    "detection",
+    "cause",
+    "effects",
+    "measure",
+  ];
+  outExportExcel(tableHeader, tableKey, tableData, "故障模式导出excel");
+};
+</script>
+<style lang="less" scoped>
+.buttons {
+  background-color: rgba(5, 187, 76, 0.2);
+  border: 1px solid #3b6c53;
+  color: #b3b3b3;
+  font-size: 14px;
+  &:hover {
+    background-color: rgba(5, 187, 76, 0.5);
+    color: #ffffff;
+  }
+}
+</style>

+ 77 - 0
src/views/IntegratedAlarm/deviceConfig/components/message.vue

@@ -0,0 +1,77 @@
+<template>
+  <div style="width: 50%">
+    <el-form :model="desc" label-width="100px">
+      <el-form-item label="结构编码">
+        <el-input v-model="desc.code"></el-input>
+      </el-form-item>
+      <el-form-item label="上级节点">
+        <el-cascader
+          v-model="desc.parentcode"
+          :options="cascaderdata"
+          :props="{ checkStrictly: true, emitPath: false }"
+          :show-all-levels="false"
+          clearable
+        />
+      </el-form-item>
+      <el-form-item label="设备ID">
+        <el-input v-model="desc.deviceid" disabled></el-input>
+      </el-form-item>
+      <el-form-item label="结构名称">
+        <el-input v-model="desc.name"></el-input>
+      </el-form-item>
+      <el-form-item label="结构英文名称">
+        <el-input v-model="desc.enname"></el-input>
+      </el-form-item>
+      <el-form-item label="英文缩写">
+        <el-input v-model="desc.sortname"></el-input>
+      </el-form-item>
+      <el-form-item label="描述">
+        <el-input
+          v-model="desc.description"
+          :rows="4"
+          clearable
+          type="textarea"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="序号">
+        <el-input v-model="desc.orderno"></el-input>
+      </el-form-item>
+      <el-form-item label="是否有效">
+        <div style="height: 100%; display: flex; align-items: center">
+          <el-switch
+            v-model="desc.enabled"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+          />
+        </div>
+      </el-form-item>
+    </el-form>
+    <el-button
+      style="float: right"
+      type="primary"
+      @click="savedesc"
+      :disabled="desc.code == ''"
+      >保存</el-button
+    >
+  </div>
+</template>
+<script setup>
+import { ref, onMounted, inject } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { treeAdd } from "@/api/zhbj/index.js";
+let desc = inject("desc");
+let cascaderdata = inject("cascaderdata");
+const savedesc = async () => {
+  const res = await treeAdd(desc.value);
+  if (res.code === 200) {
+    ElMessage.success(`操作成功!`);
+  } else {
+    ElMessage.success(res.msg);
+  }
+};
+</script>
+<style lang="less" scoped>
+.el-switch {
+  display: block;
+}
+</style>

+ 472 - 0
src/views/IntegratedAlarm/deviceConfig/components/point.vue

@@ -0,0 +1,472 @@
+<template>
+  <div class="devicemenu">
+    <el-space wrap :size="10">
+      <el-button
+        type="primary"
+        @click="handleEdit(state.addFormData)"
+        :disabled="desc.code == ''"
+        >新增</el-button
+      >
+      <el-input
+        v-model="state.SearchVal"
+        placeholder="筛选"
+        style="width: 180px"
+        size="small"
+      />
+      <el-select
+        v-model="state.selectModel"
+        class="mr10"
+        style="width: 180px"
+        placeholder="全部"
+      >
+        <el-option
+          v-for="item in state.modelList"
+          :key="item"
+          :value="item"
+          :label="item"
+        ></el-option>
+      </el-select>
+      <el-select
+        v-model="state.selectPoint"
+        class="mr10"
+        style="width: 100px"
+        placeholder="全部"
+      >
+        <el-option key="1" label="全部" value=""></el-option>
+        <el-option key="2" label="遥测" value="AI"></el-option>
+        <el-option key="3" label="遥调" value="MI"></el-option>
+        <el-option key="4" label="计算" value="CI"></el-option>
+      </el-select>
+      <el-button type="primary" @click="search">查询</el-button>
+      <el-upload
+        class="upload-demo"
+        :disabled="desc.code == ''"
+        action="/sharding/device/input"
+        :show-file-list="false"
+        :on-success="handleSuccess"
+        :on-progress="handleProgress"
+        :on-error="handleError"
+      >
+        <el-button :disabled="desc.code == ''" type="primary">导入</el-button>
+      </el-upload>
+      <el-button
+        type="primary"
+        @click="export2Excel"
+        :disabled="desc.code == ''"
+        >导出</el-button
+      >
+    </el-space>
+  </div>
+  <el-table
+    :data="state.pointTableData"
+    stripe
+    style="width: 100%"
+    height="65vh"
+  >
+    <el-table-column type="index" width="50" />
+    <el-table-column prop="metriccode" label="测点编码"></el-table-column>
+    <el-table-column label="名称">
+      <template #default="scope">
+        <el-popover placement="right" :width="260" trigger="click">
+          <template #reference>
+            <el-button type="text" size="small">{{ scope.row.name }}</el-button>
+          </template>
+          <el-table :data="scope.row.deviceModelMetrics" max-height="400px">
+            <el-table-column
+              property="devicemodel"
+              label="机型"
+              align="center"
+            ></el-table-column>
+            <el-table-column
+              property="uniformcode"
+              label="统一编码"
+              align="center"
+            ></el-table-column>
+            <el-table-column
+              property="multiplier"
+              label="倍率"
+              align="center"
+            ></el-table-column>
+          </el-table>
+        </el-popover>
+      </template>
+    </el-table-column>
+
+    <el-table-column prop="unitname" label="单位"></el-table-column>
+    <el-table-column prop="categorydata" label="测点类型"></el-table-column>
+    <el-table-column prop="categorysci" label="物理类型"></el-table-column>
+    <el-table-column prop="categorysci" label="数据类型"></el-table-column>
+    <el-table-column prop="description" label="描述"></el-table-column>
+    <el-table-column label="操作" width="180" align="center">
+      <template #default="scope">
+        <el-button
+          type="text"
+          icon="el-icon-edit"
+          @click="handleEdit(scope.row)"
+          >编辑</el-button
+        >
+        <el-button
+          type="text"
+          icon="el-icon-delete"
+          style="color: red"
+          @click="handleDelete(scope.row)"
+          >删除</el-button
+        >
+      </template>
+    </el-table-column>
+  </el-table>
+  <div class="pagination">
+    <el-pagination
+      background
+      layout="total, prev, pager, next"
+      hide-on-single-page
+      :current-page="query.page"
+      :page-size="query.limit"
+      :total="pageTotal"
+      @current-change="handlePageChange"
+    ></el-pagination>
+  </div>
+  <!-- 传感点编辑弹出框 -->
+  <el-dialog v-model="editVisible" width="40%">
+    <el-form :model="editFormData" label-width="80px">
+      <el-form-item label="编码">
+        <el-input v-model="editFormData.metriccode"></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="名称">
+            <el-input v-model="editFormData.name"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="英文名称">
+            <el-input v-model="editFormData.enname"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="标准单位">
+            <el-input v-model="editFormData.unitname"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="单位名称">
+            <el-input v-model="editFormData.unitnamecn"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="描述">
+        <el-input
+          v-model="editFormData.description"
+          :rows="3"
+          type="textarea"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="数据类型">
+            <el-select v-model="editFormData.categorydata" placeholder="Select">
+              <el-option
+                v-for="item in state.categorydataoptions"
+                :key="item"
+                :label="item"
+                :value="item"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="结构">
+            <el-cascader
+              v-model="editFormData.structurecode"
+              :options="cascaderdata"
+              :props="{ checkStrictly: true, emitPath: false }"
+              clearable
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="物理类型">
+            <el-input v-model="editFormData.categorysci"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="系统分类">
+            <el-input v-model="editFormData.categorysys"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-form-item label="适配机型" class="deviceModelClass">
+        <el-select
+          v-model="state.deviceModelSel"
+          style="margin-right: 20px"
+          placeholder="新增机型"
+          size="mini"
+        >
+          <el-option
+            v-for="item in state.deviceModel"
+            :key="item.code"
+            :label="item.code"
+            :value="item.code"
+          >
+          </el-option>
+        </el-select>
+        <el-button
+          v-show="state.deviceModelSel != ''"
+          size="mini"
+          type="primary"
+          @click="deviceModelAdd()"
+          >新增机型
+        </el-button>
+        <el-table
+          :data="editFormData.deviceModelMetrics"
+          style="width: 100%; margin-top: 10px"
+          max-height="200px"
+        >
+          <el-table-column prop="devicemodel" label="机型" />
+          <el-table-column label="倍率">
+            <template #default="scope">
+              <el-input v-model="scope.row.multiplier" size="mini" />
+            </template>
+          </el-table-column>
+          <el-table-column label="统一编码">
+            <template #default="scope">
+              <el-input v-model="scope.row.uniformcode" size="mini" />
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="editVisible = false">取 消</el-button>
+        <el-button type="primary" @click="saveEdit">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import { ref, onMounted, inject, reactive, watch } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import {
+  point,
+  metrics,
+  delmetrics,
+  device_list,
+  getStationinfo,
+} from "@/api/zhbj/index.js";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+onMounted(() => {
+  getPoint(desc.value);
+  getDeviceModel();
+  getequipmentmodel_list();
+});
+let editFormData = ref({});
+let editVisible = ref(false); //传感点
+let desc = inject("desc");
+let treeId = inject("treeId");
+let cascaderdata = inject("cascaderdata");
+watch(
+  () => treeId,
+  (newV, old) => {
+    state.addFormData.structurecode = desc.value.code;
+    getPoint(desc.value);
+  },
+  {
+    deep: true,
+  }
+);
+let state = reactive({
+  pointTableData: "",
+  SearchVal: "",
+  selectPoint: "",
+  selectModel: "",
+  modelList: [],
+  categorydataoptions: ["AI", "DI", "CI"],
+  addFormData: {
+    categorydata: "AI",
+    categoryres1: null,
+    categoryres2: null,
+    categoryres3: null,
+    categoryres4: null,
+    categoryres5: null,
+    categorysci: null,
+    categorysys: null,
+    description: null,
+    deviceid: "windturbine",
+    enname: null,
+    id: null,
+    metriccode: "",
+    name: "",
+    structurecode: "101010205",
+    unitname: null,
+    unitnamecn: null,
+    deviceModelMetrics: [],
+  },
+});
+const query = reactive({
+  page: 1,
+  limit: 10,
+});
+let pageTotal = ref(0);
+const search = async () => {
+  getPoint(desc.value);
+};
+// getPoint
+const getPoint = async (node) => {
+  const res = await point(
+    node.code,
+    query.page,
+    query.limit,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  console.warn(res);
+  pageTotal.value = res.total;
+  state.pointTableData = res.records?.sort((a, b) => {
+    return a.id - b.id;
+  });
+};
+// 机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getStationinfo("");
+  let arr = [];
+  data.forEach((e) => {
+    arr.push(...e.modelList);
+  });
+  state.modelList = [...new Set(arr)];
+};
+// 测点 编辑
+const handleEdit = (row) => {
+  console.warn(row);
+  if (!row.deviceModelMetrics) {
+    row.deviceModelMetrics = [];
+  }
+  editFormData.value = row;
+  editVisible.value = true;
+};
+//测点 add
+const postmetrics = async () => {
+  console.warn(editFormData.value);
+  const res = await metrics(editFormData.value);
+  console.warn(res);
+  if (res.status == 20000) {
+    ElMessage.success(`操作成功!`);
+    editVisible.value = false;
+  } else {
+    ElMessage.success(res.msg);
+  }
+  getPoint(desc.value);
+};
+// 保存编辑
+const saveEdit = async () => {
+  postmetrics();
+};
+// 测点 删除
+const handleDelete = (row) => {
+  // 二次确认删除
+  ElMessageBox.confirm("确定要删除吗?", "提示", {
+    type: "warning",
+  })
+    .then(async () => {
+      console.warn(row);
+      const res = await delmetrics(row.id);
+      console.warn(res);
+      if (res == 1) {
+        ElMessage.success(`删除成功!`);
+      } else {
+        ElMessage.success("删除失败");
+      }
+      getPoint(desc.value);
+    })
+    .catch(() => {});
+};
+
+//deviceModelAdd 新增机型
+const deviceModelAdd = async () => {
+  if (state.deviceModelSel == "") return;
+  console.warn();
+  let obj = {
+    deviceid: editFormData.value.deviceid,
+    devicemodel: state.deviceModelSel,
+    id: null,
+    metriccode: editFormData.value.metriccode,
+    multiplier: 0,
+    uniformcode: "",
+  };
+  editFormData.value.deviceModelMetrics.push(obj);
+};
+//getDeviceModel
+const getDeviceModel = async () => {
+  const res = await device_list();
+  state.deviceModel = res;
+  console.warn(res);
+};
+
+// 分页导航
+const handlePageChange = (val) => {
+  query.page = val;
+  getPoint(desc.value);
+};
+
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  console.warn(response, file, fileList);
+  ElMessage.success("导入成功!");
+  getPoint(desc.value);
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+
+// 批量导出
+const export2Excel = async () => {
+  const tableData = await point(
+    desc.value.code,
+    1,
+    99999999,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  ElMessage.success(`导出成功!`);
+  const tableHeader = [
+    "上级结构编码",
+    "测点编码",
+    "名称",
+    "英文名称",
+    "单位",
+    "测点类型",
+    "物理类型",
+    "描述",
+  ];
+  const tableKey = [
+    "structurecode",
+    "metriccode",
+    "name",
+    "enname",
+    "unitname",
+    "categorydata",
+    "categorysci",
+    "description",
+  ];
+  outExportExcel(tableHeader, tableKey, tableData.records, "测点导出excel");
+};
+</script>
+<style lang="scss" scoped>
+.devicemenu {
+  margin-bottom: 10px;
+}
+</style>

+ 390 - 0
src/views/IntegratedAlarm/deviceConfig/components/windturbine.vue

@@ -0,0 +1,390 @@
+<template>
+  <div style="width: 100%; height: 100%">
+    <el-row type="flex" justify="space-between">
+      <div class="handle-box" style="margin-bottom: 10px">
+        <el-button size="mini" round class="buttons" @click="handleInsert">
+          新增记录
+        </el-button>
+        <el-button size="mini" round class="buttons" @click="export2Excel">
+          批量导出</el-button
+        >
+        <el-button size="mini" round class="buttons" @click="outExe">
+          模板下载</el-button
+        >
+        <el-upload
+          style="display: inline; margin-left: 10px"
+          action="/sharding/warning2/import"
+          :headers="token"
+          :show-file-list="false"
+          :on-success="handleSuccess"
+          :on-progress="handleProgress"
+          :on-error="handleError"
+        >
+          <el-button
+            size="mini"
+            round
+            class="buttons"
+            @click="exportShow = true"
+          >
+            批量导入</el-button
+          >
+        </el-upload>
+      </div>
+      <div style="display: flex; flex-direction: row; margin-bottom: 10px">
+        <el-select
+          v-if="!isStation"
+          v-model="query.stationId"
+          clearable
+          size="mini"
+          style="width: 150px"
+          placeholder="全部场站"
+          popper-class="select"
+          @change="changeStation()"
+        >
+          <el-option
+            v-for="item in stationList"
+            :key="item.id"
+            :value="item.id"
+            :label="item.name"
+          ></el-option>
+        </el-select>
+        <el-select
+          v-model="query.modelId"
+          clearable
+          size="mini"
+          style="width: 150px"
+          placeholder="全部机型"
+          popper-class="select"
+        >
+          <el-option
+            v-for="item in state.modelList"
+            :key="item"
+            :value="item"
+            :label="item"
+          ></el-option>
+        </el-select>
+
+        <el-input
+          placeholder="请输入名称"
+          v-model="query.name"
+          style="width: 150px; margin-right: 10px"
+          size="mini"
+          clearable
+        ></el-input>
+        <el-button
+          icon="el-icon-search"
+          size="mini"
+          round
+          class="buttons"
+          @click="getData"
+          >搜索</el-button
+        >
+      </div>
+    </el-row>
+    <div class="wind-table">
+      <el-table
+        :data="state.tableData"
+        size="mini"
+        style="width: 100%"
+        stripe
+        height="calc(100% - 43px)"
+      >
+        <el-table-column label="序列号" align="center" prop="id" />
+        <el-table-column label="统一编码" align="center" prop="uniformCode">
+          <template #default="scope">{{
+            // ednaValueConvert(scope.row.ednaValue)
+            scope.row.uniformCode
+          }}</template>
+        </el-table-column>
+        <el-table-column
+          label="描述"
+          align="left"
+          prop="description"
+          width="180"
+        />
+        <el-table-column
+          label="停机类型"
+          align="center"
+          prop="characteristic"
+        />
+        <el-table-column label="风机型号" align="center" prop="modelId" />
+        <el-table-column label="报警类型" align="center" prop="alarmTypeName" />
+        <el-table-column label="故障编码" align="center" prop="nemCode" />
+        <el-table-column label="报警级别" align="center">
+          <template #default="scope">{{
+            levelIdConvert(scope.row.rank)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="报警分类" align="center" min-width="50">
+          <template #default="scope">{{
+            warningClassIfyIdConvert(scope.row.deviceType)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="是否可以复位" align="center" min-width="50">
+          <template #default="scope">{{
+            scope.row.resetTable ? "是" : "否"
+          }}</template>
+        </el-table-column>
+        <el-table-column label="是否启用" align="center" min-width="50">
+          <template #default="scope">{{
+            scope.row.enabled == 1 ? "是" : "否"
+          }}</template>
+        </el-table-column>
+        <el-table-column
+          label="关联部件"
+          align="center"
+          min-width="50"
+          prop="componentsName"
+        />
+
+        <el-table-column label="操作" align="center" width="100">
+          <template #default="scope">
+            <el-button
+              type="text"
+              style="color: #05bb4c"
+              icon="el-icon-lx-edit"
+              @click="handleEditClick(scope.row)"
+            >
+              编辑</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="pagination">
+        <el-pagination
+          layout="total, sizes, prev, pager, next"
+          :page-sizes="[19, 50, 100, 200, 500]"
+          @size-change="
+            (value) => {
+              query.pageSize = value;
+              query.pageNum = 1;
+              getData();
+            }
+          "
+          :current-page="query.pageNum"
+          :page-size="query.pageSize"
+          :total="total"
+          @current-change="handlePageChange"
+        ></el-pagination>
+      </div>
+    </div>
+    <windturbinecomponents
+      @close="dialogclose"
+      :isVisible="state.visible"
+      :form="state.form"
+    />
+  </div>
+</template>
+<script setup>
+import {
+  windturbinebj_fetchTableData,
+  getWtModel,
+  getWpList,
+} from "@/api/zhbj/index.js";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+import { ref, onMounted, provide, computed, reactive, watch } from "vue";
+import { useStore } from "vuex";
+import { ElMessageBox, ElMessage } from "element-plus";
+import windturbinecomponents from "./windturbine_components.vue";
+const token = { token: sessionStorage.getItem("token") };
+const store = useStore();
+const stationList = ref([]);
+
+const getStationList = async () => {
+  const { data } = await getWpList("windturbine");
+  stationList.value = data || [];
+};
+const isStation = computed(() => stationList.value.length);
+const state = reactive({
+  tableData: [],
+  modelList: [],
+  visible: false,
+  form: {},
+});
+const query = reactive({
+  pageNum: 1,
+  pageSize: 19,
+  stationId: "",
+  modelId: "",
+  name: "",
+});
+let total = ref(0);
+onMounted(() => {
+  getStationList();
+  getData();
+  getequipmentmodel_list();
+});
+const dialogclose = () => {
+  state.visible = false;
+  getData();
+};
+const getData = async () => {
+  const { data } = await windturbinebj_fetchTableData(query);
+  data.records.forEach((ele) => {
+    ele.alarmTypeName = warningClassIfyIdConvert(ele.alarmType);
+  });
+  state.tableData = data.records;
+  total.value = data.total;
+};
+const handleInsert = () => {
+  state.visible = true;
+};
+const handleEditClick = (row) => {
+  console.warn(row);
+  let obj = Object.assign({}, row);
+  state.form = obj;
+  state.visible = true;
+};
+//changeStation
+const changeStation = async () => {
+  query.modelId = "";
+  await getequipmentmodel_list();
+};
+// 机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getWtModel(query.stationId);
+  state.modelList = data || [];
+};
+// 分页导航
+const handlePageChange = (val) => {
+  query.pagenum = val;
+  getData();
+};
+
+const tableHeader = [
+  "id",
+  "报警级别(ZC_BJ:运转正常;YJ_BJ:运转状态超出标准范围;GZ_BJ:非正常停止运转;WH_BJ:停机维护;XD_BJ:限电/计划停机)",
+  "制造商(HFYG_CS:合肥阳光电源有限公司;AMS_CS:艾默生;NRJD_CS:国电南瑞吉电新能源;MGSK_CS:美国赛康;LHDL_CS:联合动力;SYHC_CS:沈阳华创)",
+  "名称",
+  "上一级节点",
+  "是否有子节点",
+  "序列号",
+  "类别 :正常停机,正常启动,快速停机,紧急停机",
+  "风机型号",
+  "全部默认为1",
+  "统一编码",
+  "是否展示(0:是;1:否)",
+  "报警分类(bj:变桨;bpq:变频器;clx:齿轮箱;fdj:发电机;hh:滑环;jcjr:机舱加热;lq:冷却;ph:偏航;rh:润滑;yy:液压;zz:主轴;other:其它;kz:控制;yl:叶轮;jc:机舱;xb:箱变;dw:电网;td:塔底;fsy:风速仪)",
+  "消缺规定时间",
+  "是否可以复位(0:是;1:否)",
+  "报警类型编号",
+  "故障编码",
+  "关联部件",
+];
+
+const tableKey = [
+  "id",
+  "levelId",
+  "manufacturerCode",
+  "chineseText",
+  "parentId",
+  "isleaf",
+  "sequenceNumber",
+  "characteristic",
+  "modelId",
+  "codeName",
+  "ednaValue",
+  "display",
+  "warningClassIfyId",
+  "standardTime",
+  "isreset",
+  "warningTypeId",
+  "faultCode",
+  "relatedParts",
+];
+// 批量导出
+const export2Excel = async () => {
+  let { name, stationId, modelId } = query;
+  const res = await windturbinebj_fetchTableData({
+    pageNum: 1,
+    pageSize: 999999,
+    name,
+    stationId,
+    modelId,
+  });
+
+  ElMessage.success(`导出成功!`);
+  outExportExcel(tableHeader, tableKey, res.records, "风机报警配置导出excel");
+};
+// 模板下载
+const outExe = () => {
+  const data = [];
+  ElMessage.success(`导出成功!`);
+  outExportExcel(tableHeader, tableKey, data, "风机报警模板");
+};
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  ElMessage.success("导入成功!");
+  getData();
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+// 报警级别
+const levelIdConvert = (val) => {
+  switch (val) {
+    case 1:
+      return "低级";
+    case 2:
+      return "低中级";
+    case 3:
+      return "中级";
+    case 4:
+      return "中高级";
+    case 5:
+      return "限电/高级";
+    default:
+      return "";
+  }
+};
+// 报警分类
+const warningClassIfyIdConvert = (val) => {
+  switch (val) {
+    case "station":
+      return "场站";
+    case "windturbine":
+      return "风机";
+    case "booststation":
+      return "升压站";
+    default:
+      return "";
+  }
+};
+
+// 统一编码
+const ednaValueConvert = (val) => {
+  if (val === 0) {
+    return "";
+  } else if (val < 100 && val > 0) {
+    return "DI0" + val;
+  } else if (val >= 100) {
+    return "DI" + val;
+  }
+};
+</script>
+<style scoped lang="less">
+.wind-table {
+  height: calc(100% - 40px);
+}
+.buttons {
+  background-color: rgba(5, 187, 76, 0.2);
+  border: 1px solid #3b6c53;
+  color: #b3b3b3;
+  font-size: 14px;
+  &:hover {
+    background-color: rgba(5, 187, 76, 0.5);
+    color: #ffffff;
+  }
+}
+.el-select ::v-deep {
+  margin-right: 10px;
+}
+
+.el-button + .el-button {
+  margin-left: 10px;
+}
+.pagination {
+  padding-top: 10px;
+}
+</style>

+ 456 - 0
src/views/IntegratedAlarm/deviceConfig/components/windturbine_components.vue

@@ -0,0 +1,456 @@
+<template>
+  <el-dialog
+    v-model="isShow"
+    width="800px"
+    :before-close="dialogClose"
+    @closed="resetOptions"
+  >
+    <el-form
+      :model="dialogOptions"
+      :rules="rules"
+      label-width="120px"
+      ref="formRef"
+      inline
+    >
+      <el-form-item label="报警类别" prop="deviceType">
+        <el-select
+          v-model="dialogOptions.deviceType"
+          filterable
+          placeholder="请选择"
+          @change="
+            (res) => {
+              dialogOptions.stationId = '';
+              checkRules();
+              getWpList();
+            }
+          "
+        >
+          <el-option
+            v-for="item in categoryArray"
+            :key="item.id"
+            :label="item.label"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="序列号">
+        <el-input
+          v-model="dialogOptions.id"
+          placeholder="自动生成"
+          clearable
+          readonly
+        />
+      </el-form-item>
+      <el-form-item label="场站" prop="stationId">
+        <el-select
+          v-model="dialogOptions.stationId"
+          filterable
+          placeholder="请选择"
+          :disabled="!wpArray?.length"
+          @change="
+            (res) => {
+              dialogOptions.modelId = '';
+              getWtModel();
+            }
+          "
+        >
+          <el-option
+            v-for="item in wpArray"
+            :key="item.id"
+            :label="item.aname"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="设备型号"
+        prop="modelId"
+        v-if="dialogOptions.deviceType !== 'booststation'"
+      >
+        <el-select
+          v-model="dialogOptions.modelId"
+          filterable
+          placeholder="请选择"
+          :disabled="!modelArray?.length"
+        >
+          <el-option
+            v-for="item in modelArray"
+            :key="item"
+            :label="item"
+            :value="item"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="统一编码" prop="uniformCode">
+        <el-input v-model="dialogOptions.uniformCode" clearable />
+      </el-form-item>
+      <el-form-item label="特性" prop="characteristic">
+        <el-select
+          v-model="dialogOptions.characteristic"
+          filterable
+          placeholder="请选择"
+        >
+          <el-option
+            v-for="item in characteristicArray"
+            :key="item"
+            :label="item"
+            :value="item"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="故障编码">
+        <el-input v-model="dialogOptions.nemCode" clearable />
+      </el-form-item>
+      <el-form-item label="描述" prop="description">
+        <el-input
+          v-model="dialogOptions.description"
+          placeholder="请输入"
+          clearable
+        />
+      </el-form-item>
+      <el-form-item label="报警级别">
+        <el-select v-model="dialogOptions.rank" filterable placeholder="请选择">
+          <el-option
+            v-for="item in levelArray"
+            :key="item.id"
+            :label="item.label"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="测点"
+        prop="tagId"
+        v-if="dialogOptions.deviceType === 'booststation'"
+      >
+        <el-select
+          v-model="dialogOptions.tagId"
+          filterable
+          placeholder="请选择"
+        >
+          <el-option
+            v-for="item in pointArray"
+            :key="item.nemCode"
+            :label="item.name"
+            :value="item.nemCode"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="关键部件"
+        prop="components"
+        v-if="dialogOptions.deviceType !== 'booststation'"
+      >
+        <el-select v-model="dialogOptions.components" filterable>
+          <el-option-group
+            v-for="group in associatedComponentsArray"
+            :key="group.label"
+            :label="group.label"
+          >
+            <el-option
+              v-for="item in group.options"
+              :key="item.nemCode"
+              :label="item.name"
+              :value="item.nemCode"
+            />
+          </el-option-group>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否启用">
+        <el-radio-group size="mini" v-model="dialogOptions.enable">
+          <el-radio-button :label="true">是</el-radio-button>
+          <el-radio-button :label="false">否</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="是否可复位">
+        <el-radio-group size="mini" v-model="dialogOptions.resetTable">
+          <el-radio-button :label="true">是</el-radio-button>
+          <el-radio-button :label="false">否</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="footerButton">
+        <el-button size="mini" round @click="cancle">取 消</el-button>
+        <el-button size="mini" round @click="checkData">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script>
+import {
+  getWpList,
+  getBpList,
+  getWtModel,
+  getPointList,
+  fetchRelatePartAndAlarmType,
+  saveAlarmconfiguration,
+} from "@/api/zhbj/index.js";
+export default {
+  props: {
+    isVisible: {
+      type: Boolean,
+      default: () => false,
+    },
+    form: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+
+  data() {
+    return {
+      isShow: false,
+      dialogOptions: {
+        deviceType: "",
+        id: "",
+        stationId: "",
+        modelId: "",
+        uniformCode: "",
+        nemCode: "",
+        characteristic: "正常停机",
+        description: "",
+        rank: 1,
+        tagId: "",
+        components: "",
+        enable: false,
+        resetTable: false,
+      },
+      rules: {
+        deviceType: [
+          {
+            required: true,
+            message: "报警类型不可为空",
+            trigger: "change",
+          },
+        ],
+        stationId: [
+          {
+            required: true,
+            message: "场站不可为空",
+            trigger: "change",
+          },
+        ],
+        modelId: [
+          {
+            required: true,
+            message: "设备型号不可为空",
+            trigger: "change",
+          },
+        ],
+        uniformCode: [
+          {
+            required: true,
+            message: "统一编码不可为空",
+            trigger: "change",
+          },
+        ],
+        characteristic: [
+          {
+            required: true,
+            message: "统一编码不可为空",
+            trigger: "change",
+          },
+        ],
+        tagId: [
+          {
+            required: true,
+            message: "测点不可为空",
+            trigger: "change",
+          },
+        ],
+        description: [
+          {
+            required: true,
+            message: "描述不可为空",
+            trigger: "change",
+          },
+        ],
+        components: [
+          {
+            required: true,
+            message: "部件不可为空",
+            trigger: "change",
+          },
+        ],
+      },
+      categoryArray: [
+        { id: "windturbine", label: "风机报警" },
+        { id: "booststation", label: "升压站报警" },
+        { id: "inverter", label: "光伏报警" },
+      ],
+      wpArray: [],
+      modelArray: [],
+      characteristicArray: ["正常停机", "正常启动", "快速停机", "紧急停机"],
+      levelArray: [
+        { id: 1, label: "低级" },
+        { id: 2, label: "低中级" },
+        { id: 3, label: "中级" },
+        { id: 4, label: "中高级" },
+        { id: 5, label: "高级" },
+      ],
+      pointArray: [],
+      associatedComponentsArray: [],
+    };
+  },
+
+  created() {
+    this.isShow = this.isVisible;
+    this.dialogOptions = Object.assign(this.dialogOptions, this.form);
+    this.checkRules();
+    this.getWpList();
+    this.getfetchRelatePart();
+  },
+
+  methods: {
+    dialogClose(done) {
+      this.$confirm("确认关闭?")
+        .then(() => {
+          done();
+        })
+        .catch(() => {});
+    },
+
+    cancle() {
+      this.$confirm("确认关闭?")
+        .then(() => {
+          this.isShow = false;
+        })
+        .catch(() => {});
+    },
+
+    checkRules() {
+      const isBp = this.dialogOptions.deviceType === "booststation";
+      const isWt = this.dialogOptions.deviceType === "windturbine";
+      const isInv = this.dialogOptions.deviceType === "inverter";
+      this.rules.tagId.forEach((ele) => {
+        ele.required = isBp;
+      });
+
+      this.rules.modelId.forEach((ele) => {
+        ele.required = !isBp;
+      });
+
+      this.rules.components.forEach((ele) => {
+        ele.required = isWt || isInv;
+      });
+    },
+
+    getWpList() {
+      if (
+        this.dialogOptions.deviceType === "windturbine" ||
+        this.dialogOptions.deviceType === "inverter"
+      ) {
+        getWpList(this.dialogOptions.deviceType).then((res) => {
+          this.dialogOptions.stationId = res?.data?.[0]?.id || "";
+          this.wpArray = res.data;
+          this.getWtModel();
+        });
+      } else {
+        getBpList().then((res) => {
+          this.dialogOptions.stationId = res?.data?.[0]?.id || "";
+          this.wpArray = res.data;
+          this.getWtModel();
+        });
+      }
+    },
+
+    getWtModel() {
+      getWtModel(this.dialogOptions.stationId).then((res) => {
+        this.dialogOptions.modelId = res?.data?.[0] || "";
+        this.modelArray = res.data;
+        if (this.dialogOptions.deviceType === "booststation") {
+          this.getPointList();
+        }
+      });
+    },
+
+    getPointList() {
+      getPointList({
+        subId: this.dialogOptions.stationId,
+      }).then((res) => {
+        this.pointArray = res.data.total;
+      });
+    },
+
+    getfetchRelatePart() {
+      fetchRelatePartAndAlarmType().then((res) => {
+        const keyMap = {
+          fjbj: "风机部件",
+          gfbj: "光伏部件",
+        };
+
+        let associatedComponentsArray = [];
+
+        for (let key in keyMap) {
+          associatedComponentsArray.push({
+            id: key,
+            label: keyMap[key],
+            options: res.data[key] || [],
+          });
+        }
+        this.dialogOptions.components =
+          associatedComponentsArray?.[0]?.options?.[0]?.nemCode || "";
+        this.associatedComponentsArray = associatedComponentsArray;
+      });
+    },
+
+    checkData() {
+      this.$refs.formRef.validate((valid, fields) => {
+        if (valid) {
+          saveAlarmconfiguration(
+            Object.assign(this.dialogOptions, {
+              alarmType:
+                this.dialogOptions.alarmType || this.dialogOptions.deviceType,
+            })
+          ).then((res) => {
+            if (res.code === 200) {
+              this.BASE.showMsg({
+                type: "success",
+                msg: "提交成功",
+              });
+              this.isShow = false;
+            }
+          });
+        }
+      });
+    },
+
+    resetOptions() {
+      this.dialogOptions = {
+        deviceType: "",
+        id: "",
+        stationId: "",
+        modelId: "",
+        uniformCode: "",
+        characteristic: "正常停机",
+        nemCode: "",
+        description: "",
+        rank: 1,
+        tagId: "",
+        components: "",
+        enable: false,
+        resetTable: false,
+      };
+      this.resetForm();
+    },
+
+    resetForm() {
+      this.$refs.formRef.resetFields();
+    },
+  },
+
+  watch: {
+    isVisible(value) {
+      this.isShow = value;
+    },
+    form(value) {
+      this.dialogOptions = value;
+      this.checkRules();
+      this.getWpList();
+    },
+  },
+};
+</script>

+ 529 - 0
src/views/IntegratedAlarm/deviceConfig/components/ycpoint.vue

@@ -0,0 +1,529 @@
+<template>
+  <div class="devicemenu">
+    <el-space wrap :size="10">
+      <el-input
+        v-model="state.SearchVal"
+        placeholder="筛选"
+        style="width: 180px"
+        size="mini"
+      />
+      <el-select
+        size="mini"
+        v-model="state.selectModel"
+        style="width: 180px"
+        placeholder="全部"
+      >
+        <el-option
+          v-for="item in state.modelList"
+          :key="item"
+          :value="item"
+          :label="item"
+        ></el-option>
+      </el-select>
+      <el-select
+        v-model="state.selectPoint"
+        size="mini"
+        style="width: 100px"
+        placeholder="全部"
+      >
+        <el-option key="1" label="全部" value=""></el-option>
+        <el-option key="2" label="遥测" value="AI"></el-option>
+        <el-option key="3" label="遥调" value="MI"></el-option>
+        <el-option key="4" label="计算" value="CI"></el-option>
+      </el-select>
+      <el-button class="buttons" size="mini" round @click="search"
+        >查询</el-button
+      >
+      <el-button
+        class="buttons"
+        size="mini"
+        round
+        @click="handleEdit(state.addFormData)"
+        :disabled="desc.code == ''"
+        >新增</el-button
+      >
+      <el-upload
+        class="upload-demo"
+        :disabled="desc.code == ''"
+        action="/sharding/device/input"
+        :show-file-list="false"
+        :on-success="handleSuccess"
+        :on-progress="handleProgress"
+        :on-error="handleError"
+      >
+        <el-button :disabled="desc.code == ''" class="buttons" size="mini" round
+          >导入</el-button
+        >
+      </el-upload>
+      <el-button
+        class="buttons"
+        size="mini"
+        round
+        @click="export2Excel"
+        :disabled="desc.code == ''"
+        >导出</el-button
+      >
+    </el-space>
+  </div>
+  <div class="ycpoint-table">
+    <el-table
+      :data="state.pointTableData"
+      stripe
+      style="width: 100%"
+      height="calc(100% - 45px)"
+    >
+      <el-table-column type="index" width="50" />
+      <el-table-column prop="metricCode" label="测点编码"></el-table-column>
+      <el-table-column label="名称">
+        <template #default="scope">
+          <el-popover
+            placement="right"
+            popper-class="point-popover"
+            :width="260"
+            trigger="click"
+          >
+            <template #reference>
+              <el-button type="text" style="color: #05bb4c" size="small">{{
+                scope.row.name
+              }}</el-button>
+            </template>
+            <el-table
+              size="mini"
+              :data="scope.row.deviceModelMetrics"
+              max-height="400px"
+            >
+              <el-table-column
+                property="devicemodel"
+                label="机型"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                property="uniformcode"
+                label="统一编码"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                property="multiplier"
+                label="倍率"
+                align="center"
+              ></el-table-column>
+            </el-table>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column prop="unitName" label="单位"></el-table-column>
+      <el-table-column prop="categoryData" label="测点类型"></el-table-column>
+      <el-table-column prop="categorysci" label="物理类型"></el-table-column>
+      <el-table-column prop="categorysci" label="数据类型"></el-table-column>
+      <el-table-column prop="description" label="描述"></el-table-column>
+      <el-table-column label="操作" width="180" align="center">
+        <template #default="scope">
+          <el-button
+            type="text"
+            style="color: #05bb4c"
+            @click="handleEdit(scope.row)"
+            >编辑</el-button
+          >
+          <el-button
+            type="text"
+            style="color: red"
+            @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination">
+      <el-pagination
+        layout="total, sizes, prev, pager, next"
+        :page-sizes="[19, 50, 100, 200, 500]"
+        @size-change="
+          (value) => {
+            query.limit = value;
+            query.page = 1;
+            getPoint(desc);
+          }
+        "
+        :current-page="query.page"
+        :page-size="query.limit"
+        :total="pageTotal"
+        @current-change="handlePageChange"
+      ></el-pagination>
+    </div>
+  </div>
+  <!-- 传感点编辑弹出框 -->
+  <el-dialog v-model="editVisible" width="40%">
+    <el-form :model="editFormData" label-width="80px">
+      <el-form-item label="编码">
+        <el-input v-model="editFormData.metriccode"></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="名称">
+            <el-input v-model="editFormData.name"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="英文名称">
+            <el-input v-model="editFormData.enname"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="标准单位">
+            <el-input v-model="editFormData.unitname"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="单位名称">
+            <el-input v-model="editFormData.unitnamecn"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="描述">
+        <el-input
+          v-model="editFormData.description"
+          :rows="3"
+          type="textarea"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="数据类型">
+            <el-select v-model="editFormData.categorydata" placeholder="Select">
+              <el-option
+                v-for="item in state.categorydataoptions"
+                :key="item"
+                :label="item"
+                :value="item"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="结构">
+            <el-cascader
+              v-model="editFormData.structurecode"
+              :options="cascaderdata"
+              :props="{ checkStrictly: true, emitPath: false }"
+              clearable
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="物理类型">
+            <el-input v-model="editFormData.categorysci"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="系统分类">
+            <el-input v-model="editFormData.categorysys"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-form-item label="适配机型" class="deviceModelClass">
+        <el-select
+          v-model="state.deviceModelSel"
+          style="margin-right: 20px"
+          placeholder="新增机型"
+          size="mini"
+        >
+          <el-option
+            v-for="item in state.deviceModel"
+            :key="item.code"
+            :label="item.code"
+            :value="item.code"
+          >
+          </el-option>
+        </el-select>
+        <el-button
+          v-show="state.deviceModelSel != ''"
+          size="mini"
+          class="buttons"
+          round
+          @click="deviceModelAdd()"
+          >新增机型
+        </el-button>
+        <el-table
+          :data="editFormData.deviceModelMetrics"
+          style="width: 100%; margin-top: 10px"
+          max-height="200px"
+        >
+          <el-table-column prop="devicemodel" label="机型" />
+          <el-table-column label="倍率">
+            <template #default="scope">
+              <el-input v-model="scope.row.multiplier" size="mini" />
+            </template>
+          </el-table-column>
+          <el-table-column label="统一编码">
+            <template #default="scope">
+              <el-input v-model="scope.row.uniformcode" size="mini" />
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="footerButton">
+        <el-button
+          size="mini"
+          class="buttons"
+          round
+          @click="editVisible = false"
+          >取 消</el-button
+        >
+        <el-button size="mini" class="buttons" round @click="saveEdit"
+          >确 定</el-button
+        >
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import { ref, onMounted, inject, reactive, watch } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import {
+  point,
+  metrics,
+  delmetrics,
+  device_list,
+  getWtModel,
+} from "@/api/zhbj/index.js";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+onMounted(() => {
+  getPoint(desc.value);
+  getDeviceModel();
+  getequipmentmodel_list();
+});
+let editFormData = ref({});
+let editVisible = ref(false); //传感点
+let desc = inject("desc");
+let treeId = inject("treeId");
+let cascaderdata = inject("cascaderdata");
+watch(
+  () => treeId,
+  (newV, old) => {
+    state.addFormData.structurecode = desc.value.code;
+    getPoint(desc.value);
+  },
+  {
+    deep: true,
+  }
+);
+let state = reactive({
+  pointTableData: "",
+  SearchVal: "",
+  selectPoint: "",
+  selectModel: "",
+  modelList: [],
+  categorydataoptions: ["AI", "DI", "CI"],
+  addFormData: {
+    categorydata: "AI",
+    categoryres1: null,
+    categoryres2: null,
+    categoryres3: null,
+    categoryres4: null,
+    categoryres5: null,
+    categorysci: null,
+    categorysys: null,
+    description: null,
+    deviceid: "windturbine",
+    enname: null,
+    id: null,
+    metriccode: "",
+    name: "",
+    structurecode: "",
+    unitname: null,
+    unitnamecn: null,
+    deviceModelMetrics: [],
+  },
+});
+const query = reactive({
+  page: 1,
+  limit: 19,
+});
+let pageTotal = ref(0);
+const search = async () => {
+  getPoint(desc.value);
+};
+// getPoint
+const getPoint = async (node, value) => {
+  const res = await point(
+    node.code,
+    query.page,
+    query.limit,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  pageTotal.value = res.total;
+  state.pointTableData = res.records?.sort((a, b) => {
+    return a.id - b.id;
+  });
+};
+// 机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getWtModel("");
+  state.modelList = data || [];
+};
+// 测点 编辑
+const handleEdit = (row) => {
+  if (!row.deviceModelMetrics) {
+    row.deviceModelMetrics = [];
+  }
+  editFormData.value = row;
+  editVisible.value = true;
+};
+//测点 add
+const postmetrics = async () => {
+  const res = await metrics(editFormData.value);
+  if (res.code == 200) {
+    ElMessage.success(`操作成功!`);
+    editVisible.value = false;
+  } else {
+    ElMessage.success(res.msg);
+  }
+  getPoint(desc.value);
+};
+// 保存编辑
+const saveEdit = async () => {
+  postmetrics();
+};
+// 测点 删除
+const handleDelete = (row) => {
+  // 二次确认删除
+  ElMessageBox.confirm("确定要删除吗?", "提示", {
+    type: "warning",
+  })
+    .then(async () => {
+      const res = await delmetrics(row.id);
+      if (res == 1) {
+        ElMessage.success(`删除成功!`);
+      } else {
+        ElMessage.success("删除失败");
+      }
+      getPoint(desc.value);
+    })
+    .catch(() => {});
+};
+
+//deviceModelAdd 新增机型
+const deviceModelAdd = async () => {
+  if (state.deviceModelSel == "") return;
+  let obj = {
+    deviceid: editFormData.value.deviceid,
+    devicemodel: state.deviceModelSel,
+    id: null,
+    metriccode: editFormData.value.metriccode,
+    multiplier: 0,
+    uniformcode: "",
+  };
+  editFormData.value.deviceModelMetrics.push(obj);
+};
+//getDeviceModel
+const getDeviceModel = async () => {
+  const res = await device_list();
+  state.deviceModel = res;
+};
+
+// 分页导航
+const handlePageChange = (val) => {
+  query.page = val;
+  getPoint(desc.value);
+};
+
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  ElMessage.success("导入成功!");
+  getPoint(desc.value);
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+
+// 批量导出
+const export2Excel = async () => {
+  const tableData = await point(
+    desc.value.code,
+    1,
+    99999999,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  ElMessage.success(`导出成功!`);
+  const tableHeader = [
+    "上级结构编码",
+    "测点编码",
+    "名称",
+    "英文名称",
+    "单位",
+    "测点类型",
+    "物理类型",
+    "描述",
+  ];
+  const tableKey = [
+    "structurecode",
+    "metriccode",
+    "name",
+    "enname",
+    "unitname",
+    "categorydata",
+    "categorysci",
+    "description",
+  ];
+  outExportExcel(tableHeader, tableKey, tableData.records, "测点导出excel");
+};
+</script>
+<style lang="less" scoped>
+.buttons {
+  background-color: rgba(5, 187, 76, 0.2);
+  border: 1px solid #3b6c53;
+  color: #b3b3b3;
+  font-size: 14px;
+  &:hover {
+    background-color: rgba(5, 187, 76, 0.5);
+    color: #ffffff;
+  }
+}
+.devicemenu {
+  margin-bottom: 10px;
+}
+.ycpoint-table {
+  height: calc(100% - 39px);
+}
+</style>
+<style lang="less">
+.point-popover {
+  &.is-light {
+    background: #081410;
+  }
+  .el-table {
+    background: transparent;
+    & th.el-table__cell {
+      background: transparent;
+    }
+    & tr {
+      background-color: transparent;
+    }
+    &::before {
+      background-color: transparent;
+    }
+  }
+  .el-popper__arrow::before {
+    background: #081410 !important;
+    border: 1px solid #081410 !important;
+  }
+}
+</style>

+ 513 - 0
src/views/IntegratedAlarm/deviceConfig/components/yxpoint.vue

@@ -0,0 +1,513 @@
+<template>
+  <div class="devicemenu">
+    <el-space wrap :size="10">
+      <el-input
+        v-model="state.SearchVal"
+        placeholder="筛选"
+        style="width: 180px"
+        size="mini"
+      />
+      <el-button class="buttons" size="mini" round @click="search"
+        >查询</el-button
+      >
+      <el-button
+        class="buttons"
+        size="mini"
+        round
+        @click="handleEdit(state.addFormData)"
+        :disabled="desc.code == ''"
+        >新增</el-button
+      >
+      <el-upload
+        class="upload-demo"
+        :disabled="desc.code == ''"
+        action="/sharding/device/input"
+        :show-file-list="false"
+        :on-success="handleSuccess"
+        :on-progress="handleProgress"
+        :on-error="handleError"
+      >
+        <el-button :disabled="desc.code == ''" class="buttons" size="mini" round
+          >导入</el-button
+        >
+      </el-upload>
+      <el-button
+        class="buttons"
+        size="mini"
+        round
+        @click="export2Excel"
+        :disabled="desc.code == ''"
+        >导出</el-button
+      >
+    </el-space>
+  </div>
+  <div class="yxpoint-table">
+    <el-table
+      :data="state.pointTableData"
+      stripe
+      style="width: 100%"
+      height="calc(100% - 45px)"
+    >
+      <el-table-column type="index" width="50" />
+      <el-table-column prop="metricCode" label="测点编码"></el-table-column>
+      <el-table-column label="名称">
+        <template #default="scope">
+          <el-popover
+            placement="right"
+            popper-class="point-popover"
+            :width="260"
+            trigger="click"
+          >
+            <template #reference>
+              <el-button
+                type="text"
+                style="color: #05bb4c"
+                size="small"
+                @click="handleClick(scope)"
+                >{{ scope.row.name }}</el-button
+              >
+            </template>
+            <el-table
+              size="mini"
+              :data="scope.row.deviceModelMetrics"
+              max-height="400px"
+            >
+              <el-table-column
+                property="devicemodel"
+                label="机型"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                property="uniformcode"
+                label="统一编码"
+                align="center"
+              ></el-table-column>
+              <el-table-column
+                property="multiplier"
+                label="倍率"
+                align="center"
+              ></el-table-column>
+            </el-table>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column prop="unitName" label="单位"></el-table-column>
+      <el-table-column prop="categoryData" label="测点类型"></el-table-column>
+      <el-table-column prop="categorysci" label="物理类型"></el-table-column>
+      <el-table-column prop="categorysci" label="数据类型"></el-table-column>
+      <el-table-column prop="description" label="描述"></el-table-column>
+      <el-table-column label="操作" width="180" align="center">
+        <template #default="scope">
+          <el-button
+            type="text"
+            style="color: #05bb4c"
+            @click="handleEdit(scope.row)"
+            >编辑</el-button
+          >
+          <el-button
+            type="text"
+            style="color: red"
+            @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination">
+      <el-pagination
+        layout="total, sizes, prev, pager, next"
+        :page-sizes="[19, 50, 100, 200, 500]"
+        @size-change="
+          (value) => {
+            query.limit = value;
+            query.page = 1;
+            getPoint(desc);
+          }
+        "
+        :current-page="query.page"
+        :page-size="query.limit"
+        :total="pageTotal"
+        @current-change="handlePageChange"
+      ></el-pagination>
+    </div>
+  </div>
+  <!-- 传感点编辑弹出框 -->
+  <el-dialog v-model="editVisible" width="40%">
+    <el-form :model="editFormData" label-width="80px">
+      <el-form-item label="编码">
+        <el-input v-model="editFormData.metriccode"></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="名称">
+            <el-input v-model="editFormData.name"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="英文名称">
+            <el-input v-model="editFormData.enname"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="标准单位">
+            <el-input v-model="editFormData.unitname"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="单位名称">
+            <el-input v-model="editFormData.unitnamecn"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="描述">
+        <el-input
+          v-model="editFormData.description"
+          :rows="3"
+          type="textarea"
+          clearable
+        ></el-input>
+      </el-form-item>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="数据类型">
+            <el-select v-model="editFormData.categorydata" placeholder="Select">
+              <el-option
+                v-for="item in state.categorydataoptions"
+                :key="item"
+                :label="item"
+                :value="item"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="结构">
+            <el-cascader
+              v-model="editFormData.structurecode"
+              :options="cascaderdata"
+              :props="{ checkStrictly: true, emitPath: false }"
+              clearable
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="物理类型">
+            <el-input v-model="editFormData.categorysci"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="系统分类">
+            <el-input v-model="editFormData.categorysys"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="适配机型" class="deviceModelClass">
+        <el-select
+          v-model="state.deviceModelSel"
+          style="margin-right: 20px"
+          placeholder="新增机型"
+          size="mini"
+        >
+          <el-option
+            v-for="item in state.deviceModel"
+            :key="item.code"
+            :label="item.code"
+            :value="item.code"
+          >
+          </el-option>
+        </el-select>
+        <el-button
+          v-show="state.deviceModelSel != ''"
+          size="mini"
+          class="buttons"
+          round
+          @click="deviceModelAdd()"
+          >新增机型
+        </el-button>
+        <el-table
+          :data="editFormData.deviceModelMetrics"
+          style="width: 100%; margin-top: 10px"
+          max-height="200px"
+        >
+          <el-table-column prop="devicemodel" label="机型" />
+          <el-table-column label="倍率">
+            <template #default="scope">
+              <el-input v-model="scope.row.multiplier" size="mini" />
+            </template>
+          </el-table-column>
+          <el-table-column label="统一编码">
+            <template #default="scope">
+              <el-input v-model="scope.row.uniformcode" size="mini" />
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="footerButton">
+        <el-button size="mini" round @click="editVisible = false"
+          >取 消</el-button
+        >
+        <el-button size="mini" round @click="saveEdit">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import { ref, onMounted, inject, reactive, watch } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import {
+  point,
+  metrics,
+  delmetrics,
+  device_list,
+  getWtModel,
+} from "@/api/zhbj/index.js";
+import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
+onMounted(() => {
+  getPoint(desc.value);
+  getDeviceModel();
+  getequipmentmodel_list();
+});
+let editFormData = ref({});
+let editVisible = ref(false); //传感点
+let desc = inject("desc");
+let treeId = inject("treeId");
+let cascaderdata = inject("cascaderdata");
+watch(
+  () => treeId,
+  (newV, old) => {
+    state.addFormData.structurecode = desc.value.code;
+    getPoint(desc.value);
+  },
+  {
+    deep: true,
+  }
+);
+let state = reactive({
+  pointTableData: "",
+  SearchVal: "",
+  selectPoint: "",
+  selectModel: "",
+  modelList: [],
+  categorydataoptions: ["AI", "DI", "CI"],
+  addFormData: {
+    categorydata: "AI",
+    categoryres1: null,
+    categoryres2: null,
+    categoryres3: null,
+    categoryres4: null,
+    categoryres5: null,
+    categorysci: null,
+    categorysys: null,
+    description: null,
+    deviceid: "windturbine",
+    enname: null,
+    id: null,
+    metriccode: "",
+    name: "",
+    structurecode: "",
+    unitname: null,
+    unitnamecn: null,
+    deviceModelMetrics: [],
+  },
+});
+const query = reactive({
+  page: 1,
+  limit: 19,
+});
+let pageTotal = ref(0);
+const search = async () => {
+  getPoint(desc.value);
+};
+// getPoint
+const getPoint = async (node) => {
+  const res = await point(
+    node.code,
+    query.page,
+    query.limit,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  pageTotal.value = res.total;
+  state.pointTableData = res.records
+    ?.sort((a, b) => {
+      return a.id - b.id;
+    })
+    .map((item, index) => {
+      return { ...item, index: index + 1 };
+    });
+};
+// 机型
+const getequipmentmodel_list = async () => {
+  const { data } = await getWtModel();
+  state.modelList = data;
+};
+// 测点 编辑
+const handleEdit = (row) => {
+  if (!row.deviceModelMetrics) {
+    row.deviceModelMetrics = [];
+  }
+  editFormData.value = row;
+  editVisible.value = true;
+};
+//测点 add
+const postmetrics = async () => {
+  const res = await metrics(editFormData.value);
+  if (res.code == 200) {
+    ElMessage.success(`操作成功!`);
+    editVisible.value = false;
+  } else {
+    ElMessage.success(res.msg);
+  }
+  getPoint(desc.value);
+};
+// 保存编辑
+const saveEdit = async () => {
+  postmetrics();
+};
+// 测点 删除
+const handleDelete = (row) => {
+  // 二次确认删除
+  ElMessageBox.confirm("确定要删除吗?", "提示", {
+    type: "warning",
+  })
+    .then(async () => {
+      const res = await delmetrics(row.id);
+      if (res == 1) {
+        ElMessage.success(`删除成功!`);
+      } else {
+        ElMessage.success("删除失败");
+      }
+      getPoint(desc.value);
+    })
+    .catch(() => {});
+};
+
+//deviceModelAdd 新增机型
+const deviceModelAdd = async () => {
+  if (state.deviceModelSel == "") return;
+  let obj = {
+    deviceid: editFormData.value.deviceid,
+    devicemodel: state.deviceModelSel,
+    id: null,
+    metriccode: editFormData.value.metriccode,
+    multiplier: 0,
+    uniformcode: "",
+  };
+  editFormData.value.deviceModelMetrics.push(obj);
+};
+//getDeviceModel
+const getDeviceModel = async () => {
+  const res = await device_list();
+  state.deviceModel = res;
+};
+
+// 分页导航
+const handlePageChange = (val) => {
+  query.page = val;
+  getPoint(desc.value);
+};
+
+// 批量导入
+const handleSuccess = (response, file, fileList) => {
+  ElMessage.success("导入成功!");
+  getPoint(desc.value);
+};
+const handleProgress = (response, file, fileList) => {};
+const handleError = (response, file, fileList) => {
+  ElMessage.success("导入失败!");
+};
+
+// 批量导出
+const export2Excel = async () => {
+  const tableData = await point(
+    desc.value.code,
+    1,
+    99999999,
+    state.selectPoint,
+    state.SearchVal,
+    "windturbine",
+    state.selectModel
+  );
+  ElMessage.success(`导出成功!`);
+  const tableHeader = [
+    "上级结构编码",
+    "测点编码",
+    "名称",
+    "英文名称",
+    "单位",
+    "测点类型",
+    "物理类型",
+    "描述",
+  ];
+  const tableKey = [
+    "structurecode",
+    "metriccode",
+    "name",
+    "enname",
+    "unitname",
+    "categorydata",
+    "categorysci",
+    "description",
+  ];
+  outExportExcel(tableHeader, tableKey, tableData.records, "测点导出excel");
+};
+const handleClick = ({ row }) => {
+  console.log(row.index);
+};
+</script>
+<style lang="less" scoped>
+.buttons {
+  background-color: rgba(5, 187, 76, 0.2);
+  border: 1px solid #3b6c53;
+  color: #b3b3b3;
+  font-size: 14px;
+  &:hover {
+    background-color: rgba(5, 187, 76, 0.5);
+    color: #ffffff;
+  }
+}
+
+.devicemenu {
+  margin-bottom: 10px;
+}
+.yxpoint-table {
+  height: calc(100% - 39px);
+}
+.devicemenu {
+  margin-bottom: 10px;
+}
+</style>
+<style lang="less">
+.point-popover {
+  &.is-light {
+    background: #081410;
+  }
+  .el-table {
+    background: transparent;
+    & th.el-table__cell {
+      background: transparent;
+    }
+    & tr {
+      background-color: transparent;
+    }
+    &::before {
+      background-color: transparent;
+    }
+  }
+  .el-popper__arrow::before {
+    background: #081410 !important;
+    border: 1px solid #081410 !important;
+  }
+}
+</style>

+ 424 - 0
src/views/IntegratedAlarm/deviceConfig/index.vue

@@ -0,0 +1,424 @@
+<template>
+  <div class="device-config">
+    <div class="leftContent">
+      <span>{{ pageTitle }}</span>
+    </div>
+    <div class="device-content">
+      <div class="box-card-tree">
+        <div class="btns">
+          <el-button size="mini" class="buttons" round @click="handleTreeAdd()"
+            >新增</el-button
+          >
+          <el-button
+            size="mini"
+            class="buttons"
+            round
+            @click="handleTreeDel()"
+            :disabled="!state.isDel"
+            >删除</el-button
+          >
+        </div>
+        <div class="trees">
+          <el-tree
+            :data="state.treedata"
+            :props="state.defaultProps"
+            :default-expanded-keys="['23']"
+            node-key="id"
+            highlight-current
+            :expand-on-click-node="false"
+            @node-click="handleNodeClick"
+          />
+        </div>
+      </div>
+      <div class="box-card">
+        <el-tabs type="card">
+          <!-- <el-tab-pane label="传感点">
+          <point />
+        </el-tab-pane> -->
+          <el-tab-pane label="遥测点">
+            <ycpoint />
+          </el-tab-pane>
+          <el-tab-pane label="遥信点">
+            <yxpoint />
+          </el-tab-pane>
+          <el-tab-pane label="设备报警">
+            <windturbine />
+          </el-tab-pane>
+          <el-tab-pane label="故障预警">
+            <custom />
+          </el-tab-pane>
+          <el-tab-pane label="故障原因">
+            <faultmode />
+          </el-tab-pane>
+          <el-tab-pane label="基本信息">
+            <message />
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+
+      <!-- tree add 弹出框 -->
+      <el-dialog v-model="treeVisible" width="40%" destroy-on-close>
+        <el-form :model="state.treeAddFormData" label-width="80px">
+          <el-row :gutter="24">
+            <el-col :span="12">
+              <el-form-item label="结构编码">
+                <el-input
+                  v-model="state.treeAddFormData.code"
+                ></el-input> </el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="上级节点" label-width="100px">
+                <el-cascader
+                  v-model="state.treeAddFormData.parentcode"
+                  :options="state.cascaderdata"
+                  :props="{ checkStrictly: true, emitPath: false }"
+                  :show-all-levels="false"
+                  clearable
+                /> </el-form-item
+            ></el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="12">
+              <el-form-item label="结构名称">
+                <el-input
+                  v-model="state.treeAddFormData.name"
+                ></el-input> </el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="结构英文名称" label-width="100px">
+                <el-input
+                  v-model="state.treeAddFormData.enname"
+                ></el-input> </el-form-item
+            ></el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="10"
+              ><el-form-item label="序号">
+                <el-input
+                  v-model="state.treeAddFormData.orderno"
+                ></el-input> </el-form-item
+            ></el-col>
+            <el-col :span="6">
+              <el-form-item label="是否有效">
+                <div style="height: 100%; display: flex; align-items: center">
+                  <el-switch
+                    v-model="state.treeAddFormData.enabled"
+                    active-color="#13ce66"
+                    inactive-color="#ff4949"
+                  />
+                </div> </el-form-item
+            ></el-col>
+            <el-col :span="8">
+              <el-form-item label="设备ID">
+                <el-input
+                  v-model="state.treeAddFormData.deviceid"
+                  disabled
+                ></el-input> </el-form-item
+            ></el-col>
+          </el-row>
+          <el-form-item label="描述">
+            <el-input
+              v-model="state.treeAddFormData.description"
+              :rows="4"
+              clearable
+              type="textarea"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+        <template #footer>
+          <span class="footerButton">
+            <el-button size="mini" round @click="treeVisible = false"
+              >取 消</el-button
+            >
+            <el-button size="mini" round @click="saveTreeAdd">确 定</el-button>
+          </span>
+        </template>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+<script setup>
+import { ref, onMounted, reactive, provide, computed, nextTick } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import faultmode from "@/views/IntegratedAlarm/deviceConfig/components/faultmode.vue";
+import message from "@/views/IntegratedAlarm/deviceConfig/components/message.vue";
+import ycpoint from "@/views/IntegratedAlarm/deviceConfig/components/ycpoint.vue";
+import yxpoint from "@/views/IntegratedAlarm/deviceConfig/components/yxpoint.vue";
+import custom from "@/views/IntegratedAlarm/deviceConfig/components/custom.vue";
+import windturbine from "@/views/IntegratedAlarm/deviceConfig/components/windturbine.vue";
+import { tree, treeDel, treeAdd } from "@/api/zhbj/index.js";
+const pageTitle = "设备模型配置";
+let treeVisible = ref(false);
+let editFormData = ref({});
+onMounted(async () => {
+  await getData();
+});
+let state = reactive({
+  isDel: false, //是否能被删除
+  treedata: [],
+  cascaderdata: [],
+  defaultProps: {
+    children: "children",
+    label: (a) => {
+      return a.node.name;
+    },
+  },
+  textarea: "",
+  addFormData: {
+    categorydata: "AI",
+    categoryres1: null,
+    categoryres2: null,
+    categoryres3: null,
+    categoryres4: null,
+    categoryres5: null,
+    categorysci: null,
+    categorysys: null,
+    description: null,
+    deviceid: "windturbine",
+    enname: null,
+    id: null,
+    metriccode: "",
+    name: "",
+    structurecode: "101010205",
+    unitname: null,
+    unitnamecn: null,
+    deviceModelMetrics: [],
+  },
+  treeAddFormData: {
+    code: "",
+    parentcode: "",
+    deviceid: "windturbine",
+    name: "",
+    enname: "",
+    description: "",
+    orderno: "",
+    enabled: true,
+  },
+  options: [
+    {
+      value: "AI",
+      label: "AI",
+    },
+    {
+      value: "DI",
+      label: "DI",
+    },
+    {
+      value: "CI",
+      label: "CI",
+    },
+  ],
+  desc: {
+    code: "",
+    parentcode: "",
+    deviceid: "",
+    name: "",
+    enname: "",
+    description: "",
+    orderno: "",
+    enabled: true,
+  },
+  treeDelVal: "",
+  deviceModel: [],
+  deviceModelSel: "",
+  treeId: "",
+});
+
+// 父子传参
+provide(
+  "cascaderdata",
+  computed(() => state.cascaderdata)
+);
+provide(
+  "desc",
+  computed(() => state.desc)
+);
+provide(
+  "treeId",
+  computed(() => state.treeId)
+);
+
+// tree click
+const handleNodeClick = (data) => {
+  state.isDel = data.children ? false : true;
+  state.treeId = data.id;
+  state.desc = data.node;
+  state.addFormData.structurecode = data.node.code;
+};
+
+// tree add
+const handleTreeAdd = () => {
+  treeVisible.value = true;
+};
+// tree Del
+const handleTreeDel = () => {
+  if (!state.isDel) {
+    ElMessage.error(`不能删除该节点!!`);
+    return;
+  }
+  ElMessageBox.confirm(`确定要删除 ${state.desc.name} 吗?`, "提示", {
+    type: "warning",
+  })
+    .then(async () => {
+      const res = await treeDel(state.desc.id);
+      if (res == 1) {
+        ElMessage.success(`删除成功!`);
+        getData();
+      } else {
+        ElMessage.warning(`删除失败!`);
+      }
+    })
+    .catch(() => {});
+};
+// delTreeBtn
+const delTreeBtn = async () => {
+  const res = await treeDel(state.treeDelVal);
+  if (res == 1) {
+    ElMessage.success(`删除成功!`);
+    getData();
+  } else {
+    ElMessage.warning(`删除失败!`);
+  }
+  state.treeDelVal = "";
+};
+//保存tree add
+const saveTreeAdd = async () => {
+  const res = await treeAdd(state.treeAddFormData);
+  if (res.status == 20000) {
+    ElMessage.success(`操作成功!`);
+    treeVisible.value = false;
+    getData();
+  } else {
+    ElMessage.warning(res.msg);
+  }
+};
+
+// getData
+const getData = async () => {
+  const res = await tree();
+  state.treedata = res.children.reverse();
+  state.cascaderdata = cascaderforEach(res);
+};
+
+// 递归解析基础数据
+const cascaderforEach = (val) => {
+  if (val.children != null) {
+    val.children.forEach((v) => {
+      v["value"] = v.node.code;
+      v["label"] = v.node.name;
+      v["id"] = v.node.id;
+      cascaderforEach(v);
+    });
+    return val.children;
+  }
+};
+</script>
+
+<style lang="less" scoped>
+.el-switch {
+  display: block;
+}
+.device-config {
+  height: 100%;
+  width: 100%;
+  padding: 10px 20px;
+  .btns {
+    display: flex;
+    justify-content: flex-end;
+    margin-right: 10px;
+    //   position: absolute;
+    //   right: 0;
+    //   top: 53px;
+    .el-button + .el-button {
+      margin-left: 10px;
+    }
+  }
+
+  .buttons {
+    background-color: rgba(5, 187, 76, 0.2);
+    border: 1px solid #3b6c53;
+    color: #b3b3b3;
+    font-size: 14px;
+    &:hover {
+      background-color: rgba(5, 187, 76, 0.5);
+      color: #ffffff;
+    }
+  }
+  .leftContent {
+    width: 242px;
+    height: 41px;
+    display: flex;
+    align-items: center;
+    background: url("~@/assets/imgs/title_left_bg1.png") no-repeat;
+
+    span {
+      font-size: 16px;
+      font-family: Microsoft YaHei;
+      font-weight: 400;
+      color: #05bb4c;
+      margin-left: 25px;
+    }
+  }
+  .device-content {
+    height: calc(100% - 40px);
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    .box-card-tree {
+      width: 20%;
+      margin-right: 20px;
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+      background: #161f1e;
+      padding: 10px;
+      .btns {
+        justify-content: flex-start;
+      }
+      .trees {
+        height: calc(100% - 30px);
+        overflow-y: auto;
+        .el-tree {
+          background: transparent !important;
+        }
+      }
+    }
+    .box-card {
+      width: calc(80% - 20px);
+      background: #161f1e;
+      padding: 10px;
+    }
+  }
+}
+.el-tabs::v-deep {
+  height: 100%;
+  .el-tabs__content {
+    height: calc(100% - 40px - 15px);
+    .el-tab-pane {
+      height: 100%;
+    }
+  }
+  &.el-tabs--card > .el-tabs__header .el-tabs__nav {
+    border: 1px solid #3b6c53;
+  }
+  &.el-tabs--card > .el-tabs__header .el-tabs__item {
+    border-left: 1px solid #3b6c53;
+  }
+  &.el-tabs--card > .el-tabs__header .el-tabs__item:first-child {
+    border-left: 0px;
+  }
+  &.el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
+    border-bottom-color: #05bb4c;
+  }
+  &.el-tabs--card > .el-tabs__header {
+    border-bottom-color: #3b6c53;
+  }
+  .el-tabs__item {
+    color: #3b6c53;
+    &:hover,
+    &.is-active {
+      color: #05bb4c;
+    }
+  }
+}
+</style>

+ 5 - 1
src/views/IntegratedAlarm/safe/components/safecomponent.vue

@@ -196,7 +196,11 @@
           </el-table-column>
           <el-table-column label="操作" width="100" align="center">
             <template #default="scope">
-              <el-button type="text" size="small" @click="confirm(scope.row)"
+              <el-button
+                type="text"
+                style="color: #05bb4c"
+                size="small"
+                @click="confirm(scope.row)"
                 >确认本条</el-button
               >
             </template>