rui.jiang 4 kuukautta sitten
vanhempi
commit
5214a0aab5

+ 44 - 0
src/api/ledger.js

@@ -529,3 +529,47 @@ export function gettime(data) {
     data,
   });
 }
+
+
+
+
+// 待办任务统计
+export function queryWaitTask(data) {
+  return request({
+    url: "/energy-manage-service/homePage/queryWaitTask",
+    method: "get",
+    data,
+  });
+}
+
+// 未关联任务
+export function getAnalysisResultStateList(data) {
+  return request({
+    url: "/energy-manage-service/homePage/getAnalysisResultStateList",
+    method: "get",
+    data,
+  });
+}
+// 分析异常数
+export function getAnalysisResultErrStateList(data) {
+  return request({
+    url: "/energy-manage-service/homePage/getAnalysisResultErrStateList",
+    method: "get",
+    data,
+  });
+}
+
+
+
+
+// 陈统计
+export function analysisResultList(data) {
+  return request({
+    url: "/energy-manage-service/analysis/analysisResultList",
+    method: "get",
+    data,
+  });
+}
+
+
+

+ 2 - 2
src/components/map/index.vue

@@ -196,8 +196,8 @@ export default {
         new TileLayer({
           source: new XYZ({
             // url: "http://127.0.0.1:8010/tiles/{z}/{x}/{y}.png", //本地
-            url: "http://192.168.50.235/tiles/{z}/{x}/{y}.png", //内网
-            // url: "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png", //外网
+            // url: "http://192.168.50.235/tiles/{z}/{x}/{y}.png", //内网
+            url: "http://106.120.102.238:18000/tiles/{z}/{x}/{y}.png", //外网
             // url: "http://10.96.137.5:9080/tiles/{z}/{x}/{y}.png", //大~#@唐
           }),
         }),

+ 8 - 0
src/router/index.js

@@ -66,6 +66,14 @@ const createRouter = () =>
         name: "login",
         component: () => import("../views/login/Index.vue"),
       },
+
+
+
+      {
+        path: "/transition",
+        name: "transition",
+        component: () => import("../views/transition/index.vue"),
+      },
       // 404 Page Not Found
       // {
       //   path: "*",

+ 89 - 73
src/views/admin/cockpitManage/Index.vue

@@ -1,61 +1,65 @@
 <template>
   <div class="map-ditu">
     <Tmap ref="map" :maplist="maplist" @feature-click="featureClick"></Tmap>
-    <div class="ledata">
-      <selecttree
-        placeholder="请选择上级单位"
-        :list="parentOpt"
-        type="1"
-        v-model="companyCode"
-        @change="parentChange"
-        :defaultParentProps="{
-          children: 'children',
-          label: 'companyName',
-          value: 'codeNumber',
-        }"
-      >
-      </selecttree>
+    <div class="statistics">
+      <div class="ledata">
+        <selecttree
+          placeholder="请选择上级单位"
+          :list="parentOpt"
+          type="1"
+          v-model="companyCode"
+          @change="parentChange"
+          :defaultParentProps="{
+            children: 'children',
+            label: 'companyName',
+            value: 'codeNumber',
+          }"
+        >
+        </selecttree>
 
-      <p>
-        <span class="SpText">登录人风场总数:</span>
-        {{ totalList?.fieldSumNumber ? totalList.fieldSumNumber : 0 }}
-        个
-      </p>
-      <p>
-        <span class="SpText">已完成分析风场:</span>
-        {{
-          totalList?.analysisFinishNumber ? totalList.analysisFinishNumber : 0
-        }}
-        个
-      </p>
-      <p>
-        <span class="SpText">未完成分析风场:</span>
-        {{
-          totalList?.analysisUnFinishedNumber
-            ? totalList.analysisUnFinishedNumber
-            : 0
-        }}
-        个
-      </p>
-      <p>
-        <span class="SpText">风机数量:</span>
-        {{ totalList?.engineGroupNumber ? totalList.engineGroupNumber : 0 }}
-        个
-      </p>
-      <p>
-        <span class="SpText">风场状态:</span>
-        <span class="red"></span>
-        <span class="yellow"></span>
-        <span class="green"></span>
-      </p>
-      <el-switch
-        v-model="value1"
-        active-text="显示"
-        inactive-text="隐藏"
-        @change="handleSwitchChange"
-      >
-      </el-switch>
+        <p>
+          <span class="SpText">登录人风场总数:</span>
+          {{ totalList?.fieldSumNumber ? totalList.fieldSumNumber : 0 }}
+          个
+        </p>
+        <p>
+          <span class="SpText">已完成分析风场:</span>
+          {{
+            totalList?.analysisFinishNumber ? totalList.analysisFinishNumber : 0
+          }}
+          个
+        </p>
+        <p>
+          <span class="SpText">未完成分析风场:</span>
+          {{
+            totalList?.analysisUnFinishedNumber
+              ? totalList.analysisUnFinishedNumber
+              : 0
+          }}
+          个
+        </p>
+        <p>
+          <span class="SpText">风机数量:</span>
+          {{ totalList?.engineGroupNumber ? totalList.engineGroupNumber : 0 }}
+          个
+        </p>
+        <p>
+          <span class="SpText">风场状态:</span>
+          <span class="red"></span>
+          <span class="yellow"></span>
+          <span class="green"></span>
+        </p>
+        <el-switch
+          v-model="value1"
+          active-text="显示"
+          inactive-text="隐藏"
+          @change="handleSwitchChange"
+        >
+        </el-switch>
+      </div>
+      <leftdata v-show="ShowRi" class="task"></leftdata>
     </div>
+
     <Rightdata
       v-show="ShowRi"
       ref="childRef"
@@ -76,6 +80,7 @@ import {
 } from "@/api/ledger.js";
 import Tmap from "@/components/map";
 import Rightdata from "./component/rightdata.vue";
