|
@@ -0,0 +1,909 @@
|
|
|
+<template>
|
|
|
+ <div class="body">
|
|
|
+ <div class="bodyDetial">
|
|
|
+ <!-- <div style="width: 50%;height:200px;background-color:red;"></div>
|
|
|
+ <div style="width: 50%;height:200px;background-color:yellow;"></div> -->
|
|
|
+ <div class="left-item">
|
|
|
+ <el-scrollbar>
|
|
|
+ <el-input placeholder="输入关键字进行过滤" v-model="filterText">
|
|
|
+ </el-input>
|
|
|
+ <el-tree
|
|
|
+ class="filter-tree"
|
|
|
+ :data="showData"
|
|
|
+ :props="defaultProps"
|
|
|
+ :filter-node-method="filterNode"
|
|
|
+ node-key="id"
|
|
|
+ :default-expanded-keys="[0]"
|
|
|
+ ref="tree"
|
|
|
+ @node-click="handleChange"
|
|
|
+ >
|
|
|
+ </el-tree>
|
|
|
+ </el-scrollbar>
|
|
|
+ </div>
|
|
|
+ <div class="right-item">
|
|
|
+ <div class="dateBar">
|
|
|
+ <el-date-picker
|
|
|
+ class="pickers"
|
|
|
+ @change="changes"
|
|
|
+ v-model="timeValue"
|
|
|
+ type="datetimerange"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ <div
|
|
|
+ class="buttons"
|
|
|
+ @click="
|
|
|
+ () => {
|
|
|
+ getControlRecord();
|
|
|
+ getControlStatistics();
|
|
|
+ }
|
|
|
+ "
|
|
|
+ >
|
|
|
+ 查询
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-scrollbar style="height: 94%">
|
|
|
+ <div class="tables">
|
|
|
+ <el-table
|
|
|
+ :data="recordData"
|
|
|
+ class="table"
|
|
|
+ style="width: 100%"
|
|
|
+ height="75vh"
|
|
|
+ :header-cell-style="{
|
|
|
+ background: 'rgb(30,30,30)',
|
|
|
+ color: 'rgb(220,220,220)',
|
|
|
+ padding: '4px',
|
|
|
+ fontSize: '14px',
|
|
|
+ 'border-bottom': 'solid 1px rgba(77, 77, 77, 1)',
|
|
|
+ }"
|
|
|
+ :cell-style="{
|
|
|
+ height: '40px',
|
|
|
+ background: 'rgb(30,30,30)',
|
|
|
+ color: 'rgb(220,220,220)',
|
|
|
+ padding: '3px',
|
|
|
+ fontSize: '12px',
|
|
|
+ 'border-bottom': '1px solid #000000',
|
|
|
+ }"
|
|
|
+ @cell-dblclick="cellDbClick"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ prop="time"
|
|
|
+ label="日期"
|
|
|
+ width="120"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="code"
|
|
|
+ label="风机号"
|
|
|
+ width="120"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="controls"
|
|
|
+ label="控制命令"
|
|
|
+ width="100"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="result" label="操作结果" align="center">
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="userName"
|
|
|
+ label="操作人"
|
|
|
+ width="160"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="windSpeed"
|
|
|
+ label="风速(m/s)"
|
|
|
+ width="160"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="statusChanged"
|
|
|
+ label="状态转换"
|
|
|
+ width="160"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="statusChangeInterval"
|
|
|
+ label="状态转换时间(s)"
|
|
|
+ width="160"
|
|
|
+ align="center"
|
|
|
+ >
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <div class="titleinfoall" v-if="showControlStatistics">
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">启动:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.startSuccessCount }}/{{
|
|
|
+ controlStatisticsInfo.startCount
|
|
|
+ }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">次</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">停机:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.stopSuccessCount }}/{{
|
|
|
+ controlStatisticsInfo.stopCount
|
|
|
+ }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">次</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">维护:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.maintenanceSuccessCount }}/{{
|
|
|
+ controlStatisticsInfo.maintenanceCount
|
|
|
+ }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">次</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">解除维护:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.unMaintenanceSuccessCount }}/{{
|
|
|
+ controlStatisticsInfo.unMaintenanceCount
|
|
|
+ }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">次</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">多发电量:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.powerGeneration?.toFixed(2) || 0 }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">kwh</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">节约电量:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.powerSaving?.toFixed(2) || 0 }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">kwh</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">维护时长:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.maintenanceTime?.toFixed(2) || 0 }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">分钟</span>
|
|
|
+ </div>
|
|
|
+ <div class="titleinfo">
|
|
|
+ <span class="showTitle fontSty1">提前时间:</span>
|
|
|
+ <span class="showvalue">
|
|
|
+ {{ controlStatisticsInfo.advanceTime?.toFixed(2) || 0 }}
|
|
|
+ </span>
|
|
|
+ <span class="showTitle fontSty">分钟</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-scrollbar>
|
|
|
+ <div class="paginations">
|
|
|
+ <el-pagination
|
|
|
+ :hide-on-single-page="true"
|
|
|
+ :page-size="currentPage"
|
|
|
+ background
|
|
|
+ layout="prev, pager, next"
|
|
|
+ :total="total"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-dialog
|
|
|
+ class="dialogs"
|
|
|
+ custom-class="currentBorder"
|
|
|
+ width="70%"
|
|
|
+ top="50px"
|
|
|
+ :show-close="true"
|
|
|
+ append-to-body
|
|
|
+ v-model="showStartDialog"
|
|
|
+ >
|
|
|
+ <div id="chart" style="width: 100%; height: 500px" />
|
|
|
+ <el-card class="otherContentBox" v-if="otherContentInfo.success">
|
|
|
+ <el-descriptions title="控制评分">
|
|
|
+ <el-descriptions-item label="控制时间">{{
|
|
|
+ otherContentInfo.operationRecordTs || "---"
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="并网开始时间">{{
|
|
|
+ otherContentInfo.onLineStartTs || "---"
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="并网结束时间">{{
|
|
|
+ otherContentInfo.onLineEndTs || "---"
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="并网时长">
|
|
|
+ {{ otherContentInfo.onLineDuration || "---" }}
|
|
|
+ </el-descriptions-item>
|
|
|
+ <el-descriptions-item label="并网期间发电量">{{
|
|
|
+ otherContentInfo.onLinePowerGeneration
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="单位时间内发电量">{{
|
|
|
+ otherContentInfo.powerGenerationPerHour
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="并网期间耗电量">{{
|
|
|
+ otherContentInfo.powerConsumption
|
|
|
+ }}</el-descriptions-item>
|
|
|
+ <!-- <el-descriptions-item label="风能利用百分比">{{
|
|
|
+ otherContentInfo.windUseRate
|
|
|
+ }}</el-descriptions-item> -->
|
|
|
+ <el-descriptions-item label="评分">
|
|
|
+ <el-rate
|
|
|
+ style="display: inline-block"
|
|
|
+ v-model="otherContentInfo.score"
|
|
|
+ allow-half
|
|
|
+ disabled
|
|
|
+ />
|
|
|
+ <span>{{ otherContentInfo.score * 2 }} / 10 分</span>
|
|
|
+ </el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ </el-card>
|
|
|
+ <el-card class="otherContentBox" v-else>
|
|
|
+ <div
|
|
|
+ style="
|
|
|
+ width: 100%;
|
|
|
+ height: 140px;
|
|
|
+ color: #eee;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ font-size: 18px;
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <el-empty class="empSvg" :image-size="100" description="暂无控制评分" />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import dayjs from "dayjs";
|
|
|
+import api from "api/index";
|
|
|
+import * as echarts from "echarts";
|
|
|
+export default {
|
|
|
+ props: {},
|
|
|
+ updated() {
|
|
|
+ if (this.timeValue.length === 0) {
|
|
|
+ let date = new Date();
|
|
|
+ this.timeValue[0] = date.getTime() - 28800000;
|
|
|
+ this.timeValue[1] = date.getTime() + 3600000;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {},
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ statname: "",
|
|
|
+ currentPage: 20,
|
|
|
+ filterText: "",
|
|
|
+ pageIndex: 1,
|
|
|
+ station: [],
|
|
|
+ datas: {},
|
|
|
+ chooseStation: {},
|
|
|
+ timeValue: [],
|
|
|
+ showData: [
|
|
|
+ {
|
|
|
+ id: 0,
|
|
|
+ code: "全部",
|
|
|
+ stationId: "",
|
|
|
+ children: [],
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ defaultProps: {
|
|
|
+ children: "children",
|
|
|
+ label: "code",
|
|
|
+ },
|
|
|
+ recordData: [
|
|
|
+ {
|
|
|
+ time: "2025-05-28",
|
|
|
+ code: "#001",
|
|
|
+ controls: "指令1",
|
|
|
+ result: "结果1",
|
|
|
+ userName: "张三",
|
|
|
+ windSpeed: 3.5,
|
|
|
+ statusChanged: "状态1",
|
|
|
+ statusChangeInterval: "10:17:37",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ time: "2025-05-28",
|
|
|
+ code: "#001",
|
|
|
+ controls: "指令1",
|
|
|
+ result: "结果1",
|
|
|
+ userName: "张三",
|
|
|
+ windSpeed: 3.5,
|
|
|
+ statusChanged: "状态1",
|
|
|
+ statusChangeInterval: "10:17:37",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ time: "2025-05-28",
|
|
|
+ code: "#001",
|
|
|
+ controls: "指令1",
|
|
|
+ result: "结果1",
|
|
|
+ userName: "张三",
|
|
|
+ windSpeed: 3.5,
|
|
|
+ statusChanged: "状态1",
|
|
|
+ statusChangeInterval: "10:17:37",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ time: "2025-05-28",
|
|
|
+ code: "#001",
|
|
|
+ controls: "指令1",
|
|
|
+ result: "结果1",
|
|
|
+ userName: "张三",
|
|
|
+ windSpeed: 3.5,
|
|
|
+ statusChanged: "状态1",
|
|
|
+ statusChangeInterval: "10:17:37",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ time: "2025-05-28",
|
|
|
+ code: "#001",
|
|
|
+ controls: "指令1",
|
|
|
+ result: "结果1",
|
|
|
+ userName: "张三",
|
|
|
+ windSpeed: 3.5,
|
|
|
+ statusChanged: "状态1",
|
|
|
+ statusChangeInterval: "10:17:37",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ total: "",
|
|
|
+ controlErorCodes: [
|
|
|
+ "控制成功",
|
|
|
+ "控制命令发送失败",
|
|
|
+ "无效的控制地址",
|
|
|
+ "被控设备异常",
|
|
|
+ "无效的控制功能",
|
|
|
+ "网络连接错误,检查场站通信",
|
|
|
+ "控制结果读取超时",
|
|
|
+ "未知错误",
|
|
|
+ "控制命令错误",
|
|
|
+ "收到无法识别数据",
|
|
|
+ "未读取到数据包",
|
|
|
+ "未知错误",
|
|
|
+ "风机操作过频繁",
|
|
|
+ "风机被挂牌",
|
|
|
+ "风机操作与风机状态不符",
|
|
|
+ "需要登录",
|
|
|
+ ],
|
|
|
+ showStartDialog: false,
|
|
|
+ rateValue: 4.5,
|
|
|
+ otherContentInfo: {
|
|
|
+ score: 0,
|
|
|
+ },
|
|
|
+ showControlStatistics: false,
|
|
|
+ controlStatisticsInfo: {},
|
|
|
+ };
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // getWindturbineFdc() {
|
|
|
+ // api.getWindturbineFdc().then((res) => {
|
|
|
+ // this.station = res.data;
|
|
|
+ // this.getControlRecord();
|
|
|
+ // });
|
|
|
+ // },
|
|
|
+ dataDeal() {
|
|
|
+ let stationList = this.$store.state.stationList;
|
|
|
+ this.showData[0].children = [
|
|
|
+ // {
|
|
|
+ // id : 1,
|
|
|
+ // code : "风机全部",
|
|
|
+ // stationId : "WIND_ALL",
|
|
|
+ // children : [],
|
|
|
+ // }
|
|
|
+ ];
|
|
|
+ stationList.forEach((item, index) => {
|
|
|
+ if (item.type === 1) {
|
|
|
+ let obj = {};
|
|
|
+ obj.id = index + 1;
|
|
|
+ obj.code = item.name;
|
|
|
+ obj.stationId = item.id;
|
|
|
+ obj.children = [];
|
|
|
+ this.showData[0].children.push(obj);
|
|
|
+ // console.log(123,obj.stationId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.datas = this.$store.state.windturbinelist
|
|
|
+ ? this.$store.state.windturbinelist
|
|
|
+ : {};
|
|
|
+ let arr = Object.keys(this.datas).sort();
|
|
|
+ for (let id of arr) {
|
|
|
+ let item = this.datas[id];
|
|
|
+ this.showData[0].children
|
|
|
+ .filter((val) => val.stationId === item.stationId)[0]
|
|
|
+ ?.children.push(item);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleChange(value) {
|
|
|
+ // console.log(111,value);
|
|
|
+ this.statname = value.stationId;
|
|
|
+ this.chooseStation = value;
|
|
|
+ this.pageIndex = 1;
|
|
|
+ this.getControlRecord(value);
|
|
|
+ this.getControlStatistics();
|
|
|
+ },
|
|
|
+ closed() {
|
|
|
+ this.pageIndex = 1;
|
|
|
+ this.chooseStation = {};
|
|
|
+ this.showData = [
|
|
|
+ {
|
|
|
+ id: 0,
|
|
|
+ code: "全部",
|
|
|
+ stationId: "",
|
|
|
+ children: [],
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ let stationList = this.$store.state.stationList;
|
|
|
+ stationList.forEach((item, index) => {
|
|
|
+ let obj = {};
|
|
|
+ obj.id = index + 1;
|
|
|
+ obj.code = item.name;
|
|
|
+ obj.stationId = item.id;
|
|
|
+ obj.children = [];
|
|
|
+ this.showData[0].children.push(obj);
|
|
|
+ });
|
|
|
+
|
|
|
+ this.$emit("closed");
|
|
|
+ },
|
|
|
+ filterNode(value, data) {
|
|
|
+ if (!value) return true;
|
|
|
+ return data.code.indexOf(value) !== -1;
|
|
|
+ },
|
|
|
+ handleCurrentChange(val) {
|
|
|
+ this.pageIndex = val;
|
|
|
+ this.getControlRecord();
|
|
|
+ },
|
|
|
+ opened() {
|
|
|
+ let date = new Date();
|
|
|
+ this.timeValue[0] = date.getTime() - 28800000;
|
|
|
+ this.timeValue[1] = date.getTime() + 3600000;
|
|
|
+ this.dataDeal();
|
|
|
+ this.getControlRecord();
|
|
|
+ },
|
|
|
+
|
|
|
+ getControlStatistics() {
|
|
|
+ this.showControlStatistics = false;
|
|
|
+ this.controlStatisticsInfo = {};
|
|
|
+ const stTs = this.timeValue[0];
|
|
|
+ const endTs = this.timeValue[1];
|
|
|
+ const stationId = this.statname;
|
|
|
+ api
|
|
|
+ .getControlStatistics(
|
|
|
+ new Date(stTs).getTime(),
|
|
|
+ new Date(endTs).getTime(),
|
|
|
+ stationId
|
|
|
+ )
|
|
|
+ .then((res) => {
|
|
|
+ this.showControlStatistics = true;
|
|
|
+ // console.log(999,res);
|
|
|
+ this.controlStatisticsInfo = {
|
|
|
+ advanceTime: res.data.advanceTime,
|
|
|
+ maintenanceCount: res.data.maintenanceCount,
|
|
|
+ maintenanceSuccessCount: res.data.maintenanceSuccessCount,
|
|
|
+ powerGeneration: res.data.powerGeneration,
|
|
|
+ powerSaving: res.data.powerSaving,
|
|
|
+ startCount: res.data.startCount,
|
|
|
+ startSuccessCount: res.data.startSuccessCount,
|
|
|
+ stopSuccessCount: res.data.stopSuccessCount,
|
|
|
+ stopCount: res.data.stopCount,
|
|
|
+ unMaintenanceCount: res.data.unMaintenanceCount,
|
|
|
+ unMaintenanceSuccessCount: res.data.unMaintenanceSuccessCount,
|
|
|
+ maintenanceTime: res.data.maintenanceTime,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getControlRecord() {
|
|
|
+ api
|
|
|
+ .controlRecord({
|
|
|
+ stationId: this.chooseStation.stationId
|
|
|
+ ? this.chooseStation.stationId
|
|
|
+ : "",
|
|
|
+ userName: "",
|
|
|
+ windturbineId:
|
|
|
+ String(this.chooseStation?.id)?.length < 2
|
|
|
+ ? ""
|
|
|
+ : this.chooseStation.stationId
|
|
|
+ ? this.chooseStation.windturbineId
|
|
|
+ : "",
|
|
|
+ startTime: dayjs(this.timeValue[0]).format("YYYY/MM/DD HH:mm:ss"),
|
|
|
+ endTime: dayjs(this.timeValue[1]).format("YYYY/MM/DD HH:mm:ss"),
|
|
|
+ pageSize: this.currentPage,
|
|
|
+ pageIndex: this.pageIndex,
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ console.log(123, res);
|
|
|
+ if (res) {
|
|
|
+ let types = {
|
|
|
+ Start: "启动",
|
|
|
+ Stop: "停止",
|
|
|
+ Reset: "复位",
|
|
|
+ Maintain: "维护",
|
|
|
+ UnMaintain: "取消维护",
|
|
|
+ Lock: "挂牌",
|
|
|
+ UnLock: "取消挂牌",
|
|
|
+ };
|
|
|
+ // console.log(666,res);
|
|
|
+ res.data.dataList.forEach((item) => {
|
|
|
+ item.time = dayjs(item.time).format("MM-DD HH:mm:ss");
|
|
|
+ item.result = this.controlErorCodes[item.errorCode];
|
|
|
+ item.controls = types[item.controlType];
|
|
|
+ item.showName = item.windturbineId;
|
|
|
+ item.windSpeed = item.windSpeed.toFixed(2);
|
|
|
+ if (item.statusChanged == false) {
|
|
|
+ item.statusChanged = "";
|
|
|
+ } else {
|
|
|
+ item.statusChanged = "成功";
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.total = res.data.total;
|
|
|
+ this.recordData = res.data.dataList;
|
|
|
+ console.log(666, res.data.dataList);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ cellDbClick(row) {
|
|
|
+ const controlType = row.controlType || "";
|
|
|
+ if (controlType === "Start") {
|
|
|
+ this.initEcharts(row.id);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ initEcharts(id) {
|
|
|
+ api.getEvaluationData(id).then((res) => {
|
|
|
+ var data = res.data.datas;
|
|
|
+ var statistics = res.data.statistics;
|
|
|
+ var marks = new Array();
|
|
|
+ if (Array.isArray(statistics.mark)) {
|
|
|
+ for (var j = 0; j < statistics.mark.length; ++j) {
|
|
|
+ marks.push({ xAxis: statistics.mark[j] });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var ser = new Array();
|
|
|
+ var isFirst = true;
|
|
|
+ for (var i = 0; i < data.length; ++i) {
|
|
|
+ var s = {
|
|
|
+ data: data[i].values.map((item) => {
|
|
|
+ return item.value;
|
|
|
+ }),
|
|
|
+ type: "line",
|
|
|
+ name: data[i].name,
|
|
|
+ symbol: "none",
|
|
|
+ yAxisIndex: /功率/g.test(data[i].name) ? 1 : 0,
|
|
|
+ };
|
|
|
+ if (isFirst) {
|
|
|
+ s.markLine = {
|
|
|
+ symbol: ["none", "none"],
|
|
|
+ label: { show: false },
|
|
|
+ data: marks,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ ser.push(s);
|
|
|
+ isFirst = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ var option = {
|
|
|
+ tooltip: {
|
|
|
+ trigger: "axis",
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ show: true,
|
|
|
+ textStyle: {
|
|
|
+ color: "#eee", //字体颜色
|
|
|
+ },
|
|
|
+ data: data.map((item) => {
|
|
|
+ return item.name;
|
|
|
+ }),
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: "category",
|
|
|
+ data: data[0].values.map((item) => {
|
|
|
+ return new Date(item.ts).toLocaleString();
|
|
|
+ }),
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ textStyle: {
|
|
|
+ color: "#eee",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ yAxis: [
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ name: "风速(m/s)",
|
|
|
+ nameTextStyle: {
|
|
|
+ color: "#fff",
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ textStyle: {
|
|
|
+ color: "#eee",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: ["#878787"],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ name: "功率(kw)",
|
|
|
+ nameTextStyle: {
|
|
|
+ color: "#fff",
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ textStyle: {
|
|
|
+ color: "#eee",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ dataZoom: [
|
|
|
+ {
|
|
|
+ type: "inside",
|
|
|
+ start: 0,
|
|
|
+ end: 100,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ series: ser,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (res.data.statistics.success) {
|
|
|
+ this.otherContentInfo = {
|
|
|
+ operationRecordTs: this.formatDate(
|
|
|
+ new Date(res.data.statistics.allTime.operationRecordTs)
|
|
|
+ ),
|
|
|
+ onLineStartTs: this.formatDate(
|
|
|
+ new Date(res.data.statistics.allTime.onlineStartTs)
|
|
|
+ ),
|
|
|
+ onLineEndTs: this.formatDate(
|
|
|
+ new Date(res.data.statistics.allTime.onlineEndTs)
|
|
|
+ ),
|
|
|
+ onLineDuration: `${res.data.statistics.allTime.onLineDuration.toFixed(
|
|
|
+ 2
|
|
|
+ )} h`,
|
|
|
+ onLinePowerGeneration: `${res.data.statistics.onLinePowerGeneration.toFixed(
|
|
|
+ 2
|
|
|
+ )} kwh`,
|
|
|
+ powerGenerationPerHour: `${res.data.statistics.powerGenerationPerHour.toFixed(
|
|
|
+ 2
|
|
|
+ )} kwh`,
|
|
|
+ powerConsumption: `${res.data.statistics.powerConsumption.toFixed(
|
|
|
+ 2
|
|
|
+ )} kwh`,
|
|
|
+ windUseRate: `${res.data.statistics.windUseRate.toFixed(2)} %`,
|
|
|
+ score: res.data.statistics.score / 2,
|
|
|
+ success: res.data.statistics.success,
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ this.otherContentInfo = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ this.showStartDialog = true;
|
|
|
+
|
|
|
+ this.$nextTick(() => {
|
|
|
+ let chartDom = document.getElementById("chart");
|
|
|
+ chartDom.innerHTML = "";
|
|
|
+ chartDom?.removeAttribute("_echarts_instance_");
|
|
|
+ let chart = echarts.init(chartDom, null, { renderer: "svg" });
|
|
|
+ chart.setOption(option);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ formatDate(value) {
|
|
|
+ var date = new Date(value);
|
|
|
+ var y = date.getFullYear(),
|
|
|
+ m = date.getMonth() + 1,
|
|
|
+ d = date.getDate(),
|
|
|
+ h = date.getHours(),
|
|
|
+ i = date.getMinutes(),
|
|
|
+ s = date.getSeconds();
|
|
|
+ if (m < 10) {
|
|
|
+ m = "0" + m;
|
|
|
+ }
|
|
|
+ if (d < 10) {
|
|
|
+ d = "0" + d;
|
|
|
+ }
|
|
|
+ if (h < 10) {
|
|
|
+ h = "0" + h;
|
|
|
+ }
|
|
|
+ if (i < 10) {
|
|
|
+ i = "0" + i;
|
|
|
+ }
|
|
|
+ if (s < 10) {
|
|
|
+ s = "0" + s;
|
|
|
+ }
|
|
|
+ var t = y + "-" + m + "-" + d + " " + h + ":" + i + ":" + s;
|
|
|
+ return t;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ filterText(val) {
|
|
|
+ this.$refs.tree.filter(val);
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style lang="less" scoped>
|
|
|
+.body {
|
|
|
+ background-color: #000000;
|
|
|
+ height: 90vh;
|
|
|
+ width: 97%;
|
|
|
+ padding-left: 3%;
|
|
|
+ padding-top: 2%;
|
|
|
+}
|
|
|
+.searchTitle {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+.bodyDetial {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ margin-left: 3vw;
|
|
|
+ padding-top: 10px;
|
|
|
+ color: #ffffff;
|
|
|
+ height: 98%;
|
|
|
+}
|
|
|
+
|
|
|
+.left-item {
|
|
|
+ width: 20%;
|
|
|
+ height: 100%;
|
|
|
+ background-color: rgba(77, 77, 77, 1);
|
|
|
+ border-right: 2px solid #000000;
|
|
|
+}
|
|
|
+
|
|
|
+.right-item {
|
|
|
+ width: 80%;
|
|
|
+ height: 100%;
|
|
|
+ background-color: rgba(77, 77, 77, 1);
|
|
|
+}
|
|
|
+
|
|
|
+.el-tree {
|
|
|
+ color: #ffffff !important;
|
|
|
+ background-color: rgba(77, 77, 77, 1) !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-tree-node:focus > .el-tree-node__content {
|
|
|
+ background-color: #000000 !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-tree-node__content:hover {
|
|
|
+ background-color: #000000 !important;
|
|
|
+}
|
|
|
+
|
|
|
+.dateBar {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ margin-left: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.pickers {
|
|
|
+ margin-left: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.tables {
|
|
|
+ margin-top: 20px;
|
|
|
+ width: 95%;
|
|
|
+ margin-left: 3%;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.table {
|
|
|
+ background-color: rgba(77, 77, 77, 1) !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-table td,
|
|
|
+.el-table th.is-leaf {
|
|
|
+ border-bottom: 1px solid rgba(77, 77, 77, 1) !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-table__header {
|
|
|
+ width: 100% !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-table__body-wrapper {
|
|
|
+ background-color: rgba(77, 77, 77, 1) !important;
|
|
|
+}
|
|
|
+
|
|
|
+.el-table::before {
|
|
|
+ width: 0;
|
|
|
+}
|
|
|
+
|
|
|
+tr {
|
|
|
+ line-height: 1.5;
|
|
|
+ background: #1e1e1e;
|
|
|
+ margin-bottom: 2px;
|
|
|
+ border-radius: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.table-main {
|
|
|
+ font-size: 14px;
|
|
|
+ width: 600px;
|
|
|
+ text-align: center;
|
|
|
+ background: #000000;
|
|
|
+ margin: 5px;
|
|
|
+ border-collapse: separate;
|
|
|
+ border-spacing: 0px 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.paginations {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row-reverse;
|
|
|
+}
|
|
|
+
|
|
|
+.titleinfoall {
|
|
|
+ display: flex;
|
|
|
+ position: absolute;
|
|
|
+ left: 10px;
|
|
|
+ bottom: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.showTitle {
|
|
|
+ color: #ffffff;
|
|
|
+ margin-right: 10px;
|
|
|
+}
|
|
|
+.fontSty {
|
|
|
+ font-size: 12px;
|
|
|
+}
|
|
|
+.fontSty1 {
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.showvalue {
|
|
|
+ color: #ffffff;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-right: 10px;
|
|
|
+}
|
|
|
+</style>
|
|
|
+
|
|
|
+<style lang="less">
|
|
|
+.el-dialog.currentBorder {
|
|
|
+ border: 1px solid #eee;
|
|
|
+}
|
|
|
+
|
|
|
+.el-card.otherContentBox {
|
|
|
+ background: rgb(36, 36, 36);
|
|
|
+
|
|
|
+ .el-descriptions__header {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-descriptions__cell {
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-descriptions__body {
|
|
|
+ color: #eee;
|
|
|
+ background: rgb(36, 36, 36);
|
|
|
+ }
|
|
|
+
|
|
|
+ .empSvg {
|
|
|
+ .el-empty__image {
|
|
|
+ opacity: 0.9;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-empty__description {
|
|
|
+ p {
|
|
|
+ color: #eee;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|