From 36e044280298d6f6b37b1295f9eba25584ef66a2 Mon Sep 17 00:00:00 2001
From: Gary Gu <garygu@Garydebijibendiannao.local>
Date: Wed, 28 May 2025 09:13:42 +0800
Subject: [PATCH] feat: 增加设备分类

---
 public/config.js            |   10 
 src/store/modules/common.js |   70 ++++---
 src/Dashboard.vue           |  241 +++++++++++++++---------------
 src/api/home.js             |   88 +++++++---
 src/components/Header.vue   |   42 ++++-
 vite.config.js              |    2 
 src/utils/getToken.js       |    4 
 src/views/EquipmentView.vue |   17 ++
 8 files changed, 278 insertions(+), 196 deletions(-)

diff --git a/public/config.js b/public/config.js
index 75a53f4..0567746 100644
--- a/public/config.js
+++ b/public/config.js
@@ -8,12 +8,12 @@
  */
 window.ProjectConfig = {
     // axiosBaseURL: "http://47.117.124.20:2002/",
-    axiosBaseURL: "http://8.140.54.245:5000",
+    axiosBaseURL: "http://101.201.155.10:4011",
     axiosTimeout: 1000 * 30, //毫秒
-    panoUrl: 'http://8.140.54.245:4010', // 全景预览地址
-    panoBaseUrl: 'http://8.140.54.245:5000', // 全景图及文档接口
-    modelUrl: 'http://8.140.54.245:4010/#/Home/sceneManagementDetail?shareUrlToken=AA82C10E34245412D8E276559C8582363A2CD38177A286C582C0471DC44FA5D836CAFB932F2C33B44201FE828EF6545397771FA675F7518619FAD578EB06FB6FA7671DFBEA34C32F8241C1EF1DDEA645', // 模型预览地址
+    panoUrl: 'http://101.201.155.10:4010', // 全景预览地址
+    panoBaseUrl: 'http://101.201.155.10:4011', // 全景图及文档接口
+    modelUrl: 'http://101.201.155.10:4010/#/Home/sceneManagementDetail?shareUrlToken=AA82C10E34245412D8E276559C8582363A2CD38177A286C582C0471DC44FA5D836CAFB932F2C33B44201FE828EF6545397771FA675F7518619FAD578EB06FB6FA7671DFBEA34C32F8241C1EF1DDEA645', // 模型预览地址
     sceneUrl: 'http://resources.vothing.com/mp4/12.mp4', // 实况地址
     projectId: 'de42bc0a-9a5a-4d43-877f-0ae980f905b2', // 项目id
-    xieTongIframeSrc: 'http://8.140.54.245:4010/#/', // BIMe地址
+    xieTongIframeSrc: 'http://101.201.155.10:4010/#/', // BIMe地址
 }
\ No newline at end of file
diff --git a/src/Dashboard.vue b/src/Dashboard.vue
index c920516..ef37b63 100644
--- a/src/Dashboard.vue
+++ b/src/Dashboard.vue
@@ -15,172 +15,171 @@
       backgroundImage: `url(${backgroundImage})`,
       backgroundRepeat: 'no-repeat',
       backgroundPosition: 'center center',
-      backgroundSize: 'cover'
+      backgroundSize: 'cover',
     }"
   >
     <!--头部-->
-    <app-header class="absolute z-[100] top-0 left-0 right-0" :selected-id="currentProjectId" @onHomeClick="switchView" />
-
-
+    <app-header class="absolute z-[100] top-0 left-0 right-0" :selected-id="currentProjectId" @onHomeClick="switchView" @onSelectChange="onSelectChange" />
 
     <!--页面内容-->
     <div class="content-wrapper px-[22px] py-[10px] absolute inset-0 top-[80px] flex gap-[20px]">
       <div class="flex-1 min-w-0">
         <!-- 左侧模块 -->
         <div class="w-full h-full">
-          <project-view v-if="isReady"/>
+          <project-view v-if="isReady" />
         </div>
       </div>
       <div class="flex-1 min-w-0">
         <!-- 中间模块 -->
         <div class="w-full h-full">
-          <equipment-view v-if="isReady"/>
+          <equipment-view :selected-id="selectedId" v-if="isReady" />
         </div>
       </div>
       <div class="w-[1080px]">
         <!-- 右侧模块 -->
         <div class="w-full h-full">
-          <Home v-if="isReady"/>
+          <Home v-if="isReady" />
         </div>
       </div>
     </div>
 