+import Leftdata from "./component/leftdata.vue";
 
 export default {
   name: "Index",
@@ -83,6 +88,7 @@ export default {
     Tmap,
     Rightdata,
     selecttree,
+    Leftdata,
   },
   data() {
     return {
@@ -221,17 +227,15 @@ export default {
           message: "当前风场正在分析中",
           type: "warning",
         });
-      } else if (val === "1" || val === 1 || val === "30" || val === 30 ) {
-        console.log("打包成功")
+      } else if (val === "1" || val === 1 || val === "30" || val === 30) {
+        console.log("打包成功");
         this.$router.push({
           path: "cockpitManage/electronic-map",
           query: {
             fieldCode: data.codeNumber,
-            batchCode:data.batchCode
+            batchCode: data.batchCode,
           },
-        
         });
-
       }
     },
     handleSwitchChange() {
@@ -250,24 +254,22 @@ export default {
   position: relative;
 }
 
-.ridata {
-  position: absolute;
-  top: 20px;
-  right: 20px;
-}
-
-.ledata {
-  font-size: 14px;
-  width: 300px;
+.statistics {
   position: absolute;
-  top: 20px;
+  top: 20px; /* 距离页面顶部20px */
   left: 60px;
-  background: #008080;
-  padding: 10px;
-  color: #fff;
-  border-radius: 5px;
+  display: grid;
+  grid-template-rows: auto auto; /* 为 ledata 和 task 分配行 */
+  grid-gap: 20px; /* 在 ledata 和 task 之间设置间距 */
 
-  p {
+  .ledata {
+    font-size: 14px;
+    width: 300px;
+    background: #008080;
+    padding: 10px;
+    color: #fff;
+    border-radius: 5px;
+    p {
     line-height: 24px;
 
     .SpText {
@@ -297,6 +299,20 @@ export default {
       background-color: #7ecf51;
     }
   }
+  }
+
+  .task {
+    background: #f4f4f4;
+    // padding: 10px;
+    color: #333;
+    border-radius: 5px;
+  }
+}
+
+.ridata {
+  position: absolute;
+  top: 20px;
+  right: 20px;
 }
 
 ::v-deep .el-switch__label.is-active {

+ 289 - 0
src/views/admin/cockpitManage/component/leftdata.vue

@@ -0,0 +1,289 @@
+<template>
+  <div class="backbone">
+    <div class="BOX">
+      <h3>待办任务</h3>
+      <div style="display: flex">
+        <div class="YC02" @click="getwgl">
+          <strong class="texyellow">
+            {{ onrelevance ? onrelevance : 0 }}</strong
+          >
+          <span>未关联任务</span>
+        </div>
+        <div class="YC02" @click="getwfx">
+          <strong class="textred"> {{ abnormal ? abnormal : 0 }}</strong>
+          <span>分析异常数</span>
+        </div>
+
+        <div class="YC03"></div>
+      </div>
+
+      <el-dialog title="未关联任务统计表" :visible.sync="glShow" width="40%">
+        <!-- 外部容器设置最大高度和滚动条 -->
+        <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="分析名称"
+              width="180"
+            ></el-table-column>
+            <el-table-column
+              prop="createTime"
+              label="创建时间"
+            ></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
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-dialog>
+
+      <el-dialog title="分析异常统计表" :visible.sync="YCShow" width="40%">
+        <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="分析名称" width="180">
+            </el-table-column>
+            <el-table-column prop="createTime" label="创建时间">
+            </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
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+  
+  <script>
+import {
+  queryWaitTask,
+  getAnalysisResultStateList,
+  getAnalysisResultErrStateList,
+  analysisResultList,
+} from "@/api/ledger.js";
+
+export default {
+  // props: {
+  //   maplistArr: {
+  //     type: Object,
+  //     default: () => ({}),
+  //   },
+  //   defaultdata: {
+  //     type: Object,
+  //     default: () => ({}),
+  //   },
+  // },
+
+  data() {
+    return {
+      onrelevance: "",
+      abnormal: "",
+      glShow: false,
+      YCShow: false,
+      glData: [],
+      FXData: [],
+    };
+  },
+  created() {
+    this.getbacklog();
+  },
+  mounted() {},
+  methods: {
+    getbacklog() {
+      queryWaitTask().then((res) => {
+        this.abnormal = res.data.errCount;
+        this.onrelevance = res.data.uncorrelatedCount;
+      });
+    },
+    getwgl() {
+      const arr = {
+        pageSize: 999,
+        analysisState: -1,
+      };
+      analysisResultList(arr).then((res) => {
+        this.glData = res.data.list;
+        this.glShow = true;
+      });
+    },
+    getwfx() {
+      analysisResultList({ errState: 1 }).then((res) => {
+        this.FXData = res.data.list;
+        this.YCShow = true;
+      });
+    },
+
+    handleClick(row) {
+      const fieldName = row.fieldName; // 获取当前行的 fieldName 数据
+      const analysisState = -1;
+
+      // 打开新窗口
+      const newWindow = window.open(
+        "/home/performance/assetssMag?id=195",
+        "_blank"
+      );
+      // 等待窗口加载完成后发送消息
+      newWindow.onload = () => {
+        newWindow.postMessage({ fieldName, analysisState }, "*");
+      };
+    },
+
+    YChandleClick(row) {
+      const fieldName = row.fieldName; // 获取当前行的 fieldName 数据
+      const errState = 1;
+      // 打开新窗口
+      const newWindow = window.open(
+        "/home/performance/assetssMag?id=195",
+        "_blank"
+      );
+      // 等待窗口加载完成后发送消息
+      newWindow.onload = () => {
+        newWindow.postMessage({ fieldName, errState }, "*");
+      };
+    },
+  },
+};
+</script>
+  
+  <style lang="scss" scoped>
+.backbone {
+  width: 300px;
+  color: #fff;
+  border-radius: 5px;
+  //   padding: 20px;
+}
+
+.BOX {
+  background: #004f5f;
+  display: flex;
+  padding-left: 10px;
+  flex-wrap: wrap;
+  padding-bottom: 15px;
+  color: #fff;
+  border-radius: 5px;
+  h3 {
+    margin-top: 5px;
+  }
+}
+
+.YC01 {
+  width: 154px;
+  height: 60px;
+  background-image: url("../../../../assets/001.png");
+  background-size: 154px 60px;
+  background-repeat: no-repeat;
+  background-position: center;
+  margin-right: 15px;
+  margin-top: 15px;
+  text-align: center;
+
+  strong {
+    display: block;
+    font-size: 26px;
+    color: #4bffff;
+  }
+
+  span {
+    display: block;
+    font-size: 12px;
+  }
+}
+
+.YC02 {
+  width: 70px;
+  height: 60px;
+  background-image: url("../../../../assets/002.png");
+  background-size: 70px 60px;
+  background-repeat: no-repeat;
+  background-position: center;
+  margin-right: 15px;
+  margin-top: 15px;
+  text-align: center;
+  cursor: pointer;
+  .textred {
+    color: #d9001b;
+  }
+
+  .texyellow {
+    color: #facd91;
+  }
+
+  strong {
+    display: block;
+    font-size: 26px;
+    color: #4bffff;
+  }
+
+  span {
+    display: block;
+    font-size: 12px;
+  }
+}
+
+.YC03 {
+  width: 70px;
+  height: 60px;
+}
+
+.Tabtab {
+  font-size: 12px;
+}
+
+::v-deep.el-table__cell {
+  padding: 2px 0 !important;
+}
+
+::v-deep.el-table .el-table__cell {
+  padding: 2px 0 !important;
+}
+
+::v-deep.el-table--scrollable-y .el-table__body-wrapper {
+  overflow-y: clip !important;
+}
+
+.titleYC {
+  font-size: 14px;
+  background: #214e5d;
+  padding: 5px 0;
+
+  span:nth-child(1) {
+    margin: 0 70px 0 10px;
+  }
+}
+
+.titleJQ {
+  font-size: 14px;
+  background: #214e5d;
+  padding: 5px 0;
+
+  span:nth-child(1) {
+    margin: 0 15px 0 10px;
+  }
+
+  span:nth-child(2) {
+    margin: 0 45px 0 30px;
+  }
+}
+</style>
+  

+ 0 - 331
src/views/admin/cockpitManage/component/rightdata copy.vue

@@ -1,331 +0,0 @@
-<template>
-  <div class="backbone">
-    <div>
-      <h3>风场分析完成率</h3>
-      <div id="main" style="width: 260px; height: 160px"></div>
-    </div>
-    <div>
-      <h3>异常设备概览</h3>
-      <div class="BOX">
-        <div style="display: flex">
-          <div class="YC01">
-            <strong>4545</strong>
-            <span>异常总数</span>
-          </div>
-          <div class="YC02">
-            <strong>20</strong>
-            <span>本月异常</span>
-          </div>
-        </div>
-
-        <div style="display: flex">
-          <div class="YC02">
-            <strong class="textred">0</strong>
-            <span>未处理异常</span>
-          </div>
-          <div class="YC02">
-            <strong class="texyellow">20</strong>
-            <span>异常设备数</span>
-          </div>
-          <div class="YC03"></div>
-        </div>
-      </div>
-    </div>
-    <div>
-      <h3>异常数据信息</h3>
-      <!-- <Tabroll :table-data="tableData" :shujuloading="shujuloading" :columns="tableColumns" :max-height="150"></Tabroll> -->
-
-      <div @mousemove="move">
-        <div class="table" @mouseleave="leave">
-          <dv-scroll-board
-            :config="config"
-            @mouseover="over"
-            style="width: 260px; height: 150px"
-          />
-          <p
-            v-if="ifShow"
-            class="dv-text"
-            :style="{ top: dvText.keyY, left: dvText.keyX }"
-          >
-            {{ dvText.name }}
-          </p>
-        </div>
-      </div>
-    </div>
-    <div>
-      <h3>近期操作记录</h3>
-      <div @mousemove="move">
-        <div class="table" @mouseleave="leave">
-          <dv-scroll-board
-            :config="JQconfig"
-            @mouseover="over"
-            style="width: 260px; height: 150px"
-          />
-          <p
-            v-if="ifShow"
-            class="dv-text"
-            :style="{ top: dvText.keyY, left: dvText.keyX }"
-          >
-            {{ dvText.name }}
-          </p>
-        </div>
-      </div>
-      <!-- <Tabroll
-        :table-data="tableData"
-        :shujuloading="shujuloading"
-        :columns="tableColumns"
-        :max-height="150"
-      ></Tabroll> -->
-    </div>
-  </div>
-</template>
-
-<script>
-import * as echarts from "echarts";
-import Tabroll from "./tabroll.vue";
-export default {
-  components: {
-    Tabroll,
-  },
-
-  data() {
-    return {
-      config: {
-        header: ["风场名称", "风机信息"],
-        data: [
-          ["唐龙三期风电场", "XXXXXX0001号风机"],
-          ["唐龙三期风电场", "XXXXXX0002号风机"],
-          ["唐龙三期风电场", "XXXXXX0003号风机"],
-          ["唐龙三期风电场", "XXXXXX0004号风机"],
-          ["唐龙三期风电场", "XXXXXX0005号风机"],
-          ["唐龙三期风电场", "XXXXXX0005号风机"],
-        ],
-        headerBGC: "#004F5F",
-        oddRowBGC: "#004F5F",
-        evenRowBGC: "#028A8A",
-      },
-      JQconfig: {
-        header: ["姓名", "时间", "操作记录"],
-        data: [
-          ["劳大", "2020-02-20", "进行了性能分析操作编辑"],
-          ["利尔", "2020-02-20", "进行了性能分析操作编辑"],
-          ["笑嘻嘻", "2020-02-20", "进行了性能分析操作编辑"],
-          ["起飞楼", "2020-02-20", "进行了性能分析操作编辑"],
-          ["王强", "2020-02-20", "进行了性能分析操作编辑"],
-          ["李四", "2020-02-20", "进行了性能分析操作编辑"],
-        ],
-        headerBGC: "#004F5F",
-        oddRowBGC: "#004F5F",
-        evenRowBGC: "#028A8A",
-        columnWidth: [65],
-      },
-      dvText: {
-        name: "",
-        keyY: "",
-        keyX: "",
-      },
-      //控制单元格 显示/隐藏
-      ifShow: false,
-
-      myChart: null,
-      tableData: [
-        { name: "王小虎" },
-        { name: "王小虎" },
-        { name: "王小虎" },
-        { name: "王小虎" },
-        { name: "王小虎" },
-        { name: "王小虎" },
-      ],
-      shujuloading: false,
-      tableColumns: [
-        { prop: "name", label: "姓名" },
-        { prop: "date", label: "日期" },
-        { prop: "record", label: "记录" },
-      ],
-    };
-  },
-  mounted() {
-    this.initChart();
-  },
-
-  methods: {
-    initChart() {
-      var chartDom = document.getElementById("main");
-      var myChart = echarts.init(chartDom);
-      var option;
-
-      option = {
-        tooltip: {
-          trigger: "item",
-          formatter: function (params) {
-            var percent = params.percent.toFixed(2) + "%";
-            return `${params.name}: ${params.value} (${percent})`;
-          },
-        },
-        legend: {
-          orient: "vertical",
-          left: "left",
-          top: "30%", // 将图例向下移动一些
-        },
-        series: [
-          {
-            type: "pie",
-            radius: ["40%", "80%"],
-            avoidLabelOverlap: false,
-            label: {
-              show: false,
-              position: "center",
-            },
-            labelLine: {
-              show: false,
-            },
-            center: ["60%", "50%"], // 将饼图往右移动一些
-            data: [
-              { value: 15, name: "已完成", itemStyle: { color: "#7ECF51" } },
-              { value: 50, name: "进行中", itemStyle: { color: "#EECB5F" } },
-              { value: 30, name: "未开始", itemStyle: { color: "#E16757" } },
-            ],
-          },
-        ],
-      };
-
-      option && myChart.setOption(option);
-    },
-
-    over(v) {
-      this.ifShow = true;
-      //v.ceil拿到单元格数据
-      this.dvText.name = v.ceil;
-      //没有值则直接隐藏悬浮框 不然如果设置padding会有背景
-      if (this.dvText.name === undefined) {
-        this.ifShow = false;
-      }
-    },
-    // 鼠标移动
-    move(e) {
-      //将获取的值x轴、y轴的值给悬浮框 用来定位到单元格上.
-      //-1200 -500凭自己感觉调 因为每个表格在页面的位置都不一样
-      this.dvText.keyX = e.pageX - 1400 + "px";
-      this.dvText.keyY = e.pageY - 120 + "px";
-    },
-    // 鼠标离开
-    leave() {
-      //隐藏单元格
-      this.ifShow = false;
-    },
-  },
-};
-</script>
-
-<style lang="scss" scoped>
-.backbone {
-  width: 300px;
-  color: #fff;
-  background: #008080;
-  // height: 100%;
-  // height: 95%;
-  border-radius: 5px;
-  padding: 20px;
-}
-
-.BOX {
-  background: #004f5f;
-  display: flex;
-
-  padding-left: 10px;
-  flex-wrap: wrap;
-  padding-bottom: 15px;
-}
-
-.YC01 {
-  width: 154px;
-  height: 60px;
-  background-image: url("../../../../assets/001.png");
-  background-size: 154px 60px;
-  background-repeat: no-repeat;
-  background-position: center;
-  margin-right: 15px;
-  margin-top: 15px;
-  text-align: center;
-
-  strong {
-    display: block;
-    font-size: 26px;
-    color: #4bffff;
-  }
-
-  span {
-    display: block;
-    font-size: 12px;
-  }
-}
-
-.YC02 {
-  width: 70px;
-  height: 60px;
-  background-image: url("../../../../assets/002.png");
-  background-size: 70px 60px;
-  background-repeat: no-repeat;
-  background-position: center;
-  margin-right: 15px;
-  margin-top: 15px;
-  text-align: center;
-
-  .textred {
-    color: #d9001b;
-  }
-
-  .texyellow {
-    color: #facd91;
-  }
-
-  strong {
-    display: block;
-    font-size: 26px;
-    color: #4bffff;
-  }
-
-  span {
-    display: block;
-    font-size: 12px;
-  }
-}
-
-.YC03 {
-  width: 70px;
-  height: 60px;
-}
-
-.Tabtab {
-  font-size: 12px;
-}
-
-::v-deep.el-table__cell {
-  padding: 2px 0 !important;
-}
-
-::v-deep.el-table .el-table__cell {
-  padding: 2px 0 !important;
-}
-
-::v-deep.el-table--scrollable-y .el-table__body-wrapper {
-  overflow-y: clip !important;
-}
-
-.ceil {
-  position: relative;
-}
-.dv-text {
-  background: #666;
-  padding: 5px;
-  font-size: 14px;
-  z-index: 11;
-  position: absolute;
-  left: 0;
-  top: 0;
-}
-
-.dv-scroll-board {
-  font-size: 12px;
-}
-</style>

+ 56 - 7
src/views/performance/assetssMag.vue

@@ -350,6 +350,8 @@ export default {
         pageNum: 1,
         pageSize: 10,
         totalSize: 0,
+        analysisState: "",
+        errState: "",
       },
       tableData: [],
       rowInfo: {},
@@ -361,8 +363,42 @@ export default {
   },
   created() {
     this.getTableList();
+    window.addEventListener("message", this.handleMessage);//江
+  },
+  beforeDestroy() {
+    // 销毁消息监听器
+    window.removeEventListener("message", this.handleMessage);//江
   },
   methods: {
+
+    //江
+    handleMessage(event) {
+      // 确保消息来自当前域
+      if (event.origin !== window.location.origin) {
+        return;
+      }
+
+      // 获取传递的参数
+      const { fieldName, analysisState, errState } = event.data;
+
+      // 更新表单字段并调用查询
+      if (fieldName !== undefined) {
+        this.formInline.fieldName = fieldName;
+        console.log(fieldName, "0");
+      }
+      if (analysisState !== undefined) {
+        this.formInline.analysisState = analysisState;
+        console.log(analysisState, "2");
+      }
+      if (errState !== undefined) {
+        this.formInline.errState = errState;
+        console.log(errState, "1");
+      }
+
+      // 调用查询方法
+      this.getTableList();
+    },
+
     handleCloses(done) {
       this.$confirm("确认关闭?")
         .then((_) => {
@@ -457,13 +493,25 @@ export default {
       this.formInline.pageNum = val;
       this.getTableList();
     },
+
+    // 江修改部分
     async getTableList() {
       try {
         this.loading = true;
-        const result = await getAnalysisResultList({
-          ...this.formInline,
-          totalSize: undefined,
-        });
+        const params = { ...this.formInline, totalSize: undefined };
+
+        // 如果 analysisState 存在,传递 analysisState 参数
+        if (this.formInline.analysisState !== undefined) {
+          params.analysisState = this.formInline.analysisState;
+        }
+
+        // 如果 errState 存在,传递 errState 参数
+        if (this.formInline.errState !== undefined) {
+          params.errState = this.formInline.errState;
+        }
+
+        // 发起请求
+        const result = await getAnalysisResultList(params);
         this.tableData = result.data.list;
         this.formInline.totalSize = result.data.totalSize;
         this.loading = false;
@@ -484,6 +532,9 @@ export default {
     // 重置
     reset(formName) {
       this.$refs[formName].resetFields();
+      this.formInline.fieldName=""
+      this.formInline.analysisState=""
+      this.formInline.errState=""
       this.getTableList();
     },
     async fetchData() {
@@ -521,9 +572,7 @@ export default {
 
     Newanalyse() {},
     examine() {
-      this.$router.push({
-        path: "/home/transition/index",
-      });
+      window.open(this.$router.resolve({ path: "/transition" }).href, "_blank");
     },
   },
   mounted() {

+ 699 - 4
src/views/transition/index.vue

@@ -1,12 +1,707 @@
 <template>
-  <div>
-    
+  <div class="kernel">
+    <el-collapse v-model="activeNames">
+      <el-collapse-item title="基础信息" name="1">
+        <p @click="database" class="CPC">
+          数据入库风场统计数: <span>{{ windFarmCount }}</span
+          >个
+        </p>
+
+        <el-drawer title="入库统计" :visible.sync="drawer">
+          <div class="card" v-for="(item, index) in Rklist" :key="index">
+            <p>{{ item.windFarmName }}</p>
+
+            <ul>
+              <li
+                v-for="(type, typeIndex) in item.typeCountDataList"
+                :key="typeIndex"
+                @click="details(item.windFarmCode, type)"
+              >
+                <span class="sp1">{{ type.transferName }}</span>
+                <span class="sp2">{{ type.count }}</span>
+                <span class="sp3">{{
+                  type.latestStorageTime || "无数据"
+                }}</span>
+              </li>
+            </ul>
+          </div>
+        </el-drawer>
+
+        <el-dialog title="统计信息" :visible.sync="dialogVisible" width="50%">
+          <ul class="scrollable-list">
+            <li v-for="(item, index) in dataset" :key="index">
+              任务名称: <span>{{ item.taskName }}</span> 时间跨度:<span>{{
+                item.dataMinTime
+              }}</span
+              >~<span>{{ item.dataMaxTime }}</span>
+            </li>
+          </ul>
+        </el-dialog>
+
+        <el-descriptions title="最新入库详情">
+          <el-descriptions-item label="任务名称">{{
+            this.incoming.taskName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="数据类型">{{
+            this.incoming.transferTypeName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="时间颗粒度"
+            >{{ this.incoming.timeGranularity }}(秒)</el-descriptions-item
+          >
+          <el-descriptions-item label="时间范围"
+            >{{ this.incoming.dataMinTime }}~{{
+              this.incoming.dataMaxTime
+            }}</el-descriptions-item
+          >
+          <el-descriptions-item label="风场名称">{{
+            this.incoming.windFarmName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="机组数量">{{
+            this.incoming.engineCount
+          }}</el-descriptions-item>
+          <el-descriptions-item label="入库时间">{{
+            this.incoming.transferFinishTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="收资人">{{
+            this.incoming.dataCollector
+          }}</el-descriptions-item>
+        </el-descriptions>
+      </el-collapse-item>
+    </el-collapse>
+
+    <div class="condition">
+      <p>
+        风场名称:
+        <el-select v-model="windvalue" placeholder="请选择">
+          <el-option
+            v-for="item in windoptions"
+            :key="item.fieldCode"
+            :label="item.fieldName"
+            :value="item.fieldCode"
+          >
+          </el-option>
+        </el-select>
+      </p>
+      <p>
+        转换类型:
+        <el-select v-model="typevalue" placeholder="请选择">
+          <el-option
+            v-for="item in typeoptions"
+            :key="item.paramKey"
+            :label="item.paramValue"
+            :value="item.paramKey"
+          >
+          </el-option>
+        </el-select>
+      </p>
+      <p>
+        转换状态:
+        <el-select v-model="statevalue" placeholder="请选择">
+          <el-option
+            v-for="item in stateoptions"
+            :key="item.transferStatus"
+            :label="item.label"
+            :value="item.transferStatus"
+          >
+          </el-option>
+        </el-select>
+      </p>
+
+      <div>
+        <el-button @click="query">查询</el-button>
+        <el-button @click="reset">重置</el-button>
+        <el-button @click="newtransition">新增转换</el-button>
+      </div>
+    </div>
+
+    <el-dialog title="转换" :visible.sync="transitionShow" width="30%">
+      <el-form ref="form" :model="form" :rules="formRules" label-width="80px">
+        <el-form-item label="选择风场" prop="wind">
+          <el-select v-model="form.wind" clearable placeholder="请选择风场">
+            <el-option
+              v-for="item in windoptions"
+              :key="item.fieldCode"
+              :label="item.fieldName"
+              :value="item.fieldCode"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="转换类型" prop="type">
+          <el-select v-model="form.type" clearable placeholder="请选择转换类型">
+            <el-option
+              v-for="item in typeoptions"
+              :key="item.paramKey"
+              :label="item.paramValue"
+              :value="item.paramKey"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="读取路径" prop="path">
+          <el-input v-model="form.path" clearable />
+        </el-form-item>
+
+        <el-form-item label="收资人" prop="name">
+          <el-input v-model="form.name" clearable />
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="primary" @click="onSubmit">提交</el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-dialog
+        width="40%"
+        title="提交"
+        :visible.sync="innerVisible"
+        append-to-body
+      >
+        <div class="renwu">
+          <p>
+            任务名称:<el-input
+              placeholder="请输入内容"
+              v-model="nameinput"
+              clearable
+            >
+            </el-input>
+          </p>
+          <el-button @click="onruku">确定</el-button>
+        </div>
+      </el-dialog>
+    </el-dialog>
+
+    <template>
+      <el-table :data="tableData" style="width: 100%">
+        <el-table-column type="expand">
+          <template slot-scope="props">
+            <el-form label-position="left" inline class="demo-table-expand">
+              <el-form-item label="风场编号:">
+                <span>{{ props.row.windFarmCode }}</span>
+              </el-form-item>
+              <el-form-item label="风场名称:">
+                <span>{{ props.row.windFarmName }}</span>
+              </el-form-item>
+              <el-form-item label="任务名称:">
+                <span>{{ props.row.taskName }}</span>
+              </el-form-item>
+              <el-form-item label="收资人:">
+                <span>{{ props.row.dataCollector }}</span>
+              </el-form-item>
+              <el-form-item label="原始数据读取路径:">
+                <span>{{ props.row.readDir }}</span>
+              </el-form-item>
+              <el-form-item label="标准化数据保存路径:">
+                <span>{{ props.row.archivePath }}</span>
+              </el-form-item>
+              <el-form-item label="时间跨度:">
+                <span
+                  >{{ props.row.dataMinTime }}~{{ props.row.dataMaxTime }}</span
+                >
+              </el-form-item>
+
+              <el-form-item label="时间颗粒度(秒):">
+                <span>{{ props.row.timeGranularity }}</span>
+              </el-form-item>
+
+              <el-form-item label="异常信息:" class="form-item">
+                <span>{{ props.row.errInfo }}</span>
+              </el-form-item>
+            </el-form>
+          </template>
+        </el-table-column>
+        <el-table-column label="风场名称" prop="windFarmName" width="200">
+        </el-table-column>
+        <el-table-column label="任务名称" prop="taskName" > </el-table-column>
+        <el-table-column label="转换类型" prop="transferTypeName" width="130">
+        </el-table-column>
+        <el-table-column label="导入状态" prop="transferStatus" width="100">
+          <template slot-scope="scope">
+            <span v-if="scope.row.transferStatus === -1">等待导入</span>
+            <span v-if="scope.row.transferStatus === 0">导入中</span>
+            <span v-if="scope.row.transferStatus === 1">导入成功</span>
+            <span v-if="scope.row.transferStatus === 2">导入失败</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="创建时间" prop="createTime">
+        </el-table-column>
+        <el-table-column label="操作" prop="desc">
+          <template slot-scope="scope">
+            <el-button @click="editor(scope.row)" type="text" size="small">
+              编辑
+            </el-button>
+
+            <el-button
+              @click="restart(scope.row)"
+              type="text"
+              size="small"
+              v-if="scope.row.transferStatus !== 1"
+            >
+              重新导入
+            </el-button>
+          </template></el-table-column
+        >
+      </el-table>
+      <el-pagination
+        class="fenye"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :page-size="pageSize"
+        layout="total, prev, pager, next"
+        :total="total"
+      ></el-pagination>
+    </template>
   </div>
 </template>
 
 <script>
-export default {};
+import axios from "axios";
+import { getWindFieldNames } from "@/api/ledger.js";
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      dataset: [],
+      windFarmCount: "",
+      typevalue: "",
+      typeoptions: [],
+      statevalue: "",
+      incoming: {},
+      stateoptions: [
+        {
+          transferStatus: -1,
+
+          label: "等待转换",
+        },
+        {
+          transferStatus: 0,
+
+          label: "转换中",
+        },
+        {
+          transferStatus: 1,
+
+          label: "转换成功",
+        },
+        {
+          transferStatus: 2,
+
+          label: "转换失败",
+        },
+      ],
+      activeNames: ["1"],
+      windvalue: "",
+      windoptions: [],
+      currentPage: 1, // 当前页
+      pageSize: 10, // 每页显示条数
+      total: 0,
+      drawer: false,
+      tableData: [],
+      Rklist: [],
+      nameinput: "",
+      transitionShow: false,
+      innerVisible: false,
+      form: {
+        wind: "",
+        type: "",
+        path: "",
+        name: "",
+      },
+      formRules: {
+        wind: [{ required: true, message: "请选择风场", trigger: "blur" }],
+        type: [{ required: true, message: "请选择转换类型", trigger: "blur" }],
+        path: [{ required: true, message: "请输入读取路径", trigger: "blur" }],
+        name: [{ required: true, message: "请输入收资人", trigger: "blur" }],
+      },
+    };
+  },
+  created() {
+    this.getchaxun();
+    this.gettongji();
+    this.getzuijin();
+    this.windsite();
+    this.query();
+  },
+  methods: {
+    load() {
+      this.count += 2;
+    },
+
+    async getchaxun() {
+      const params = {
+        type: "trans_type", // 假设 trans_type 是你传递的参数
+      };
+      try {
+        const res = await axios.get("/ETLapi/sysConf/getByType", { params });
+        this.typeoptions = res.data.datas;
+      } catch (error) {
+        console.error("Error fetching data:", error);
+      }
+    },
+
+    async gettongji() {
+      try {
+        const res = await axios.post("/ETLapi/dataTransfer/getStatisticalData");
+        this.windFarmCount = res.data.datas.windFarmCount;
+      } catch (error) {
+        console.error("Error fetching data:", error);
+      }
+    },
+
+    async getzuijin() {
+      try {
+        const res = await axios.post(
+          "/ETLapi/dataTransfer/recentlyImportedSuccessfulData"
+        );
+        this.incoming = res.data.datas;
+      } catch (error) {
+        console.error("Error fetching data:", error);
+      }
+    },
+
+    async windsite() {
+      try {
+        const res = await getWindFieldNames();
+        this.windoptions = res.data;
+      } catch (error) {
+        console.error("Error fetching data:", error);
+      }
+    },
+
+    async query() {
+      const params = {
+        pageNo: this.currentPage,
+        pageSize: this.pageSize,
+        transferStatus: this.statevalue,
+        transferType: this.typevalue,
+        windFarmCode: this.windvalue,
+      };
+      try {
+        const res = await axios.post(
+          "/ETLapi/dataTransfer/getDataTransfer",
+          params
+        );
+        this.tableData = res.data.datas;
+        this.total = res.data.totalCount;
+      } catch (error) {
+        console.error("Error fetching data:", error);
+      }
+    },
+
+    handleSizeChange(newSize) {
+      this.pageSize = newSize;
+      this.query(); // 更新后重新请求数据
+    },
+
+    // 处理页码变化
+    handleCurrentChange(page) {
+      this.currentPage = page; // 更新当前页
+      this.query(); // 重新请求数据
+    },
+    reset() {
+      this.windvalue = "";
+      this.typevalue = "";
+      this.statevalue = "";
+      this.query();
+    },
+
+    restart(row) {
+      axios
+        .get(`/ETLapi/dataTransfer/reTransfer/${row.id}`)
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.$message({
+              message: "重新导入成功",
+              type: "success",
+            });
+            this.query();
+          }
+          if (res.data.code === 500) {
+            this.$message.error(res.data.message);
+          }
+        })
+        .catch((error) => {
+          console.error("Error fetching data:", error);
+        });
+    },
+
+    database() {
+      this.drawer = true;
+      axios
+        .post(`/ETLapi/dataTransfer/classificationImportDataDetails`)
+        .then((res) => {
+          if (res.data.code === 200) {
+            this.Rklist = res.data.datas;
+          }
+          if (res.data.code === 500) {
+            this.$message.error(res.data.message);
+          }
+        })
+        .catch((error) => {
+          console.error("Error fetching data:", error);
+        });
+    },
+
+    details(windFarmCode, type) {
+      this.dialogVisible = true;
+      // console.log(windFarmCode, type);
+      // return;
+      const params = {
+        pageNo: "1",
+        pageSize: "999",
+        transferStatus: 1,
+        transferType: type.transferType,
+        windFarmCode: windFarmCode,
+      };
+      axios
+        .post("/ETLapi/dataTransfer/getDataTransfer", params)
+        .then((res) => {
+          this.dataset = res.data.datas;
+        })
+        .catch((error) => {
+          console.error("Error fetching data:", error);
+        });
+    },
+
+    newtransition() {
+      this.transitionShow = true;
+    },
+
+    onSubmit() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          // 表单验证通过,执行提交操作
+          const currentTime = this.$formatDateTWO(new Date());
+          const selectedWind = this.windoptions.find(
+            (option) => option.fieldCode === this.form.wind
+          );
+          const selectedType = this.typeoptions.find(
+            (option) => option.paramKey === this.form.type
+          );
+          const windLabel = selectedWind ? selectedWind.fieldName : "";
+          const typeLabel = selectedType ? selectedType.paramValue : "";
+
+          // 拼接 nameinput
+          this.nameinput = `${windLabel}${typeLabel}${currentTime}`;
+          this.innerVisible = true;
+        } else {
+          console.log("表单验证失败");
+        }
+      });
+    },
+    onruku() {
+      const params = {
+        dataCollector: this.form.name,
+        readDir: this.form.path,
+        taskName: this.nameinput,
+        transferType: this.form.type,
+        windFarmCode: this.form.wind,
+        windFarmName:
+          this.windoptions.find((option) => option.fieldCode === this.form.wind)
+            ?.fieldName || "",
+      };
+   
+      axios
+        .post("/ETLapi/dataTransfer/addDataTransferTask", params)
+        .then((res) => {
+          this.innerVisible = false;
+          this.transitionShow = false;
+          if (res.data.code === 200) {
+            this.$message({
+              message: "导入成功",
+              type: "success",
+            });
+            this.query();
+          }
+          if (res.data.code === 500) {
+            this.$message.error(res.data.message);
+          }
+        });
+    },
+  },
+};
 </script>
 
-<style>
+<style lang="scss" scoped>
+.CPC {
+  border: 1px solid #008080;
+  background: #00808057;
+  display: inline-block;
+  padding: 10px;
+  color: #000000;
+  border-radius: 5px;
+  cursor: pointer;
+}
+.kernel {
+  min-height: 100vh;
+  width: 100%;
+  background: #fff;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+  padding: 0 40px;
+
+  h3 {
+    font-size: 40px;
+    font-weight: 600;
+    text-align: center;
+  }
+
+  .condition {
+    display: flex;
+    padding: 20px 0;
+
+    p {
+      margin-right: 20px;
+    }
+  }
+}
+
+.demo-table-expand {
+  font-size: 0;
+}
+
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 50%;
+}
+
+::v-deep .el-collapse-item__header {
+  font-weight: 600;
+  font-size: 18px;
+}
+
+.fenye {
+  display: flex;
+  justify-content: center;
+  padding: 20px 0;
+}
+.card {
+  margin: 10px 30px;
+  border-radius: 4px;
+  padding: 20px;
+  border: 1px solid #b3b3b3;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+  p {
+    font-weight: 600;
+    font-size: 16px;
+  }
+  ul {
+    padding-left: 10px;
+    li:hover {
+      background: #008080;
+      color: #fff;
+      cursor: pointer;
+    }
+    span {
+      display: inline-block;
+    }
+    .sp1 {
+      width: 120px;
+    }
+    .sp2 {
+      width: 50px;
+    }
+  }
+}
+
+.renwu {
+  display: flex;
+  .el-input {
+    width: 400px;
+    margin-right: 20px;
+  }
+}
+.demo-table-expand {
+  display: flex;
+  flex-wrap: wrap;
+  /* 允许换行 */
+  gap: 0px;
+  /* 子元素间距 */
+}
+
+.demo-table-expand .el-form-item {
+  flex: 1 1 100%;
+  /* 每个表单项占满一行 */
+  display: inline-flex;
+  /* 让每个项都在一行显示 */
+  margin-bottom: 0;
+  /* 去掉多余的底部边距 */
+}
+
+.demo-table-expand .el-form-item label {
+  width: 120px;
+  /* 可以根据需要调整标签宽度 */
+  margin-right: 10px;
+  /* 标签和内容的间距 */
+}
+
+.demo-table-expand .el-form-item span {
+  flex: 1;
+  /* 内容占满剩余空间 */
+}
+
+/* 确保 label 能根据内容换行 */
+.form-item {
+  display: flex;
+  /* 使用 Flexbox 布局 */
+  flex-wrap: wrap;
+  /* 允许换行 */
+  align-items: center;
+  /* 标签和内容在垂直方向上对齐 */
+}
+
+.form-item label {
+  white-space: normal;
+  /* 允许标签文本换行 */
+  word-wrap: break-word;
+  /* 自动断行 */
+  max-width: 150px;
+  /* 限制标签宽度,防止过长 */
+}
+
+.form-item span {
+  flex: 1;
+  /* 内容部分占满剩余空间 */
+  word-wrap: break-word;
+  /* 内容部分也允许换行 */
+  white-space: normal;
+  /* 内容部分的文本能自动换行 */
+}
+
+.scrollable-list {
+  height: 400px;
+  overflow-y: auto;
+  /* 其他样式 */
+}
+
+/* 自定义滚动条 */
+.scrollable-list::-webkit-scrollbar {
+  width: 8px; /* 设置滚动条的宽度 */
+}
+
+.scrollable-list::-webkit-scrollbar-track {
+  background: #f1f1f1; /* 设置滚动条轨道的背景颜色 */
+  border-radius: 4px;
+}
+
+.scrollable-list::-webkit-scrollbar-thumb {
+  background: #888; /* 设置滚动条滑块的颜色 */
+  border-radius: 4px;
+}
+
+.scrollable-list::-webkit-scrollbar-thumb:hover {
+  background: #555; /* 鼠标悬停时滑块的颜色 */
+}
+
+::v-deep .el-drawer__header > :first-child {
+  font-size: 18px;
+  font-weight: 800;
+  color: #000000;
+}
 </style>

+ 4 - 3
vue.config.js

@@ -64,9 +64,9 @@ module.exports = {
     proxy: {
       "/api": {
         // target: "http://192.168.5.4:16200", // 石月
-        target: "http://192.168.50.235:16200", // 内网
+        // target: "http://192.168.50.235:16200", // 内网
         // target: "http://192.168.5.15:16200",
-        // target: "http://106.120.102.238:16700", // 外网  16600   16700
+        target: "http://106.120.102.238:16700", // 外网16700  生产16600 
         // target: "http://10.96.137.5",
         changeOrigin: true,
         pathRewrite: {
@@ -85,7 +85,8 @@ module.exports = {
       "/ETLapi": {
         // target: "http://192.168.50.241:9001", // WZLapi 目标地址
         // target: "http://192.168.5.11:8001", // WZLapi 目标地址
-        target: "http://106.120.102.238:18080/ImportDataDev", //WTL外网目标地址
+        // target: "http://106.120.102.238:18080/ImportDataDev", //导数工具 
+        target: "http://106.120.102.238:18080/WindTransDev", //WTL外网目标地址
         changeOrigin: true,
         pathRewrite: {
           "^/ETLapi": "", // 去掉 /WZLapi 前缀