rui.jiang hai 5 meses
pai
achega
83ee56e5e2

+ 56 - 16
src/components/map/index.vue

@@ -71,10 +71,6 @@
               : "暂无数据"
           }}</span>
         </p>
-
-        <!-- <p>
-          <span>最新分析时间</span><span> {{ $formatDateTWO(hoverInfo.wfbrCreateTime) }}</span>
-        </p> -->
       </div>
     </div>
 
@@ -229,12 +225,11 @@ export default {
       view: new View({
         projection: "EPSG:4326",
         center: fromLonLat([116.389, 39.903]), //地图中心
-        zoom: 5, //默认缩放级别
-        minZoom: 5, //最小缩放级别
+        zoom: 3, //默认缩放级别
+        minZoom: 3, //最小缩放级别
         maxZoom: 15, //最大缩放级别
-        extent: [
-          70.3671875, 18.14576369243164, 134.92927612304688, 55.667146064662596,
-        ],
+        // extent: [ 104.5, 33.5, 121.0, 41.5], //山西
+        extent: [69, 18, 136, 54], //全国
       }),
       layers: [
         new TileLayer({
@@ -253,6 +248,13 @@ export default {
       controls: defaultControls().extend([new ZoomSlider()]),
     });
     // console.log(this.map.getView().calculateExtent());
+    // 不需要定位到某个城市的时候就把这个注释掉
+    if (this.$route.path === "/home/cockpitManage") {
+      const targetExtent = [106.8, 34.3, 118.6, 41.2]; // 乌海、乌兰察布、山海关、西安的范围
+
+      this.map.getView().fit(targetExtent, { duration: 2000 }); // 将地图视图缩放到指定范围,持续时间为 1000ms
+    }
+
     this.initEvent();
   },
   methods: {
@@ -344,6 +346,35 @@ export default {
     initEvent() {
       let lastHoveredFeature = null; // 用来记录上一次悬停的 feature
 
+      // 计算悬浮框位置
+      function calculateHoverTop(mouseY, hoverHeight) {
+        const windowHeight = window.innerHeight; // 获取窗口高度
+        const offset = 10; // 适当的偏移量
+
+        // 如果鼠标接近底部,向上展示
+        if (mouseY + hoverHeight + offset > windowHeight) {
+          return mouseY - hoverHeight - offset; // 向上调整
+        }
+        // 否则,默认居中
+        return mouseY - hoverHeight / 2; // 使其居中于鼠标位置
+      }
+
+      function calculateHoverLeft(mouseX, hoverWidth) {
+        const windowWidth = window.innerWidth; // 获取窗口宽度
+        const offset = 10; // 适当的偏移量
+
+        // 如果鼠标接近右边缘,向左显示
+        if (mouseX + hoverWidth + offset > windowWidth) {
+          return mouseX - hoverWidth - offset; // 向左调整
+        }
+
+        // 如果鼠标接近左边缘,保持适当的右偏移
+        if (mouseX - hoverWidth - offset < 0) {
+          return offset; // 距离左边一定的距离
+        }
+
+        return mouseX + offset; // 否则,鼠标右侧
+      }
       this.map.on("pointermove", (evt) => {
         const features = this.map.getFeaturesAtPixel(evt.pixel, {
           hitTolerance: 1,
@@ -355,20 +386,26 @@ export default {
 
           // 只有当当前悬停的 feature 和上次的不同,才触发操作
           if (lastHoveredFeature !== feature) {
-            if (val == "1" || val == "30" || val == "-1") {
+            // 计算悬浮框的位置
+            const hoverHeight = 250; // 假设悬浮框的高度
+            const hoverWidth = 200; // 假设悬浮框的宽度
+            const topPosition = calculateHoverTop(evt.pixel[1], hoverHeight); // 动态计算top值
+            const leftPosition = calculateHoverLeft(evt.pixel[0], hoverWidth); // 动态计算left值
+
+            if (val == "1" || val == "30" || val == "-1" || val == "10") {
               this.hoverInfo = feature.get("data");
-              this.hoverStyle.left = `${evt.pixel[0] + 10}px`;
-              this.hoverStyle.top = `${evt.pixel[1] - 150}px`;
+              this.hoverStyle.left = `${leftPosition}px`;
+              this.hoverStyle.top = `${topPosition}px`;
               this.getwind();
             } else if (val == "4") {
               this.hoverfengji = feature.get("data");
-              this.hoverfengjiStyle.left = `${evt.pixel[0] + 10}px`;
-              this.hoverfengjiStyle.top = `${evt.pixel[1] - 150}px`;
+              this.hoverfengjiStyle.left = `${leftPosition}px`;
+              this.hoverfengjiStyle.top = `${topPosition}px`;
               this.currentFeatureData = feature.get("data");
             } else if (val == "5") {
               this.hoverta = feature.get("data");
-              this.hovertaStyle.left = `${evt.pixel[0] + 10}px`;
-              this.hovertaStyle.top = `${evt.pixel[1] - 150}px`;
+              this.hovertaStyle.left = `${leftPosition}px`;
+              this.hovertaStyle.top = `${topPosition}px`;
               this.currentFeatureData = feature.get("data");
             } else if (val == "6") {
               this.currentFeatureData = feature.get("data");
@@ -424,6 +461,8 @@ export default {
     },
 
     getwind() {
+      console.log(this.hoverInfo, "hoverInfo");
+
       if (this.hoverInfo && this.hoverInfo.batchCode) {
         const param = {
           batchcode: this.hoverInfo.batchCode,
@@ -462,6 +501,7 @@ export default {
   position: relative;
   width: 100%;
   height: 100%;
+  overflow: hidden; /* 禁止滚动条 */
 }
 
 .map {

+ 2 - 2
src/views/admin/cockpitManage/Index.vue

@@ -220,8 +220,8 @@ export default {
     featureClick(data) {
       console.log(data, "featureClick");
       const val = data.val;
-      if (val === "-1" || val === -1) {
-        this.$message.error("当前风场未进行分析");
+      if (val === "-1" || val === -1||val === 10) {
+        this.$message.error("当前风场未完成分析");
       } else if (val === "0" || val === 0) {
         this.$message({
           message: "当前风场正在分析中",

+ 333 - 82
src/views/admin/cockpitManage/component/leftdata.vue

@@ -1,76 +1,53 @@
 <template>
   <div class="backbone">
     <div class="BOXYI">
-      <h3>待办任务</h3>
+      <h3>任务统计</h3>
       <div class="BOXsan">
         <div class="YC02" @click="getwgl">
           <strong class="texyellow">
-            {{ onrelevance ? onrelevance : 0 }}</strong
-          >
-          <span>未分析任务</span>
+            {{ onrelevance ? onrelevance : 0 }}</strong>
+          <span>待分析任务</span>
         </div>
         <div class="YC02" @click="getwfx">
           <strong class="textred"> {{ abnormal ? abnormal : 0 }}</strong>
-          <span>失败任务</span>
+          <span>异常任务</span>
         </div>
 
         <div class="YC03" @click="getpd">
           <strong class="textred"> {{ queueNumber ? queueNumber : 0 }}</strong>
-          <span>排队任务</span>
+          <span>排队任务</span>
         </div>
       </div>
 
-      <el-dialog title="分析任务统计表" :visible.sync="glShow" width="45%">
+      <el-dialog title="分析任务统计表" :visible.sync="glShow" width="45%">
         <!-- 外部容器设置最大高度和滚动条 -->
         <div style="max-height: 400px; overflow-y: auto">
           <el-table :data="glData" style="width: 100%">
-            <el-table-column
-              prop="fieldName"
-              label="风场名称"
-              width="180"
-            ></el-table-column>
-            <el-table-column
-              prop="analysisName"
-              label="分析名称"
-         
-            ></el-table-column>
-            <el-table-column
-              prop="createTime"
-              label="创建时间"
-                   width="180"
-            ></el-table-column>
+            <el-table-column prop="fieldName" label="风场名称" width="180"></el-table-column>
+            <el-table-column prop="analysisName" label="分析名称"></el-table-column>
+            <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
 
             <el-table-column fixed="right" label="操作" width="100">
               <template slot-scope="scope">
-                <el-button
-                  @click="handleClick(scope.row)"
-                  type="text"
-                  size="small"
-                  >编辑</el-button
-                >
+                <el-button @click="handleClick(scope.row)" type="text" size="small">编辑</el-button>
               </template>
             </el-table-column>
           </el-table>
         </div>
       </el-dialog>
 
-      <el-dialog title="分析失败统计表" :visible.sync="YCShow" width="45%">
+      <el-dialog title="异常任务统计表" :visible.sync="YCShow" width="45%">
         <div style="max-height: 400px; overflow-y: auto">
           <el-table :data="FXData" style="width: 100%">
             <el-table-column prop="fieldName" label="风场名称" width="180">
             </el-table-column>
-            <el-table-column prop="analysisName" label="分析名称" >
+            <el-table-column prop="analysisName" label="分析名称">
             </el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180">
             </el-table-column>
             <el-table-column fixed="right" label="操作" width="100">
               <template slot-scope="scope">
-                <el-button
-                  @click="YChandleClick(scope.row)"
-                  type="text"
-                  size="small"
-                  >编辑</el-button
-                >
+                <el-button @click="YChandleClick(scope.row)" type="text" size="small">编辑</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -82,15 +59,13 @@
           <el-table :data="PdData" style="width: 100%">
             <el-table-column prop="fieldName" label="风场名称" width="180">
             </el-table-column>
-            <el-table-column prop="analysisName" label="分析名称" >
+            <el-table-column prop="analysisName" label="分析名称">
             </el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180">
             </el-table-column>
             <el-table-column fixed="right" label="操作" width="100">
               <template slot-scope="scope">
-                <el-button @click="PDClick(scope.row)" type="text" size="small"
-                  >编辑</el-button
-                >
+                <el-button @click="PDClick(scope.row)" type="text" size="small">编辑</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -106,17 +81,13 @@
         <span>
           <span style="cursor: pointer" @click="importdata">导入数据</span>
           <span style="cursor: pointer" @click="more">更多</span>
+          <span style="cursor: pointer" @click="onlinedata">在线数据</span>
         </span>
       </h3>
       <div>
         <p class="titleYC"><span>风场名称</span><span>入库时间</span></p>
-        <tabroll
-          :table-data="tableData"
-          :shujuloading="shujuloading"
-          :columns="YCtableColumns"
-          :column-widths="YCcolumnWidths"
-          :max-height="140"
-        ></tabroll>
+        <tabroll :table-data="tableData" :shujuloading="shujuloading" :columns="YCtableColumns"
+          :column-widths="YCcolumnWidths" :max-height="140"></tabroll>
 
         <!-- <el-table
           :data="tableData"
@@ -145,40 +116,74 @@
       </div>
     </div>
 
+    <el-dialog title="实时数据采集统计" :visible.sync="lineShow" width="1340px" :before-close="handleClose">
+      <el-container>
+        <el-aside width="300px">
+          <h1>当日实时数据</h1>
+          <el-input placeholder="请输入内容" size="small" v-model="searchvalue" prefix-icon="el-icon-search"></el-input>
+          <div class="windbox">
+            <div class="windlist" v-for="(item, index) in windList" :key="index">
+              <h3>{{ item.fieldName }}</h3>
+              <p>数据类型:{{ item.dataType }}</p>
+              <p>采集次数:{{ item.collectCount }} 次</p>
+              <p>接入时间:{{ item.createTime }}</p>
+            </div>
+          </div>
+        </el-aside>
+        <el-main>
+          <div class="inquire">
+            <p>
+              风场名称:
+              <el-select v-model="windvalue" placeholder="请选择" size="small">
+                <el-option v-for="item in windoptions" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </p>
+            <p>
+              转换类型:
+              <el-select v-model="typevalue" placeholder="请选择" size="small">
+                <el-option v-for="item in typeoptions" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </p>
+            <p>
+              时间范围:
+              <el-date-picker size="small" v-model="value1" type="daterange" range-separator="至"
+                start-placeholder="开始日期" end-placeholder="结束日期">
+              </el-date-picker>
+            </p>
+            <div>
+              <el-button size="small">查询</el-button>
+              <el-button size="small">重置</el-button>
+            </div>
+          </div>
+
+          <el-table :data="ListtableData" style="width: 100%" class="custom-table">
+            <el-table-column prop="name" label="风场名称"> </el-table-column>
+            <el-table-column prop="type" label="类型" align="center">
+            </el-table-column>
+            <el-table-column prop="address" label="采集总天数" align="center" width="150">
+            </el-table-column>
+            <el-table-column prop="count" label="采集总条数" align="center" width="180">
+            </el-table-column>
+            <el-table-column prop="daytime" label="最近采集时间" align="center">
+            </el-table-column>
+          </el-table>
+          <el-pagination class="fenye" layout="prev, pager, next" :total="50">
+          </el-pagination>
+        </el-main>
+      </el-container>
+    </el-dialog>
+
     <el-dialog title="入库信息" width="70%" :visible.sync="dialogTableVisible">
       <el-button size="small" @click="importdata">导入数据</el-button>
       <el-table :data="gridData" style="max-height: 400px; overflow: auto">
-        <el-table-column
-          property="windFarmName"
-          label="风场名称"
-          show-overflow-tooltip
-          width="150px"
-        ></el-table-column>
-        <el-table-column
-          property="minuteTimeAreaList"
-          label="SCADA分钟级"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          property="secondTimeAreaList"
-          label="SCADA秒级"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          property="faultTimeAreaList"
-          label="故障数据"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          property="warnTimeAreaList"
-          label="报警数据"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          property="vibrationTimeAreaList"
-          label="振动数据"
-          show-overflow-tooltip
-        ></el-table-column>
+        <el-table-column property="windFarmName" label="风场名称" show-overflow-tooltip width="150px"></el-table-column>
+        <el-table-column property="minuteTimeAreaList" label="SCADA分钟级" show-overflow-tooltip></el-table-column>
+        <el-table-column property="secondTimeAreaList" label="SCADA秒级" show-overflow-tooltip></el-table-column>
+        <el-table-column property="faultTimeAreaList" label="故障数据" show-overflow-tooltip></el-table-column>
+        <el-table-column property="warnTimeAreaList" label="报警数据" show-overflow-tooltip></el-table-column>
+        <el-table-column property="vibrationTimeAreaList" label="振动数据" show-overflow-tooltip></el-table-column>
       </el-table>
     </el-dialog>
   </div>
@@ -215,6 +220,7 @@ export default {
       glShow: false,
       YCShow: false,
       PdShow: false,
+      lineShow: false,
       dialogTableVisible: false,
       glData: [],
       FXData: [],
@@ -223,18 +229,141 @@ export default {
       maxHeight: "200",
       gridData: [],
       shujuloading: false,
+      searchvalue: "",
+      value1: "",
+      windvalue: "",
+      typevalue: "",
+      windoptions: [],
+      typeoptions: [],
+      windList: [
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+        {
+          fieldName: "招远风电场",
+          dataType: "SCADA秒级",
+          collectCount: "采集次数:600 次",
+          createTime: "接入时间:2025-11-11 11:11:11",
+        },
+      ],
       YCtableColumns: [{ prop: "windFarmName" }, { prop: "createTime" }],
       YCcolumnWidths: {
         windFarmName: 130,
         createTime: 150,
       },
+
+      ListtableData: [
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+        {
+          name: "招远风电场",
+          type: "SCADA分钟级",
+          address: "985",
+          count: "10000",
+          daytime: "2025-11-11 11:11:11",
+        },
+      ],
     };
   },
   created() {
     this.getbacklog();
     this.ruku();
   },
-  mounted() {},
+  mounted() { },
   methods: {
     getbacklog() {
       queryWaitTask().then((res) => {
@@ -254,13 +383,21 @@ export default {
       });
     },
     getwfx() {
-      analysisResultList({ errState: 1 }).then((res) => {
+      const arr = {
+        pageSize: 999,
+        errState: 1,
+      };
+      analysisResultList(arr).then((res) => {
         this.FXData = res.data.list;
         this.YCShow = true;
       });
     },
     getpd() {
-      analysisResultList({ analysisState: "10" }).then((res) => {
+      const arr = {
+        pageSize: 999,
+        analysisState: "10",
+      };
+      analysisResultList(arr).then((res) => {
         this.PdData = res.data.list;
         this.PdShow = true;
       });
@@ -305,7 +442,7 @@ export default {
       );
       // 等待窗口加载完成后发送消息
       newWindow.onload = () => {
-        newWindow.postMessage({ fieldName, errState ,analysisState}, "*");
+        newWindow.postMessage({ fieldName, errState, analysisState }, "*");
       };
     },
 
@@ -374,6 +511,13 @@ export default {
           console.error("Error fetching data:", error);
         });
     },
+    // 在线数据
+    onlinedata() {
+      this.lineShow = true;
+    },
+    handleClose() {
+      this.lineShow = false;
+    },
   },
 };
 </script>
@@ -396,6 +540,7 @@ export default {
   color: #fff;
   border-radius: 5px;
   margin-bottom: 10px;
+
   .BOXsan {
     width: 100%;
     display: flex;
@@ -435,6 +580,7 @@ export default {
       margin-top: 15px;
       text-align: center;
       cursor: pointer;
+
       .textred {
         color: #d9001b;
       }
@@ -466,6 +612,7 @@ export default {
       margin-top: 15px;
       text-align: center;
       cursor: pointer;
+
       .textred {
         color: #d9001b;
       }
@@ -486,11 +633,13 @@ export default {
       }
     }
   }
+
   h3 {
     margin-top: 5px;
     width: 100%;
   }
 }
+
 .BOX {
   background: rgba(0, 79, 95, 0.8);
   display: flex;
@@ -500,14 +649,17 @@ export default {
   color: #fff;
   border-radius: 5px;
   margin-bottom: 10px;
+
   h3 {
     margin-top: 5px;
   }
+
   .centeredh3 {
     width: 100%;
     display: flex;
     justify-content: space-between;
     margin-bottom: 5px;
+
     span {
       font-size: 12px;
       padding-right: 10px;
@@ -611,4 +763,103 @@ export default {
   border-radius: 15px;
   // background-color: rgba(0, 79, 95, 0.75);
 }
+
+.el-aside {
+  background-color: #e9e9e9;
+
+  .el-input {
+    width: 273px;
+    margin: 10px 0 0 10px;
+  }
+
+  .windbox {
+    height: 565px;
+    overflow: hidden;
+    overflow-y: auto;
+
+    .windlist {
+      margin: 10px;
+      padding: 10px;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+
+      p {
+        line-height: 20px;
+      }
+
+      margin-bottom: 10px;
+      background: #fff;
+    }
+  }
+
+  /* 自定义滚动条样式 */
+  ::-webkit-scrollbar {
+    width: 8px;
+    /* 设置滚动条的宽度 */
+  }
+
+  ::-webkit-scrollbar-thumb {
+    background-color: #888;
+    /* 滚动条滑块的颜色 */
+    border-radius: 10px;
+    /* 滚动条滑块的圆角 */
+    border: 2px solid #f1f1f1;
+    /* 滚动条滑块的边框 */
+  }
+
+  ::-webkit-scrollbar-thumb:hover {
+    background-color: #555;
+    /* 滚动条滑块的悬浮颜色 */
+  }
+
+  ::-webkit-scrollbar-track {
+    background: #f1f1f1;
+    /* 滚动条轨道的颜色 */
+    border-radius: 10px;
+    /* 滚动条轨道的圆角 */
+  }
+}
+
+.el-main {
+  padding-right: 0;
+
+  .inquire {
+    display: flex;
+
+    p {
+      margin-right: 10px;
+    }
+
+    .el-select {
+      width: 180px;
+    }
+
+    .el-range-editor--small.el-input__inner {
+      width: 240px;
+    }
+  }
+
+  .el-table {
+    margin: 20px 0;
+  }
+}
+
+::v-deep .custom-table .el-table__row {
+  height: 40px;
+}
+
+.fenye {
+  margin: 20px auto;
+  text-align: center;
+}
+
+h1 {
+  font-size: 24px;
+  font-weight: 800;
+  margin-left: 10px;
+  margin-top: 10px;
+}
+
+::v-deep .el-dialog {
+  margin-top: 7vh !important;
+}
 </style>

+ 1 - 1
src/views/health/vibration.vue

@@ -48,7 +48,7 @@
         风机:
         <el-select
             style="width: 150px"
-          v-model="unitvale"
+          v-model="unitvalue"
           @change="getchedian"
           size="small"
           placeholder="请选择"