-<!--    <div class="absolute inset-0 top-[80px] flex" v-if="clickTab === 'xietong'">
+    <!--    <div class="absolute inset-0 top-[80px] flex" v-if="clickTab === 'xietong'">
       <iframe :src="iframeSrc" class="xieTongIframe" frameborder='0'></iframe>
     </div>-->
 
     <!--multiverse渲染容器
     <div id="renderDom" class="absolute z-[40] top-0 bottom-0 left-0 right-0 w-full h-full"></div>-->
-
-
   </main>
 </template>
 
 <script>
-import Vue from "vue";
-import { mapGetters } from "vuex";
-import Header from "./components/Header.vue";
-import Home from "./views/Home.vue";
-import ProjectView from "./views/ProjectView.vue";
-import { sceneJSON } from "./sceneJSON.js";
-import EquipmentView from "./views/EquipmentView.vue";
-import dayjs from "dayjs";
-import "dayjs/locale/zh-cn";
-import relativeTime from "dayjs/plugin/relativeTime";
-import { HomeAPI } from "./api/home";
-dayjs.locale("zh-cn");
-dayjs.extend(relativeTime);
-Vue.prototype.$dayjs = dayjs;
+  import Vue from "vue";
+  import { mapGetters } from "vuex";
+  import Header from "./components/Header.vue";
+  import Home from "./views/Home.vue";
+  import ProjectView from "./views/ProjectView.vue";
+  import { sceneJSON } from "./sceneJSON.js";
+  import EquipmentView from "./views/EquipmentView.vue";
+  import dayjs from "dayjs";
+  import "dayjs/locale/zh-cn";
+  import relativeTime from "dayjs/plugin/relativeTime";
+  import { HomeAPI } from "./api/home";
+  dayjs.locale("zh-cn");
+  dayjs.extend(relativeTime);
+  Vue.prototype.$dayjs = dayjs;
 
-import * as echarts from "echarts";
-Vue.prototype.$echarts = echarts;
+  import * as echarts from "echarts";
+  Vue.prototype.$echarts = echarts;
 
-import { nanoid } from "nanoid";
-Vue.prototype.$nanoid = nanoid;
+  import { nanoid } from "nanoid";
+  Vue.prototype.$nanoid = nanoid;
 
