Przeglądaj źródła

Merge branch 'dev' of http://39.106.8.246:3003/web/ibms into dev

 Conflicts:
	src/api/scan/request.js
shaun-sheep 5 lat temu
rodzic
commit
e7c6d10cc9

+ 2 - 2
src/api/scan/httpUtil.js

@@ -32,7 +32,7 @@ function errorResponse(vm, response, err) {
 
 export default {
     getJson: function(url, data, success, failed, err) {
-        let ProjectId = storage.get("global_project_selected")
+        let ProjectId = localStorage.getItem("projectId")
         let userName = storage.get("user_name")
         let vm = this;
         fetch({ url: url, method: 'get', params: data, headers: {'ProjectId': ProjectId, 'Comming': 'adm' ,'Account': userName}}).then((response) => {
@@ -42,7 +42,7 @@ export default {
         });
     },
     postJson: function(url, data, success, failed, err) {
-        let ProjectId = storage.get("global_project_selected")
+        let ProjectId = localStorage.getItem("projectId")
         let userName = storage.get("user_name")
         let vm = this;
         fetch({ url: url, method: 'post', data: data, headers: {'ProjectId': ProjectId, 'Comming': 'adm' ,'Account': userName} }).then((response) => {

+ 1 - 2
src/api/scan/request.js

@@ -1,7 +1,6 @@
 import fetch from './fetch'
-import {api, baseUrl, business, physics, venders, zone} from './config.js'
+import { api, physics, business, venders, baseUrl, zone } from './config.js'
 import http from './httpUtil'
-
 let arithmetic = '/arithmetic'
 
 var Comming = 'revit'

+ 2 - 0
src/components/business_space/business/handsontable.vue

@@ -33,6 +33,7 @@
 import "@/assets/js/chosen.jquery.min";
 import tools from "@/utils/scan/tools";
 import "@/assets/js/handsontable-chosen-editor";
+import lStorage from '@/utils/localStorage'
 import myPagination from "@/components/common/myPagination";
 import addBusiness from "@/components/business_space/dialogs/addDialog/businessDialog"
 import showTools from "@/utils/handsontable/notShow"
@@ -251,6 +252,7 @@ export default {
     },
     getInfors(infos, row) {
       let val = this.hot.colToProp(row.col);
+      lStorage.set('screen_data', {path: this.$route.path, data: {RoomID: infos.RoomID, zone: this.zoneCode}})
       if (val == "point") {
         let query = {
           RoomID: infos.RoomID,

+ 11 - 4
src/components/business_space/newGraphy/graphy.vue

@@ -9,7 +9,7 @@
     <div class="canvas-box" v-show="FloorMap" v-loading="canvasLoading">
       <canvas id="floorCanvas" :width="canvasWidth" :height="canvasHeight" ref="canvas" tabindex="0"></canvas>
       <!-- 初始两个按钮 -->
-      <el-row class="buttons-box">
+      <el-row class="buttons-box" v-if="hidden">
         <div>
           <el-autocomplete popper-class="my-autocomplete" v-model="search" :fetch-suggestions="querySearch" placeholder="输入平面图中已有的业务空间名称进行查找"
             width="180px" @select="handleSelect">
@@ -22,7 +22,7 @@
             </template>
           </el-autocomplete>
         </div>
-        <div class="button-group">
+        <div class="button-group" v-if="hidden">
           <!-- 默认操作模式 -->
           <div v-show="type==1">
             <el-dropdown split-button type="primary" @click="editGraphy" @command="handleCommand">
@@ -56,12 +56,12 @@
             <el-button plain @click="cancelGraphy">取 消</el-button>
           </div>
         </div>
-        <div style="position: absolute;right: 0;">
+        <div style="position: absolute;right: 0;" v-if="hidden">
           <el-button type="text" @click="lookUnrelatBSpace(false)">未关联平面图的业务空间 {{num}} 条</el-button>
         </div>
       </el-row>
       <!-- 底部操作按钮 -->
-      <el-row class="canvas-actions-box">
+      <el-row class="canvas-actions-box" v-if="hidden">
         <canvasFun @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @divide="divide" @clearDivide="clearDivide" @undo="undo" @redo="redo"
           @changeAbsorb="changeAbsorb" @scale="scale" @groupSelect="groupSelect" :config="config" ref="canvasFun" @saveJson="saveJson"></canvasFun>
       </el-row>
@@ -146,13 +146,20 @@ export default {
       zoneList: [], // 业务空间-canvas图中
       groupCreateDialogVis: false, //批量创建业务空间弹窗
       groupCreateType: 1, //批量创建方式
+<<<<<<< HEAD
+      hidden: true
+=======
       zoneDisable: true, // 重新划分是否禁用
+>>>>>>> 37001d3372c630523546307a3029267b6cab6664
     }
   },
   computed: {
     ...mapGetters('layout', ['projectId'])
   },
   created() {
+    if(this.$route.name == "spaceLedger"){
+      this.hidden = false;
+    }
   },
   mounted() {
     this.canvasWidth = this.$refs.graphy.offsetWidth;

+ 12 - 4
src/components/business_space/newTables/eqToSpaceTable.vue

@@ -1,13 +1,13 @@
 <template>
   <div id="eqInSp">
-    <el-row>
+    <el-row v-if="hidden">
       <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
       <el-tooltip class="item" effect="dark" :content="`可前往“全部关系总览”中,按坐标计算${typeToTips[type]}`" placement="right">
         <el-button>按空间计算</el-button>
       </el-tooltip>
     </el-row>
     <div class="table-box">
-      <el-table :data="tableData" style="width: 100%" height="100%" v-loading="loading" :header-cell-style="headerStyle">
+      <el-table :data="tableData" style="width: 100%" height="100%" :header-cell-style="headerStyle"  v-loading="loading">
         <el-table-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
           <template slot-scope="scope">
             <div>
@@ -31,7 +31,7 @@
           </template>
         </el-table-column>
         <template slot="empty">
-          <div style="height: 60%;transform: translateY(50%);">
+          <div style="height: 60%;transform: translateY(50%);lineHeight:20px;">
             <i class="icon-wushuju iconfont"></i>
             可前往“全部关系总览”中,按坐标计算{{typeToTips[type]}}
           </div>
@@ -71,7 +71,9 @@ export default {
       typeToTips: {
         Equipment: '空间内的设备',
         EquipmentFor: '服务于空间的设备',
-      }
+      },
+      hidden: true,
+      loading: false
     };
   },
   props: {
@@ -80,6 +82,7 @@ export default {
   },
   created() {
     this.getTableData()
+    this.changeContentStyle();
   },
   methods: {
     // 删除关系
@@ -128,6 +131,7 @@ export default {
     },
     // 获取列表数据
     getTableData() {
+      this.loading = true;
       let pa = {
         data: {
           Filters: `RoomID='${this.params.RoomID}'`,
@@ -141,6 +145,7 @@ export default {
         zone: this.params.zone
       }
       queryZone(pa, res => {
+        this.loading = false;
         this.tableData = res.Content[0][this.type] || []
         this.tableData.map(t => {
           t.SpaceId = res.Content[0].RoomID
@@ -152,6 +157,9 @@ export default {
     add() {
       this.$refs.addEqDialog.floor = this.params.buildFloorSelectd;
       this.$refs.addEqDialog.showDialog()
+    },
+    changeContentStyle(){
+      this.$route.name == "spaceLedger"?this.hidden = false:this.hidden = true;
     }
   },
   watch: {

+ 14 - 5
src/components/business_space/newTables/syInSpaceTable.vue

@@ -1,6 +1,6 @@
 <template>
   <div id="eqInSp">
-    <el-row>
+    <el-row v-show="hidden">
       <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
       <el-tooltip class="item" effect="dark" :content="`可前往“全部关系总览”中,按坐标计算${typeToTips[type]}`" placement="right">
         <el-button>按空间计算</el-button>
@@ -24,7 +24,7 @@
           </template>
         </el-table-column>
         <template slot="empty">
-          <div style="height: 60%;transform: translateY(50%);">
+          <div style="height: 60%;transform: translateY(50%);lineHeight:20px;">
             <i class="icon-wushuju iconfont"></i>
             可前往“全部关系总览”中,按坐标计算{{typeToTips[type]}}
           </div>
@@ -61,7 +61,9 @@ export default {
       tableData: [], //列表数据
       typeToTips: {
         generalSystem: '空间内的系统',
-      }
+      },
+      hidden: true,
+      loading: false
     };
   },
   props: {
@@ -69,7 +71,8 @@ export default {
     type: {}
   },
   created() {
-    this.getTableData()
+    this.getTableData();
+    this.changeContentStyle();
   },
   methods: {
     // 删除关系
@@ -89,7 +92,7 @@ export default {
       })
     },
     // 删除关系
-    deleteSyInSpace(pa){
+    deleteSyInSpace(pa) {
       syInSpaceDelete(pa, res => {
         this.$message.success('删除成功');
         this.getTableData();
@@ -97,6 +100,7 @@ export default {
     },
     // 获取列表数据
     getTableData() {
+      this.loading = true;
       let pa = {
         data: {
           Cascade: [{ Name: "generalSystem" }],
@@ -105,6 +109,7 @@ export default {
         zone: this.params.zone
       }
       queryZone(pa, res => {
+        this.loading = false;
         this.tableData = res.Content[0].GeneralSystem || [];
         this.tableData.map(t => {
           t.SpaceId = res.Content[0].RoomID;
@@ -115,6 +120,10 @@ export default {
     // 添加系统
     add() {
       this.$refs.addSyDialog.showDialog()
+    },
+    changeContentStyle() {
+      // 在辅助屏不显示添加按钮,动态设置高度
+      this.$route.name == "spaceLedger" ? this.hidden = false : this.hidden = true;
     }
   },
   watch: {

+ 4 - 0
src/components/ledger/handsontables/system.vue

@@ -393,7 +393,11 @@ export default {
         columnSorting: true, //添加排序
         sortIndicator: true, //添加排序
         renderAllRows: true,
+<<<<<<< HEAD
+        observeChanges: false,
+=======
         // observeChanges: false, //启用observeChanges插件
+>>>>>>> 37001d3372c630523546307a3029267b6cab6664
         // colWidths: 200,
         autoColumnSize: true,
         language: "zh-CN",

+ 3 - 5
src/components/point/report/objectInstance.vue

@@ -38,9 +38,7 @@ import { SGraphyView } from "@saga-web/graphy/lib";
 import { LocationPointScene, DivideFloorScene } from "@saga-web/cad-engine"
 import { SColor } from "@saga-web/draw/lib";
 
-import {
-  getTabFunNumObjInstance, getEquipByEqID, getFloorMsgByFloorID, queryZone
-} from '@/api/scan/request'
+import { getTabFunNumObjInstance, queryEquip, floorQuery, queryZone } from '@/api/scan/request'
 
 export default {
   data() {
@@ -76,7 +74,7 @@ export default {
                 Filters: `EquipID='${item.TypeCode + this.projectId.substring(2) + item.ObjectID}'`
               }
               //获取设备信息
-              getEquipByEqID(pa, equipMsg => {
+              queryEquip(pa, equipMsg => {
                 if (equipMsg.Content[0] && equipMsg.Content[0].LocationJson && equipMsg.Content[0].FloorId) {
                   let canvasOption = {
                     /** 标记的id  */
@@ -124,7 +122,7 @@ export default {
       }
       let that = this;
       //获取楼层信息
-      getFloorMsgByFloorID(param, floorMsg => {
+      floorQuery(param, floorMsg => {
         //刷新canvas
         that.refreshCanvas = new Date().getTime();
         if (!that.views[key]) {

+ 6 - 1
src/components/point/report/tabFunNumOverview.vue

@@ -11,7 +11,7 @@
     </div>
     <!-- 数据表格 -->
     <div class="table-area">
-      <el-table :data="tableData" style="width: 100%" height="calc(100% - 32px)" v-loading="loading" :header-cell-style="headerStyle" >
+      <el-table :data="tableData" style="width: 100%" height="calc(100% - 32px)" v-loading="loading" :header-cell-style="headerStyle" @row-click="handleClickRow">
         <el-table-column prop='' label='' show-overflow-tooltip width="35" header-align='center'>
           <template slot-scope="scope">
             <el-tooltip v-if="scope.row.DataQuality!=0" content="已断数,请检查" effect="dark" placement="top">
@@ -86,6 +86,7 @@ import historyChart from './historyChart'
 import dataSource from './dataSource'
 import objectInstance from './objectInstance'
 import addTabFunNum from './addTabFunNum'
+import lStorage from '@/utils/localStorage'
 export default {
   data() {
     return {
@@ -127,6 +128,9 @@ export default {
         this.drawers[index].drawer = true;
       }
     },
+    handleClickRow(row,column,event){//点击表格行
+      lStorage.set('screen_data', {path: this.$route.path, data: {MeterFunc: row.MeterFunc, RelatedInstance: row.RelatedInstance}})
+    },
     //获取统计数据
     getOverViewList() {
       this.loading = true;
@@ -216,6 +220,7 @@ export default {
 }
 /deep/ .el-drawer__body {
   height: 90%;
+  overflow-y: auto;
 }
 /deep/ .el-table__body-wrapper tr:hover{
   .dialog-btn{

+ 105 - 0
src/components/screen/integrateresults/exampleList.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="example-list" v-loading="loading">
+    <el-scrollbar style="height:100%;" v-if="exampleList && exampleList.length && queryParams.RelatedInstance">
+      <div v-for="item in exampleList" :key="item.ObjectID" :class="{'example-item':true,'active':item.active}" @click="handleChangeExample(item)"
+        :title="`${item.ObjectLocalName}(${item.BuildLocalName?item.BuildLocalName:item.BuildId?item.BuildId:'未明确建筑'}-${item.FloorLocalName?item.FloorLocalName:item.FloorId?item.FloorId:'未明确建筑'})`">
+        <span>{{`${item.ObjectLocalName}(${item.BuildLocalName?item.BuildLocalName:item.BuildId?item.BuildId:'未明确建筑'}-${item.FloorLocalName?item.FloorLocalName:item.FloorId?item.FloorId:'未明确建筑'})`}}</span>
+      </div>
+    </el-scrollbar>
+    <div class="no-data" v-else>
+      <div class="position-icon">
+        <i class="icon-wushuju iconfont"></i>
+        数据暂无
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getTabFunNumObjInstance } from '@/api/scan/request'
+
+export default {
+  props: {
+    queryParams: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      exampleList: [],
+    }
+  },
+  methods:{
+    getExampleData() {
+      this.loading = true
+      if(this.queryParams.MeterFunc && this.queryParams.RelatedInstance){
+        getTabFunNumObjInstance({Filters: `MeterFuncid='${this.queryParams.MeterFunc}';Related='true'`}, res => {
+          this.loading = false
+          this.exampleList = res.Content.map(item => {
+            item.active = false
+            return item
+          })
+          if (this.exampleList.length) {
+            this.handleChangeExample(this.exampleList[0]);
+          }
+        })
+      } else {
+        this.loading = false
+      }
+    },
+    handleChangeExample(example) {
+      this.exampleList.map(item => {
+        example.ObjectID == item.ObjectID?item.active = true:item.active = false
+        return item
+      })
+      this.$emit('changeExample',example)
+    },
+  },
+  watch: {
+    'queryParams.MeterFunc': {
+      handler(newdata, olddata) {
+        this.exampleList = []
+        this.getExampleData()
+      },
+      immediate: true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.example-list{
+  height: 100%;
+  line-height: 48px;
+  .no-data{
+    height: 100%;
+    text-align: center;
+    box-sizing: border-box;
+    position: relative;
+    .position-icon{
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%,-50%);
+    }
+  }
+  /deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+  .example-item {
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    cursor: pointer;
+    span {
+      margin-left: 10px;
+    }
+  }
+  .example-item.active,
+  .example-item:hover {
+    background-color: #f5f7fa;
+    color: #000;
+  }
+}
+</style>

+ 67 - 0
src/components/screen/integrateresults/realtimeData.vue

@@ -0,0 +1,67 @@
+<template>
+  <div class="data-box" v-loading="loading">
+    <p class="meter-func">表号-功能号:{{queryParams.MeterFunc || '--'}}</p>
+    <p style="margin-top:17px;">当前读数:{{newData || '--'}}</p>
+    <p style="margin-bottom:17px;">最后获取时间:{{lastTime || '--'}}</p>
+  </div>
+</template>
+
+<script>
+import { getTabFunNumOverview } from '@/api/scan/request'
+
+export default {
+  props: {
+    queryParams: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      newData: '',
+      lastTime: '',
+    }
+  },
+  methods:{
+    getNewData() {
+      this.loading = true
+      if(this.queryParams.MeterFunc){
+        getTabFunNumOverview({MeterFunc: this.queryParams.MeterFunc}, res => {
+          this.loading = false
+          if(res.Content[0] && res.Content[0].Data){
+            let data = res.Content[0].Data
+            this.newData = data.Data==null?'':data.Data + (data.Unit?data.Unit:'')
+            this.lastTime = data.Time
+          }
+        })
+      } else {
+        this.loading = false
+      }
+    },
+  },
+  watch: {
+    'queryParams.MeterFunc': {
+      handler(newdata, olddata) {
+        this.newData = ''
+        this.lastTime = ''
+        this.getNewData()
+      },
+      immediate: true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+$borderColor: rgba(201, 201, 201, 1);
+.data-box{
+  border: 1px solid $borderColor;
+  .meter-func{
+    border-bottom: 1px solid $borderColor;
+  }
+  p{
+    line-height: 35px;
+    padding-left: 10px;
+  }
+}
+</style>

+ 27 - 2
src/framework/layout/PageHeader.vue

@@ -27,6 +27,9 @@
                 </el-dropdown-menu>
             </el-dropdown>
             <ul class="header-nav">
+                <li class="header-nav-Splitscreen">
+                    <a href="/splitScreen" target="_blank"><i class="el-icon-s-platform"></i></a>
+                </li>
                 <li class="header-nav-notification">
                     <message-sever></message-sever>
                 </li>
@@ -38,6 +41,7 @@
 import frameworkApi from '@/api/framework'
 import { mapGetters, mapMutations } from 'vuex'
 import MessageSever from '../components/messagesever/index'
+import lStorage from '@/utils/localStorage'
 export default {
     name: 'PageHeader',
     props: [],
@@ -72,7 +76,7 @@ export default {
         }
     },
     created() {
-        let cacheInfo = JSON.parse(localStorage.getItem('_sagacloud_admin_store_cacheInfo'))?JSON.parse(localStorage.getItem('_sagacloud_admin_store_cacheInfo')):{}
+        let cacheInfo = lStorage.get('cacheInfo')?lStorage.get('cacheInfo'):{}
         if(cacheInfo[this.userInfo.userName] && 
             cacheInfo[this.userInfo.userName].projectId && 
             this.projects.some((item) => {return item.id == cacheInfo[this.userInfo.userName].projectId})
@@ -87,4 +91,25 @@ export default {
         MessageSever
     }
 }
-</script>
+</script>
+<style lang="scss" scoped>
+.header-nav-Splitscreen>a{
+    display: flex;
+    width: 100%;
+    height: 100%;
+    position: relative;
+    padding: 16px 10px 10px;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    color: #79869a;
+    font-size: 24px;
+    text-decoration: none;
+    cursor: pointer;
+    i{transition:all 0ms ease 0ms}
+}
+.header-nav-Splitscreen>a:hover{
+    text-decoration: none;
+    color: #d3d8e2;
+    background-color: #3f4f62;
+}
+</style>

+ 6 - 3
src/framework/layout/layout-store.js

@@ -1,5 +1,6 @@
 import frameworkApi from '@/api/framework'
 import storage from '@/framework/utils/storage'
+import lStorage from '@/utils/localStorage'
 import axios from 'axios'
 import authutils from '../../utils/authutils'
 
@@ -61,22 +62,24 @@ export default {
         setSidebarSelected: (state, val) => {
             state.sidebarSelected = val
             storage.set(KEY_MENU_SELECTED, val)
+            lStorage.set('screen_data', { path: val, data: {} })
         },
         setprojectId: (state, val) => {
-            let cacheInfo = JSON.parse(localStorage.getItem('_sagacloud_admin_store_cacheInfo')) ? JSON.parse(localStorage.getItem('_sagacloud_admin_store_cacheInfo')) : {}
+            let cacheInfo = lStorage.get('cacheInfo') ? lStorage.get('cacheInfo') : {}
             state.projectId = val
             localStorage.setItem('projectId', val)
             if (cacheInfo[state.userInfo.userName]) {
                 cacheInfo[state.userInfo.userName].projectId = val
-                localStorage.setItem('_sagacloud_admin_store_cacheInfo', JSON.stringify(cacheInfo))
+                lStorage.set('cacheInfo', cacheInfo)
             } else {
                 cacheInfo[state.userInfo.userName] = { projectId: val }
-                localStorage.setItem('_sagacloud_admin_store_cacheInfo', JSON.stringify(cacheInfo))
+                lStorage.set('cacheInfo', cacheInfo)
             }
             storage.set(KEY_PROJECT_SELECTED, val)
             state.projects.map((item) => {
                 if (item.id == val) {
                     state.secret = item.pwd
+                    localStorage.setItem('secret', item.pwd)
                 }
             })
         }

+ 17 - 0
src/router/system.js

@@ -83,6 +83,11 @@ import overView from '@/views/relation/overview'
 /**  厂家库 */
 import supplier from '@/views/manufactor/supplier'
 
+/**  辅助屏 */
+import splitScreen from '@/views/screen/splitScreen'
+import spaceLedger from '@/views/screen/splitScreen/spaceledger'
+import integrateResults from '@/views/screen/splitScreen/integrateresults'
+
 /**  业务空间数据导入工具 */
 import dataUtil from '@/views/business_space/dataUtil/index'
 import dataUtil2 from '@/views/business_space/dataUtil/index2'
@@ -104,6 +109,17 @@ export default [{
     { path: '/auth', name: 'auth', component: auth },
     { path: '/noUser', name: 'noUser', component: noUser },
     // 业务空间数据导入工具
+<<<<<<< HEAD
+    { path: '/dataUtil', name: 'dataUtil', component: LayoutMain, children: [{ path: 'index', component: dataUtil }] },
+    // 辅助屏
+    {
+        path: '/splitScreen',
+        name: 'splitScreen',
+        component: splitScreen,
+        children: [
+            { path: 'spaceledger', name: 'spaceLedger', component: spaceLedger },
+            { path: 'integrateresults', name: 'integrateResults', component: integrateResults }
+=======
     {
         path: '/dataUtil',
         name: 'dataUtil',
@@ -111,6 +127,7 @@ export default [{
         children: [
             { path: 'index', component: dataUtil },
             { path: 'index2', component: dataUtil2 }
+>>>>>>> 37001d3372c630523546307a3029267b6cab6664
         ]
     },
     // 平台管理

+ 33 - 0
src/utils/localStorage.js

@@ -0,0 +1,33 @@
+const PREFIX = '_sagacloud_admin_store_'
+const loaclStorage = window.localStorage
+
+export default {
+    set(key, value, fn) {
+        let _value = null
+        try {
+            _value = JSON.stringify(value)
+        } catch (e) {
+            _value = value
+        }
+        loaclStorage.setItem(PREFIX + key, _value)
+        fn && fn()
+    },
+    get(key, fn) {
+        if (!key) {
+            return null
+        }
+        if (typeof key === 'object') {
+            throw new Error('key不能是一个对象。')
+        }
+        var _value = loaclStorage.getItem(PREFIX + key)
+        if (_value !== null) {
+            try {
+                return JSON.parse(_value)
+            } catch (e) {}
+        }
+        return _value
+    },
+    remove(key) {
+        loaclStorage.removeItem(PREFIX + key)
+    }
+}

+ 106 - 0
src/views/screen/splitscreen/index.vue

@@ -0,0 +1,106 @@
+<!--
+ * @Author: zhangyu
+ * @Date: 2019-11-05 15:36:21
+ * @Info: 
+ * @LastEditTime: 2019-11-14 15:46:27
+ -->
+<template>
+  <div id="screenBox">
+    <div class="mian-icon" v-show="$route.name == 'splitScreen'">
+      <div class="main-content">
+        <img src="@/assets/image/uncultivated.svg">
+        <h2>功能设计中。。。</h2>
+      </div>
+    </div>
+    <router-view v-show="$route.name != 'splitScreen'" class="screen-router"></router-view>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import lStorage from '@/utils/localStorage'
+
+export default {
+  data() {
+    return {
+      
+    }
+  },
+  created() {
+    lStorage.set('screen_data', {})
+  },
+  mounted() {
+    window.addEventListener("storage", event =>{
+      if(event.key == '_sagacloud_admin_store_screen_data'){
+        let data
+        try {
+          data = JSON.parse(event.newValue)
+        } catch (error) {
+          data = event.newValue
+        }
+        this.handleChangeRouter(data)
+      }
+    });
+  },
+  destroyed() {
+    window.removeEventListener("storage", event => {})
+    lStorage.remove('screen_data')
+  },
+  computed: {
+    ...mapGetters('layout', ['userInfo', 'projectId', 'projects', 'userId'])
+  },
+  methods:{
+    handleChangeRouter(data) {
+      console.log(data)
+      if(data.path && data.path == '/ledger/spacelist'){//业务空间台账
+        this.$router.push({
+          path:'/splitScreen/spaceledger',
+          query: data.data
+        })
+      } else if (data.path && data.path == '/point/report') {//系统集成成果管理
+        this.$router.push({
+          path:'/splitScreen/integrateresults',
+          query: data.data
+        })
+      } else {
+        this.$router.push({
+          path:'/splitScreen'
+        })
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+#screenBox{
+  width: 100%;
+  height: 100%;
+  .mian-icon{
+    width: 100%;
+    height: 100%;
+    text-align: center;
+    position: relative;
+    .main-content{
+      position: absolute;
+      top: 25%;
+      left: 50%;
+      transform: translate(-50%, 0);
+      h2{
+        text-align: center;
+        margin-top: 30px;
+      }
+    }
+  }
+  .screen-router{
+    display: flex;
+    flex-direction: column;
+    justify-content: flex-start;
+    padding: 10px;
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    overflow: hidden;
+  }
+}
+</style>

+ 282 - 0
src/views/screen/splitscreen/integrateresults/index.vue

@@ -0,0 +1,282 @@
+<!--
+ * @Author: zhangyu
+ * @Date: 2019-11-13 17:00:59
+ * @Info: 系统集成成果辅助屏
+ * @LastEditTime: 2019-11-27 17:33:10
+ -->
+<template>
+  <div>
+    <div class='page-bar'>
+      <el-breadcrumb separator='/'>
+      <el-breadcrumb-item>系统集成</el-breadcrumb-item>
+      <el-breadcrumb-item>系统集成成果管理</el-breadcrumb-item>                       
+      </el-breadcrumb>
+    </div>
+    <div class="page-content">
+      <div class="content-left">
+        <div class="data-box">
+          <realtime-data :queryParams="queryParams"></realtime-data>
+        </div>
+        <div class="example-box">
+          <example-list :queryParams="queryParams" @changeExample="handleChangeExample"></example-list>
+        </div>
+      </div>
+      <div class="content-right" id="cadBox" v-loading="loading">
+        <canvas v-show="drawCanvas" :height="cadHeight" :width="cadWidth" id="exampleCanvas" :k="refreshCanvas"></canvas>
+        <div v-show="drawCanvas" class="operate">
+          <canvasFun @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @scale="scale" @saveJson="saveJson" :config="config" ref="canvasFun"></canvasFun>
+        </div>
+        <div class="no-data" v-show="!drawCanvas">
+          <div class="position-icon">
+            <i class="icon-wushuju iconfont"></i>
+            数据暂无
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { SGraphyView } from "@saga-web/graphy/lib";
+import { LocationPointScene, DivideFloorScene } from "@saga-web/cad-engine";
+import { SColor } from "@saga-web/draw/lib";
+import { queryEquip, floorQuery, queryZone } from '@/api/scan/request';
+//组件
+import realtimeData from '@/components/screen/integrateresults/realtimeData';
+import exampleList from '@/components/screen/integrateresults/exampleList';
+import canvasFun from "@/components/business_space/newGraphy/canvasFun";
+
+export default {
+  components: {
+    realtimeData,
+    exampleList,
+    canvasFun
+  },
+  mounted() {
+    this.cadWidth = document.getElementById('cadBox').offsetWidth;
+    this.cadHeight = document.getElementById('cadBox').offsetHeight;
+  },
+  data() {
+    return {
+      queryParams: this.$route.query,
+      loading: false,
+      cadWidth: 800,
+      cadHeight: 600,
+      views: null,//canvas view
+      scenes: null,//canvas scene
+      refreshCanvas: '',//重载canvas组件
+      drawCanvas: false,//是否画canvas,
+      ObjectLocalName: '',//对象名称
+      config: {
+        isEdit: false
+      },
+    }
+  },
+  methods:{
+    handleChangeExample(example) {
+      //存在实例ID
+      if (example.ObjectID) {
+        this.ObjectLocalName = example.ObjectLocalName;
+        if (example.TypeCode == 'Eq' || example.TypeCode == 'Ec') {//设备或者组件
+          let pa = {
+            Filters: `EquipID='${example.TypeCode + localStorage.getItem('projectId').substring(2) + example.ObjectID}'`
+          }
+          //获取设备信息
+          queryEquip(pa, equipMsg => {
+            if (equipMsg.Content[0] && equipMsg.Content[0].LocationJson && equipMsg.Content[0].FloorId) {
+              let canvasOption = {
+                /** 标记的id  */
+                Id: equipMsg.Content[0].EquipID,
+                /** 标记的名称  */
+                Name: equipMsg.Content[0].EquipName,
+                /** X坐标 */
+                X: equipMsg.Content[0].LocationJson.X,
+                /** Y坐标 */
+                Y: -equipMsg.Content[0].LocationJson.Y
+              }
+              this.loadDataToInstanceByFloorID(equipMsg.Content[0].FloorId, example.TypeCode, canvasOption);
+            }
+          })
+        } else if (example.TypeCode == 'Sp') {//空间
+          let pa = {
+            data: {
+              Filters: `RoomID='${example.TypeCode + localStorage.getItem('projectId').substring(2) + example.ObjectID}'`
+            },
+            zone: example.SubTypeCode
+          }
+          //获取空间信息
+          queryZone(pa, zoneMsg => {
+            if (zoneMsg.Content[0] && zoneMsg.Content[0].Outline) {
+              let canvasOption = {
+                RoomLocalName: zoneMsg.Content[0].RoomLocalName,
+                OutLine: zoneMsg.Content[0].Outline,
+                RoomID: zoneMsg.Content[0].RoomID,
+                Color: new SColor('#F9C3C3')
+              }
+              this.loadDataToInstanceByFloorID(zoneMsg.Content[0].FloorId, example.TypeCode, canvasOption);
+            }
+          });
+        }
+      }
+    },
+    //通过floorid获取信息,后通过floormap获取数据后绘制canvas
+    loadDataToInstanceByFloorID(floorId, typecode, options) {
+      let param = {
+        Filters: `FloorId='${floorId}'`
+      }
+      //获取楼层信息
+      floorQuery(param, floorMsg => {
+        //刷新canvas
+        this.refreshCanvas = new Date().getTime();
+        if (!this.views) {
+          this.views = new SGraphyView('exampleCanvas')
+        }
+        this.views.scene = null;
+        this.scenes = null;
+        //类型
+        if (typecode == 'Eq' || typecode == 'Ec') {
+          this.scenes = new LocationPointScene();
+        }
+        else if (typecode == 'Sp') {
+          this.scenes = new DivideFloorScene();
+        }
+        if (floorMsg.Content[0] && floorMsg.Content[0].StructureInfo && floorMsg.Content[0].StructureInfo.FloorMap) {
+          this.loading = true;
+          //获取数据,并加载canvas
+          this.scenes.loadUrl(`/image-service/common/file_get?systemId=revit&key=${floorMsg.Content[0].StructureInfo.FloorMap}`).then(() => {
+            this.drawCanvas = true;
+            this.loading = false;
+            this.views.scene = this.scenes;
+            this.scenes.isSpaceSelectable = false;
+            if (typecode == 'Eq' || typecode == 'Ec') {
+              this.scenes.addMarker(options);
+            }
+            else if (typecode == 'Sp') {
+              this.scenes.addZone(options);
+            }
+            this.views.fitSceneToView();
+            if (this.$refs.canvasFun) {
+              this.views.maxScale = this.views.scale * 10;
+              this.views.minScale = this.views.scale;
+              this.$refs.canvasFun.everyScale = this.views.scale;
+            }
+          })
+        }
+        else{
+          this.loading = false;
+          this.drawCanvas = false;
+        }
+      });
+    },
+    // canvas 获取焦点
+    focus() {
+      document.getElementById('cadBox').focus()
+    },
+    // 工具栏操作
+    // 适配底图到窗口
+    fit() {
+      this.views.fitSceneToView()
+    },
+    // 保存为png
+    savePng() {
+      this.views.saveImage(`${this.ObjectLocalName}.png`, 'png');
+    },
+    // 保存为svg
+    saveSvg() {
+      this.views.saveSceneSvg(`${this.ObjectLocalName}.svg`, 6400, 4800);
+    },
+    saveJson() {
+      this.views.saveFloorJson(`${this.ObjectLocalName}.json`)
+    },
+    // 缩放
+    scale(val) {
+      if (!this.views) {
+        return;
+      }
+      let scale = this.views.scale;
+      this.views.scaleByPoint(val / scale, this.cadWidth / 2, this.cadHeight / 2);
+    }
+  },
+  watch: {
+    $route(to,from){
+      this.queryParams = this.$route.query;
+      this.ObjectLocalName = '';
+      this.drawCanvas = false;
+    },
+    "views.scale": {
+      handler(n) {
+        if (this.$refs.canvasFun) {
+          this.$refs.canvasFun.sliderVal = n * 10 / this.views.minScale;
+        }
+      }
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+$borderColor: rgba(201, 201, 201, 1);
+.page-bar{
+  flex-grow: 0;
+  flex-shrink: 0;
+  height: 24px;
+  padding: 0 10px;
+  margin-bottom: 10px;
+  border-bottom: 1px solid $borderColor;
+  /deep/ .el-breadcrumb {
+    font-size: 14px;
+  }
+}
+.page-content{
+  display: flex;
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-direction: row;
+  justify-content: flex-start;
+  overflow-y: auto;
+  .content-left{
+    display: flex;
+    flex-direction: column;
+    justify-content: flex-start;
+    width: 260px;
+    margin-right: 15px;
+    .data-box{
+      height: 140px;
+      margin-bottom: 15px;
+    }
+    .example-box{
+      flex-grow: 1;
+      flex-shrink: 1;
+      height: calc(100% - 160px);
+      border: 1px solid $borderColor;
+    }
+  }
+  .content-right{
+    flex-grow: 1;
+    flex-shrink: 1;
+    border: 1px solid $borderColor;
+    overflow: hidden;
+    position: relative;
+    .operate {
+      position: absolute;
+      left: 50%;
+      bottom: 20px;
+      transform: translateX(-50%);
+      z-index: 99;
+    }
+    .no-data{
+      height: 100%;
+      text-align: center;
+      box-sizing: border-box;
+      position: relative;
+      .position-icon{
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%,-50%);
+      }
+    }
+  }
+}
+</style>

+ 428 - 0
src/views/screen/splitscreen/spaceledger/index.vue

@@ -0,0 +1,428 @@
+
+<template>
+  <div class="box">
+    <el-container>
+      <el-header>
+        <div class="boxName">
+          第二屏详情
+        </div>
+        <div class="spaceName">
+          <b>空间名称:</b>{{spaceDetails.RoomLocalName?spaceDetails.RoomLocalName:"-"}}
+        </div>
+      </el-header>
+      <el-container>
+        <el-aside width="450px">
+          <el-scrollbar>
+            <div class="aside-top">
+              <div class="aside-top-left">
+                <p><b>空间功能区类型:</b>{{spaceDetails.RoomFuncType?spaceDetails.RoomFuncType:"-"}}</p>
+                <p><b>备注文字:</b>{{spaceDetails.Intro?spaceDetails.Intro:"-"}}</p>
+              </div>
+              <div class="aside-top-right">
+                <p><b>空间二维码:</b><span v-if="!spaceDetails.RoomQRCode">-</span></p>
+                <img :src="'/image-service/common/file_get/'+ spaceDetails.RoomQRCode +'?systemId=dataPlatform'" alt="二维码图片"
+                  v-if="spaceDetails.RoomQRCode">
+              </div>
+            </div>
+            <div v-show="spaceDetails.Outline && spaceDetails.Outline[0] && spaceDetails.Outline[0].length" id="graphy" ref="graphy"
+              style="width:400px;height:400px;" v-loading="canvasLoading">
+              <p><b>位置图片:</b></p>
+              <canvas id="floorCanvas" :width="canvasWidth" :height="canvasHeight" ref="canvas" tabindex="0"></canvas>
+            </div>
+            <div v-show="spaceDetails.Outline && !spaceDetails.Outline[0] || !spaceDetails.Outline"
+              style="height: 400px;transform: translateY(50%);textAlign:center;">
+              <i class="icon-wushuju iconfont"></i>
+              数据暂无
+            </div>
+            <div class="space-img" v-if="spaceDetails.Pic">
+              <div class="img-box" v-for="(item) in spaceDetails.Pic" :key='`${item.Id}+${item.key}`'>
+                <img :src="`/image-service/common/image_get?systemId=dataPlatform&key=${item.key}`" alt="空间图片">
+              </div>
+            </div>
+            <div class="space-img" v-if="!spaceDetails.Pic">
+              <div class="img-box">
+                <img src="https://hbimg.huabanimg.com/2787ad434fc2bc819a5d7deda3855d897a99d528ab4a-e3HRgR_fw658" alt="空间图片">
+              </div>
+              <div class="img-box">
+                <img src="https://hbimg.huabanimg.com/5e4e3239dc7eca56eb92ca612d49d824f022b13621d5a-Ga7voM_fw658" alt="空间图片">
+              </div>
+              <div class="img-box">
+                <img src="https://hbimg.huabanimg.com/60e2a25564f6ac13e7e16a19dcc3e194d565776231347-1Cw8dg_fw658" alt="空间图片">
+              </div>
+              <div class="img-box">
+                <img src="https://hbimg.huabanimg.com/2ea712954c75ff1b1e13329e7e4209f0691b88945c73-JCmkXX_fw658" alt="空间图片">
+              </div>
+            </div>
+          </el-scrollbar>
+        </el-aside>
+        <el-main style="height:100%">
+          <el-tabs v-model="activeTab" type='card'>
+            <template v-for="(item,index) in tabsList">
+              <el-tab-pane :name="item.Code" :key="index" :label="item.Name">
+                <div v-show="activeTab === 'staticData'" style="width:100%;height:100%;textAlign:left;" id="iframe-box">
+                  <!-- <iframe height="100%" width="100%" :src="iframeSrc" id="screenIframe"></iframe> -->
+                </div>
+                <div v-show="activeTab === 'dynamicData'" style="width:100%;height:100%;">
+                  <div class="content-box" style="height:100%;">
+                    <el-table ref="multipleTable" :data="tableData" stripe height="100%" :header-cell-style="headerStyle">
+                      <el-table-column prop="InfoPointName" label="信息点名称">
+                        <template slot-scope="scope">
+                          <div>
+                            <span>{{ scope.row.InfoPointName}}</span>
+                            <span class="unit">{{scope.row.Unit?`${"("+scope.row.Unit+")"}`:""}}</span>
+                          </div>
+                        </template>
+                      </el-table-column>
+                      <el-table-column prop="functionNo" label="表号功能号"></el-table-column>
+                      <el-table-column prop="functionNoDynamicData" label="动态数据"></el-table-column>
+                      <!-- 后台未提供,暂不显示 -->
+                      <!-- <el-table-column prop="LastUpdate" label="数据采集时间"></el-table-column> -->
+                      <template slot="empty">
+                        <div style="height: 60%;transform: translateY(50%);">
+                          <i class="icon-wushuju iconfont"></i>
+                          数据暂无
+                        </div>
+                      </template>
+                    </el-table>
+                  </div>
+                </div>
+                <div v-if="activeTab === 'objectRelationship'" class="objectRelationship" style="height:100%">
+                  <div class="objectRelationship-left">
+                    <h5>空间内设备:</h5>
+                    <eqToSpaceTable :params="params" type="Equipment"></eqToSpaceTable>
+                  </div>
+                  <div class="objectRelationship-center">
+                    <h5>服务于空间的设备:</h5>
+                    <eqToSpaceTable :params="params" type="EquipmentFor"></eqToSpaceTable>
+                  </div>
+                  <div class="objectRelationship-right">
+                    <h5>空间内系统:</h5>
+                    <syInSpaceTable :params="params" type="generalSystem"></syInSpaceTable>
+                  </div>
+                </div>
+              </el-tab-pane>
+            </template>
+          </el-tabs>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import { queryZone, getAllbusiness, getDataDictionary, floorQuery, buildingQuery, BeatchQueryParam } from '@/api/scan/request'
+import eqToSpaceTable from '@/components/business_space/newTables/eqToSpaceTable'
+import syInSpaceTable from '@/components/business_space/newTables/syInSpaceTable'
+import { DivideFloorScene, SpaceItem, ZoneItem, FloorView } from "@saga-web/cad-engine/lib";
+import tools from "@/utils/scan/tools";
+
+export default {
+  data() {
+    return {
+      tabsList: [
+        { Code: 'staticData', Name: '静态数据' },
+        { Code: 'dynamicData', Name: '动态数据' },
+        { Code: 'objectRelationship', Name: '对象关系' }
+      ],
+      activeTab: 'staticData',
+      checked: true,
+      spaceDetails: {},
+      iframeSrc: '',
+      proId: '',
+      params: {},
+      view: null,
+      scene: null,
+      canvasWidth: 410,
+      canvasHeight: 400,
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      tableData: [],
+      headerStyle: {// 列表样式
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      },
+      secret: '',
+      canvasLoading: false
+    }
+  },
+  components: {
+    eqToSpaceTable,
+    syInSpaceTable
+  },
+  beforeRouteEnter(to, from, next) {
+    if (to.query.RoomID && to.query.zone) {
+      next();
+    }
+  },
+  created() {
+    if (this.$route.name === "spaceLedger" && this.$route.query.RoomID && this.$route.query.zone) {
+      this.getData();
+    }
+    this.getInFormationPoitnName();
+  },
+  updated() { },
+  computed: {
+    ...mapGetters('layout', ['userId', 'projectId'])
+  },
+  methods: {
+    getData() {
+      this.params = this.$route.query;
+      // 获取空间数据
+      let params = {
+        data: {
+          Filters: `RoomID="${this.$route.query.RoomID}"`
+        },
+        zone: this.$route.query.zone
+      }
+      queryZone(params, res => {
+        this.spaceDetails = res.Content[0];
+        console.log(this.spaceDetails,333)
+        if (this.spaceDetails.Outline && this.spaceDetails.Outline[0] && this.spaceDetails.Outline[0].length) {
+          this.getSpaceFloor();
+        }
+        this.setFrame();
+        this.getInFormationPoitnName();
+      })
+    },
+    setFrame() {
+      // 设置静态数据tab的iframe地址
+      this.proId = localStorage.getItem('projectId');
+      this.secret = localStorage.getItem('secret');
+      this.iframeSrc = `${process.env.BASE_URL}:8889/#/details?perjectId=${this.proId}&secret=${this.secret}&FmId=${this.$route.query.RoomID}&type=0&code=${this.$route.query.zone}`
+      let box = document.getElementById('iframe-box');
+      box.innerHTML = '';
+      let iframe = document.createElement('iframe');
+      iframe.src = this.iframeSrc;
+      iframe.style.width = '100%';
+      iframe.style.height = '100%';
+      box.appendChild(iframe);
+    },
+    getSpaceFloor() {
+      // 获取业务空间楼层
+      let params = {
+        Filters: `FloorID='${this.spaceDetails.FloorId}'`
+      }
+      floorQuery(params, res => {
+        if (res.Content[0] && res.Content[0].StructureInfo && res.Content[0].StructureInfo.FloorMap) {
+          this.FloorMap = res.Content[0].StructureInfo.FloorMap;
+          this.getGraphy();
+        }
+      })
+    },
+    getGraphy() {// 绘制空间位置图片
+      let that = this;
+      that.clearGraphy()
+      that.scene = new DivideFloorScene();
+      this.canvasLoading = true;
+      that.scene.loadUrl(`/image-service/common/file_get?systemId=revit&key=${this.FloorMap}`).then(res => {
+        that.canvasLoading = false;
+        if (res == 'error') {
+          this.FloorMap = '';
+          this.$message.warning('数据解析异常');
+          return;
+        }
+        that.view.scene = that.scene;
+        that.view.fitSceneToView();
+        let tempArr = {
+          RoomLocalName: this.spaceDetails.RoomLocalName,
+          OutLine: this.spaceDetails.Outline,
+          RoomID: this.spaceDetails.RoomID,
+          Color: "#a384fc",
+        }
+        that.scene.addZoneList([tempArr]);
+        this.scene.isSpaceSelectable = false;
+      })
+    },
+    clearGraphy() {
+      if (this.view && this.view.scene) {
+        this.view.scene = null;
+        return
+      }
+      this.view = new FloorView('floorCanvas')
+    },
+    getInFormationPoitnName() {// 获取动态数据
+      let secret = localStorage.getItem('secret');
+      let params = {
+        data: {
+          Filters: 'InputMode in ["L1","L2","L","M"]',
+          Orders: "sort asc",
+          PageNumber: 1,
+          PageSize: 500
+        },
+        type: this.$route.query.zone
+      }
+      let param = {
+        secret: secret,
+        ProjId: this.projectId,
+        data: {
+          criterias: []
+        }
+      }
+      getDataDictionary(params, res => {// 获取表号功能号
+        this.tableData = res.Content;
+        this.tableData.map(item => {
+          let cur = tools.dataForKey(this.spaceDetails, item.Path);
+          item.functionNo = cur;
+          param.data.criterias.push({
+            id: this.spaceDetails.RoomID,
+            code: item.InfoPointCode
+          });
+        })
+        BeatchQueryParam(param, res => {// 获取动态数据
+          res.Content.map((item, index) => {
+            tools.setDataForKey(
+              this.spaceDetails,
+              this.tableData[index].Path,
+              this.tableData[index].functionNoDynamicData = item.error ? item.value ? "表号功能号格式错误" : "表号功能号不存在" : "暂未采集到实时数据"
+            );
+          })
+        });
+      })
+    }
+  },
+  watch: {
+    // 监听路由地址,并判断有RoomID和zone,重新请求空间数据
+    "$route"(to, from) {
+      if (this.$route.name === "spaceLedger" && this.$route.query.RoomID && this.$route.query.zone) {
+        this.getData();
+        this.activeTab = 'staticData';
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+#screenBox .screen-router[data-v-6c06ede0] {
+  padding: 0;
+}
+.el-header {
+  padding: 0;
+  height: 80px !important;
+  .boxName {
+    color: #fff;
+    font-size: 16px;
+    line-height: 50px;
+    height: 50px !important;
+    padding: 0 10px;
+    background-color: #3f4f62;
+  }
+  .spaceName {
+    font-size: 14px;
+    line-height: 30px;
+    margin: 0 10px;
+    border-bottom: 1px solid #e4e7ed;
+    box-sizing: border-box;
+  }
+}
+.el-aside {
+  color: #333;
+  border: 1px solid #e4e7ed;
+  margin: 10px 0 0 10px;
+  padding: 20px;
+  box-sizing: border-box;
+  height: calc(100% - 20px);
+  overflow: hidden;
+  .el-scrollbar {
+    height: 100%;
+    overflow: hidden !important;
+  }
+  .aside-top {
+    overflow: hidden;
+    display: flex;
+    .aside-top-left {
+      flex: 3;
+    }
+    .aside-top-right {
+      float: right;
+      img {
+        margin-left: -10px;
+        width: 140px;
+        height: 140px;
+      }
+    }
+  }
+  .space-img {
+    width: 100%;
+    overflow: hidden;
+    margin-top: 20px;
+    .img-box {
+      float: left;
+      position: relative;
+      width: 45%;
+      height: 180px;
+      margin: 20px 20px 0 0;
+      img {
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+        width: 100%;
+        height: 100%;
+      }
+    }
+  }
+}
+.el-scrollbar {
+  width: 430px;
+}
+.el-main {
+  color: #333;
+  text-align: center;
+  margin: -10px;
+  padding-bottom: 0;
+  overflow: hidden;
+  width: 100%
+}
+.el-tabs.el-tabs--card.el-tabs--top{
+  height: 100% !important;
+  width: 100%;
+}
+.objectRelationship {
+  height: 100%;
+  width: 100%;
+  display: flex;
+  .objectRelationship-left,
+  .objectRelationship-center,
+  .objectRelationship-right {
+    flex: 1;
+    margin-right: 10px;
+    text-align: left;
+    height: 100% !important;
+  }
+}
+#pane-dynamicData{
+  height: calc(100% - 10px);
+}
+.el-tab-pane{
+  height: 100%;
+}
+#pane-staticData {
+  height: 750px;
+  div {
+    height: 100%;
+  }
+}
+.unit {
+  color: rgb(167, 167, 167);
+}
+#floorCanvas {
+  position: static;
+}
+</style>
+<style>
+.el-scrollbar__wrap {
+  height: 100%;
+  overflow-x: hidden !important;
+  overflow-y: auto !important;
+}
+.el-tabs__content{
+  height: calc(100% - 47px) !important;
+}
+</style>