-export default {
-  name: "Dashboard",
-  components: {
-    "app-header": Header,
-    "Home": Home,
-    "project-view": ProjectView,
-    "equipment-view": EquipmentView  
-  },
-  data() {
-    return {
-      backgroundImage: new URL('@/assets/images/backgrounds/screen.png', import.meta.url).href,
-      currentProjectId: '1c179617-a7d9-4243-b813-84fa55a17ce7',
-      isReady: false,
-      clickTab:'home',
-      iframeSrc: window.ProjectConfig.xieTongIframeSrc
-    };
-  },
-  computed: {
-    ...mapGetters("common", [])
-  },
-  watch: {
-  },
-  mounted() {
-    this.getLoginInfo();
-  },
-  beforeDestroy() {
-    this.resetEngineRelated();
-  },
-  methods: {
-    /**
-     * 切换视图
-     * @param val
-     */
-    switchView(val){
-      switch (val){
-        case 'xietong':
-          window.open(window.ProjectConfig.xieTongIframeSrc, '_blank');
-          break;
-      }
+  export default {
+    name: "Dashboard",
+    components: {
+      "app-header": Header,
+      Home: Home,
+      "project-view": ProjectView,
+      "equipment-view": EquipmentView,
     },
-    //重置引擎相关的东西
-    resetEngineRelated() {
-      window.scene = window.underlay = null;
+    data() {
+      return {
+        backgroundImage: new URL("@/assets/images/backgrounds/screen.png", import.meta.url).href,
+        currentProjectId: "1c179617-a7d9-4243-b813-84fa55a17ce7",
+        isReady: false,
+        clickTab: "home",
+        iframeSrc: window.ProjectConfig.xieTongIframeSrc,
+        selectedId: "",
+      };
     },
-    //响应切换地图
-    onChangeMap(item) {
-      if (window.scene && window.underlay) {
-        const u = window.underlay;
-        const building = window.scene.findFeature("3DBuilding");
-        switch (item.id) {
-          case "pic": {
-            if (building) {
-              building.visible = false;
-            }
-            u.change("satellite"); //这样需要将本地资源放在工程内
-            // u.url = "http://multiverse.vothing.com/ref/style/satellite.json";
-            // // 加载显示底图
-            // u.load();
+    computed: {
+      ...mapGetters("common", []),
+    },
+    watch: {},
+    mounted() {
+      this.getLoginInfo();
+    },
+    beforeDestroy() {
+      this.resetEngineRelated();
+    },
+    methods: {
+      onSelectChange(val) {
+        this.selectedId = val;
+        console.log("onSelectChange", val);
+      },
+      /**
+       * 切换视图
+       * @param val
+       */
+      switchView(val) {
+        switch (val) {
+          case "xietong":
+            window.open(window.ProjectConfig.xieTongIframeSrc, "_blank");
             break;
-          }
-          case "gis": {
-            if (building) {
-              building.visible = true;
+        }
+      },
+      //重置引擎相关的东西
+      resetEngineRelated() {
+        window.scene = window.underlay = null;
+      },
+      //响应切换地图
+      onChangeMap(item) {
+        if (window.scene && window.underlay) {
+          const u = window.underlay;
+          const building = window.scene.findFeature("3DBuilding");
+          switch (item.id) {
+            case "pic": {
+              if (building) {
+                building.visible = false;
+              }
+              u.change("satellite"); //这样需要将本地资源放在工程内
+              // u.url = "http://multiverse.vothing.com/ref/style/satellite.json";
+              // // 加载显示底图
+              // u.load();
+              break;
             }
-            u.change("darkblue"); //这样需要将本地资源放在工程内
-            // u.url = "http://multiverse.vothing.com/ref/style/darkblue.json";
-            // // 加载显示底图
-            // u.load();
-            break;
+            case "gis": {
+              if (building) {
+                building.visible = true;
+              }
+              u.change("darkblue"); //这样需要将本地资源放在工程内
+              // u.url = "http://multiverse.vothing.com/ref/style/darkblue.json";
+              // // 加载显示底图
+              // u.load();
+              break;
+            }
           }
         }
-      }
-    },
-    getLoginInfo() {
-      this.isReady = true
-      const data = {
-        "UserName": "JSC",
-        "Password": "JSC@jsc123",
-        "IfSingleLogin": "",
-      }
-      HomeAPI.WhLogin(data).then(res => {
-        console.log(res);
-        if(res.Ret === 1) {
-          const result = res.Data
-          window.localStorage.setItem("token", result.token)
-          console.log(result);
-        }
-        
-      });
-    },
+      },
+      getLoginInfo() {
+        this.isReady = true;
+        const data = {
+          UserName: "JSC",
+          Password: "JSC@jsc123",
+          IfSingleLogin: "",
+        };
+        HomeAPI.WhLogin(data).then((res) => {
+          console.log(res);
+          if (res.Ret === 1) {
+            const result = res.Data;
+            window.localStorage.setItem("token", result.token);
+            console.log(result);
+          }
+        });
+      },
 
-    //设置字体颜色
-    cellStyle(row, _column, _rowIndex, _columnIndex) {
-      // console.log("row", row);
-      if (row.column.label === "状态" && row.row.status === "未处置") {
-        return "color:#EF424E";
-      }
+      //设置字体颜色
+      cellStyle(row, _column, _rowIndex, _columnIndex) {
+        // console.log("row", row);
+        if (row.column.label === "状态" && row.row.status === "未处置") {
+          return "color:#EF424E";
+        }
+      },
     },
-  },
-};
+  };
 </script>
 <style lang="scss" scoped>
-  .xieTongIframe{
+  .xieTongIframe {
     width: 100%;
     height: 100%;
   }
diff --git a/src/api/home.js b/src/api/home.js
index 71b94a3..50b0d63 100644
--- a/src/api/home.js
+++ b/src/api/home.js
@@ -8,34 +8,64 @@
  */
 import { http } from "../utils/http";
 export const HomeAPI = {
-    GetProject: (data) => {
-        return http.get("/api/User/Project/GetProject", {
-            params: data
-        });
-    },
+  GetProject: (data) => {
+    return http.get("/api/User/Project/GetProject", {
+      params: data,
+    });
+  },
 
-    WhLogin: (data, config = {}) => {
-        return http.post("/api/User/Home/WhLogin", data, config);
-    },
+  WhLogin: (data, config = {}) => {
+    return http.post("/api/User/Home/WhLogin", data, config);
+  },
 
-    GetParticipatingList: (data) => {
-        return http.get("/api/User/Home/GetParticipatingList", {
-            params: data
-        });
-    },
-    GetParticipatingNumber: (data) => {
-        return http.get("/api/User/Home/GetParticipatingNumber", {
-            params: data
-        });
-    },
-    GetProjectPanoramaList: (data) => {
-        return http.get("/api/Panorama/PanoramaFile/GetProjectPanoramaList", {
-            params: data
-        });
-    },
-    GetScenesByPbGuid: (data) => {
-        return http.get("/api/Panorama/PanoramaFile/GetScenesByPbGuid", {
-            params: data
-        });
-    }
-};
\ No newline at end of file
+  GetParticipatingList: (data) => {
+    return http.get("/api/User/Home/GetParticipatingList", {
+      params: data,
+    });
+  },
+  GetParticipatingNumber: (data) => {
+    return http.get("/api/User/Home/GetParticipatingNumber", {
+      params: data,
+    });
+  },
+  GetProjectPanoramaList: (data) => {
+    return http.get("/api/Panorama/PanoramaFile/GetProjectPanoramaList", {
+      params: data,
+    });
+  },
+  GetScenesByPbGuid: (data) => {
+    return http.get("/api/Panorama/PanoramaFile/GetScenesByPbGuid", {
+      params: data,
+    });
+  },
+  GetBindSelect: (data) => {
+    return http.get("/api/jsc/JSCManage/GetBindSelect", {
+      params: data,
+    });
+  },
+  GetDeviceType: (data) => {
+    return http.get("/api/jsc/JSCManage/GetDeviceType", {
+      params: data,
+    });
+  },
+  GetJSCDeviceState: (data) => {
+    return http.get("/api/jsc/JSCManage/GetJSCDeviceState", {
+      params: data,
+    });
+  },
+  GetJSCEnvMonitor: (data) => {
+    return http.get("/api/jsc/JSCManage/GetJSCEnvMonitor", {
+      params: data,
+    });
+  },
+  GetJSCProgress: (data) => {
+    return http.get("/api/jsc/JSCManage/GetJSCProgress", {
+      params: data,
+    });
+  },
+  GetJSCProjectMonitor: (data) => {
+    return http.get("/api/jsc/JSCManage/GetJSCProjectMonitor", {
+      params: data,
+    });
+  },
+};
diff --git a/src/components/Header.vue b/src/components/Header.vue
index 3fc3799..979b004 100644
--- a/src/components/Header.vue
+++ b/src/components/Header.vue
@@ -43,7 +43,7 @@
       </div>
       <div class="absolute top-0 right-0">
         <div class="flex items-center h-[80px] mr-[20px]">
-          <el-select v-model="projectSelected" placeholder="请选择" class="mr-[24px]">
+          <el-select v-model="bindSelected" placeholder="请选择" class="mr-[24px]" @change="handleSelect">
             <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
           <i
@@ -61,6 +61,9 @@
 </template>
 
 <script>
+  import { HomeAPI } from "@/api/home";
+  import { mapActions } from "vuex";
+
   export default {
     name: "AppHeader",
     components: {},
@@ -76,12 +79,8 @@
     },
     data() {
       return {
-        projectSelected: "",
-        options: [
-          { value: "project1", label: "项目1" },
-          { value: "project2", label: "项目2" },
-          { value: "project3", label: "项目3" },
-        ],
+        bindSelected: "",
+        options: [],
         activeTab: "home",
         currentTime: "",
         currentDate: "",
@@ -91,6 +90,7 @@
     },
     mounted() {
       this.updateTime();
+      this.getBinds();
       this.timer = setInterval(this.updateTime, 1000);
     },
     beforeDestroy() {
@@ -127,6 +127,32 @@
         const weekDay = weekDays[now.getDay()];
         this.currentDate = `${year}.${month}.${day} 星期${weekDay}`;
       },
+      /**
+       * 获取标段信息
+       */
+      getBinds() {
+        HomeAPI.GetBindSelect().then((res) => {
+          if (res.Ret === 1) {
+            const result = res.Data;
+            if (result.length > 0) {
+              this.options = result.map((item) => ({
+                value: item.Id,
+                label: item.BindName,
+              }));
+              this.bindSelected = this.options[0].value; // 默认选中第一个项目
+              this.handleSelect(this.bindSelected);
+            } else {
+              this.options = [];
+            }
+          }
+        });
+      },
+      /**
+       * 处理选择变化
+       */
+      handleSelect(val) {
+        this.$emit("onSelectChange", val);
+      },
     },
   };
 </script>
@@ -137,7 +163,7 @@
   ::v-deep(.el-select) {
     width: 160px;
     height: 28px;
-    background: rgba(33,72,115,0.9);
+    background: rgba(33, 72, 115, 0.9);
     border-radius: 2px;
     .el-input {
       align-items: center;
diff --git a/src/store/modules/common.js b/src/store/modules/common.js
index 45426ee..666f417 100644
--- a/src/store/modules/common.js
+++ b/src/store/modules/common.js
@@ -7,38 +7,46 @@
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  */
 export default {
-    namespaced: true,
-    state: () => ({
-        code: null, //用户信息
-        token: null, //token
-        projectEndDate: null, //项目结束日期
-    }),
+  namespaced: true,
+  state: () => ({
+    code: null, //用户信息
+    token: null, //token
+    projectEndDate: null, //项目结束日期
+    bindId: null,
+  }),
 
-    mutations: {
-        setCode(state, data) {
-            state.code = data;
-        },
-        setToken(state, data) {
-            state.token = data;
-        },
-        setProjectEndDate(state, data) {
-            state.projectEndDate = data;
-        },
+  mutations: {
+    setCode(state, data) {
+      state.code = data;
     },
-    actions: {
-        setCode(context, data) {
-            context.commit("setCode", data);
-        },
-        setToken(context, data) {
-            context.commit("setToken", data);
-        },
-        setProjectEndDate(context, data) {
-            context.commit("setProjectEndDate", data);
-        },
+    setToken(state, data) {
+      state.token = data;
     },
-    getters: {
-        code: (state) => state.code,
-        token: (state) => state.token,
-        projectEndDate: (state) => state.projectEndDate,
+    setProjectEndDate(state, data) {
+      state.projectEndDate = data;
     },
-};
\ No newline at end of file
+    setBindId(state, data) {
+      state.bindId = data;
+    },
+  },
+  actions: {
+    setCode(context, data) {
+      context.commit("setCode", data);
+    },
+    setToken(context, data) {
+      context.commit("setToken", data);
+    },
+    setProjectEndDate(context, data) {
+      context.commit("setProjectEndDate", data);
+    },
+    updateBindId({ commit }, data) {
+      commit("setBindId", data);
+    },
+  },
+  getters: {
+    code: (state) => state.code,
+    token: (state) => state.token,
+    projectEndDate: (state) => state.projectEndDate,
+    bindId: (state) => state.bindId,
+  },
+};
diff --git a/src/utils/getToken.js b/src/utils/getToken.js
index 9713fc6..5217589 100644
--- a/src/utils/getToken.js
+++ b/src/utils/getToken.js
@@ -14,4 +14,8 @@
 export const getProjectEndDate = () => {
     let endDate = store.getters["common/projectEndDate"];
     return endDate;
+}
+export const getBindId = () => {
+    let bindId = store.getters["common/bindId"];
+    return bindId;
 }
\ No newline at end of file
diff --git a/src/views/EquipmentView.vue b/src/views/EquipmentView.vue
index dd39b73..7b2233b 100644
--- a/src/views/EquipmentView.vue
+++ b/src/views/EquipmentView.vue
@@ -176,6 +176,12 @@
     components: {
       V2Echarts,
     },
+    props: {
+      selectedId: {
+        type: String,
+        default: "",
+      },
+    },
     data() {
       return {
         equipmentSelected: "",
@@ -496,6 +502,16 @@
         };
       },
     },
+    watch: {
+      selectedId: {
+        handler(newVal) {
+          console.log("设备界面接收到的数据:", newVal);
+          // 处理数据变化的逻辑
+        },
+        deep: true, // 深度监听对象内部变化
+        immediate: true, // 立即执行一次
+      },
+    },
     methods: {
       handleControlBtnClick(tab) {
         this.currentTab = tab;
@@ -749,5 +765,4 @@
   .progress-inner {
     display: none;
   }
-
 </style>
diff --git a/vite.config.js b/vite.config.js
index cee0dd3..b0162fb 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -52,7 +52,7 @@
             proxy: {
                 "^/api/": {
                     // target: "http://47.117.124.20:2002/",
-                    target: "http://8.140.54.245:5000/",
+                    target: "http://101.201.155.10:4011/",
                     rewrite: (path) => path.replace(/^\/api\//, ""),
                     changeOrigin: true, //通过浏览器查看像是"未生效",实际发送给后端的是更改过的Host(与target的host相同)
                 },

--
Gitblit v1.9.3