瀏覽代碼

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

LXXXY 5 年之前
父節點
當前提交
c04b6cc2ff
共有 39 個文件被更改,包括 2568 次插入367 次删除
  1. 4 4
      config/prod.env.js
  2. 1 1
      package.json
  3. 91 5
      src/api/scan/request.js
  4. 7 2
      src/components/business_space/business/handsontable.vue
  5. 32 1
      src/components/business_space/graphy/business.vue
  6. 16 2
      src/components/business_space/newAddDialogs/addEquipDialog.vue
  7. 10 5
      src/components/business_space/newGraphy/canvasFun.vue
  8. 37 10
      src/components/business_space/newGraphy/graphy.vue
  9. 178 0
      src/components/ledger/cenote/dialog/addCenoteDialog.vue
  10. 186 0
      src/components/ledger/cenote/dialog/addEquipDialog.vue
  11. 146 0
      src/components/ledger/cenote/dialog/addSystemDialog.vue
  12. 155 0
      src/components/ledger/cenote/table/cenoteTable.vue
  13. 143 0
      src/components/ledger/cenote/table/deviceTable.vue
  14. 145 0
      src/components/ledger/cenote/table/systemTable.vue
  15. 128 56
      src/components/ledger/handsontables/assets.vue
  16. 166 54
      src/components/ledger/handsontables/device.vue
  17. 49 4
      src/components/ledger/handsontables/system.vue
  18. 319 0
      src/components/ledger/lib/linkassets.vue
  19. 43 67
      src/components/model/file/floorTable.vue
  20. 5 2
      src/framework/layout/layout-store.js
  21. 15 1
      src/router/system.js
  22. 12 2
      src/utils/handsontable/fillterField.js
  23. 3 6
      src/utils/handsontable/notShow.js
  24. 140 0
      src/views/ledger/cenotelist/cenoteDetail/index.vue
  25. 6 6
      src/views/ledger/cenotelist/cenoteadd/index.vue
  26. 69 3
      src/views/ledger/cenotelist/index.vue
  27. 7 9
      src/views/ledger/facility/addfacility.vue
  28. 281 0
      src/views/ledger/facility/batchlink.vue
  29. 21 8
      src/views/ledger/facility/index.vue
  30. 37 12
      src/views/ledger/facility/partsmanage/index.vue
  31. 7 9
      src/views/ledger/property/addproperty.vue
  32. 54 5
      src/views/ledger/rentlist/index.vue
  33. 6 6
      src/views/ledger/rentlist/rentadd/index.vue
  34. 12 10
      src/views/ledger/spacelist/index.vue
  35. 7 9
      src/views/ledger/system/addsystem.vue
  36. 21 60
      src/views/model/file/index.vue
  37. 1 1
      src/views/point/dynamicdata/index.vue
  38. 1 1
      src/views/ready/buildfloor/addFloor/index.vue
  39. 7 6
      src/views/ready/buildfloor/drawGraphy/drawFloor.vue

+ 4 - 4
config/prod.env.js

@@ -1,8 +1,8 @@
 'use strict'
 module.exports = {
     NODE_ENV: '"production"',
-    // BASE_URL: '"http://192.168.20.215"', //测试iframe地址
-    // SSO_SERVER: '"http://192.168.20.102:8080"' //(新)测试环境
-    BASE_URL: '"http://mbi.sagacloud.cn"', //线上iframe地址
-    SSO_SERVER: '"http://sso.sagacloud.cn"'  //正式环境
+    BASE_URL: '"http://192.168.20.215"', //测试iframe地址
+    SSO_SERVER: '"http://192.168.20.102:8080"' //(新)测试环境
+    // BASE_URL: '"http://mbi.sagacloud.cn"', //线上iframe地址
+    // SSO_SERVER: '"http://sso.sagacloud.cn"'  //正式环境
 }

+ 1 - 1
package.json

@@ -24,7 +24,7 @@
         "vue-axios": "^2.1.4",
         "vue-router": "^3.0.1",
         "vuex": "^3.1.0",
-        "cad-engine": "2.0.231"
+        "cad-engine": "2.0.250"
     },
     "devDependencies": {
         "ajv": "^6.9.1",

+ 91 - 5
src/api/scan/request.js

@@ -735,6 +735,12 @@ export function getCenoteTableData(param, success) {
     http.postJson(url, param, success)
 }
 
+//查询竖井信息
+export function queryCenoteTableData(param, success) {
+    let url = `${baseUrl}/datacenter/shaft/query`
+    http.postJson(url, param, success)
+}
+
 //添加竖井信息
 export function createCenoteTableData(param, success) {
     let url = `${baseUrl}/datacenter/shaft/create`
@@ -943,6 +949,19 @@ export function queryEquip(param, success) {
     http.postJson(url, param, success)
 }
 
+//查询项目下的设备或部件-根据项目、建筑、楼层、设备或部件分类、业务空间实例筛选设备 然后通过计算匹配资产
+export function equipCategoryProperty(param, success) {
+    let url = `${baseUrl}/equip-component/equip-query/equip-category-property?category=${param.category}${param.spaceIdList?param.spaceIdList:''}`;
+    let data = param.data;
+    http.postJson(url, data, success)
+}
+
+//批量添加设备和资产的关系
+export function equipRproperty(param, success) {
+    let url = `${baseUrl}/equip-component/equip-query/equip-r-property`;
+    http.postJson(url, param, success)
+}
+
 //创建资产所需(Family族id3位编码)-根据设备类型(4位编码)或部件类型(6位编码)查询
 export function getEquipBelongs(param, success) {
     let url = `${baseUrl}/datacenter/data-dictionary/family-query`;
@@ -974,6 +993,12 @@ export function queryPartsDie(param, success) {
     http.postJson(url, param, success)
 }
 
+//查询项目下设备或部件的类别、以及名称
+export function TypePartsDie( success) {
+    let url = `${baseUrl}/equip-component/equip-query/equip-compon-category`;
+    http.getJson(url, {}, success)
+}
+
 //根据条件查询项目下设备部件数量
 export function countPartsDie(param, success) {
     let url = `${baseUrl}/equip-component/equip-query/count`;
@@ -1252,6 +1277,62 @@ export function floorUpdate(param, success) {
     let url = `${baseUrl}/datacenter/floor/update`;
     http.postJson(url, param, success)
 }
+
+/****关系-竖井****/
+//字典查询接口 竖井所有类型
+export function queryShaftType(success) {
+    let url = `${baseUrl}/datacenter/data-dictionary/query-shaft-type`;
+    http.getJson(url, {}, success)
+}
+//根据对象删除设备所在竖井关系,只针对一个对象
+export function eqinshUnlink(param, success) {
+    let url = `${baseUrl}/datacenter/eq-in-sh/unlink`;
+    http.postJson(url, param, success)
+}
+//根据对象删除系统所在竖井关系,只针对一个对象
+export function syinshUnlink(param, success) {
+    let url = `${baseUrl}/datacenter/sy-in-sh/unlink`;
+    http.postJson(url, param, success)
+}
+//根据对象删除竖井的贯通关系,只针对一个对象
+export function shthroughshUnlink(param, success) {
+    let url = `${baseUrl}/datacenter/sh-through-sh/unlink`;
+    http.postJson(url, param, success)
+}
+//查询没有和当前竖井绑定的设备
+export function unshaftInEq(param, success) {
+    let data = param.data
+    let url = `${baseUrl}/equip-component/shaft/unshaft-in-eq?shaftId=${param.shaftId}`;
+    http.postJson(url, data, success)
+}
+//查询没有和当前竖井贯通的其它竖井
+export function unshaftThroughShaft(param, success) {
+    let data = param.data
+    let url = `${baseUrl}/equip-component/shaft/unshaft-through-shaft?shaftId=${param.shaftId}`;
+    http.postJson(url, data, success)
+}
+//查询没有和当前竖井绑定的系统
+export function unshaftInSys(param, success) {
+    let data = param.data
+    let url = `${baseUrl}/equip-component/shaft/unshaft-in-sys?shaftId=${param.shaftId}`;
+    http.postJson(url, data, success)
+}
+//设备所在的竖井,竖井一对多,此方不会覆盖以前的记录,累计添加
+export function linkEqSh(param, success) {
+    let url = `${baseUrl}/datacenter/eq-in-sh/link-eq-sh`;
+    http.postJson(url, param, success)
+}
+//竖井的贯通,竖井一对多,此方法不会覆盖以前的记录
+export function linkShaft(param, success) {
+    let url = `${baseUrl}/datacenter/sh-through-sh/link-shaft`;
+    http.postJson(url, param, success)
+}
+//系统所在的竖井,竖井一对多,累计添加,此方法不会覆盖以前记录
+export function linkSySh(param, success) {
+    let url = `${baseUrl}/datacenter/sy-in-sh/link-sy-sh`;
+    http.postJson(url, param, success)
+}
+
 //关系-----设备所在业务空间--删除关系
 export function eqInSpaceDelete(param, success) {
     let url = `${baseUrl}/datacenter/eq-in-sp-base/unlink-list?type=${param.type}`;
@@ -1297,11 +1378,6 @@ export function notSyInSpaceQuery(param, success) {
     let url = `${baseUrl}/equip-component/space/unspace-in-sys?type=${param.type}&spaceId=${param.spaceId}`;
     http.postJson(url, param.data, success)
 }
-//关系-----业务空间和元空间关系(业务空间一对多,并且会覆盖之前记录)
-export function createRelateInZoneAndISp(param, success) {
-    let url = `${baseUrl}/datacenter/sp-in-si-zone-general/link-sp`;
-    http.postJson(url, param, success)
-}
 //关系-----空间内没有和空间关联的设备 根据坐标计算(专用接口)
 export function getEqNotInSpace(param, success) {
     let url = `${baseUrl}/equip-component/space/unspace-fIn-eq-point?spaceId=${param.spaceId}&type=${param.type}`;
@@ -1311,4 +1387,14 @@ export function getEqNotInSpace(param, success) {
 export function getEqNotForSpace(param, success) {
     let url = `${baseUrl}/equip-component/space/unspace-for-eq-point?spaceId=${param.spaceId}&type=${param.type}`;
     http.postJson(url, param.data, success)
+}
+//关系-----未关联业务空间的元空间
+export function getIspNotInSpace(param, success) {
+    let url = `${baseUrl}/equip-component/space/unspace-ispace?objectType=${param.objectType}`;
+    http.postJson(url, param.data, success)
+}
+//关系-----业务空间内的元空间,业务空间一对多,累计添加不会覆盖以前记录
+export function createRelateInZoneAndISp(param, success) {
+    let url = `${baseUrl}/datacenter/si-in-sp-base/link-si-sp?type=${param.type}`;
+    http.postJson(url, param.data, success)
 }

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

@@ -335,10 +335,15 @@ export default {
         },
         zone: this.zoneCode
       };
+      let keyList = [];
       //生成要修改字段列表
       change.map((item) => {
-        if (item[1] && param.data.Projection.indexOf(item[1]) == -1) {
-          param.data.Projection.push(item[1])
+        let key = item[1].split(".")[0]
+        if (item[1] && keyList.indexOf(key) == -1) {
+          keyList.push(key)
+        }
+        if (item[1] && item[3] == "" && param.data.Projection.indexOf(key) == -1) {
+          param.data.Projection.push(key)
         }
       })
       //生成对应修改数据

+ 32 - 1
src/components/business_space/graphy/business.vue

@@ -50,6 +50,7 @@
             <div class="div50">
             <el-button @click="clearDimension" plain>取 消</el-button>
             <el-button @click="bussinDea" type="primary">查看详情</el-button>
+            <el-button @click="clearRelation" type="primary">清除关系</el-button>
             </div>
         </div>
         <!-- 点击业务空间后点击元空间 -->
@@ -930,7 +931,7 @@
             saveChange() {
                 let id = ""
                 this.idList.map(item => {
-                    if (!!item.parentId) {
+                    if (item.parentId) {
                         id = item.parentId
                     }
                 })
@@ -1254,6 +1255,36 @@
                 Link.click();
                 // 然后移除
                 document.body.removeChild(Link);
+            },
+            // 清除按钮
+            clearRelation(){
+                let spaceid = this.idList[0].id
+                let param = {
+                    data: {
+                        criterias: [{
+                            to_id: spaceid, //选填
+                            graph_id: this.graphyId, //选填
+                            rel_type: this.spaceType.rel_type //选填
+                        }]
+                    },
+                    ProjId: this.projectId,
+                    secret: this.secret
+                };
+                this.loading.show = true;
+                deleteRelation(param).then(res => {
+                    if (res.data.Result == "success") {
+                        this.loading.show = false;
+                        this.$message.success('清除成功')
+                        this.idList = [];
+                        this.type = 1;
+                        this.getHasSpace();
+                    } else {
+                        this.$message.error(res.data.ResultMsg);
+                    }
+                })
+                .catch(() => {
+                    this.$message.error("请求失败");
+                });
             }
         },
         filters: {

+ 16 - 2
src/components/business_space/newAddDialogs/addEquipDialog.vue

@@ -119,9 +119,10 @@ export default {
           } else {
             t.Floor = []
           }
-          t.Floor.unshift({ BuildID: 'isNull', BuildLocalName: '未明确楼层' })
+          t.Floor.unshift({ BuildID: 'all', BuildLocalName: '全部' }, { BuildID: 'isNull', BuildLocalName: '未明确楼层' })
           return t;
         })
+        this.options.unshift({ BuildID: 'all', BuildLocalName: '全部' }, { BuildID: 'isNull', BuildLocalName: '未明确楼层' })
       })
     },
     // 显示弹窗
@@ -134,16 +135,29 @@ export default {
       let pa = {
         data: {
           Cascade: [{ Name: "equipCategory" }],
-          Filters: `BuildingId='${this.floor[0]}';FloorId='${this.floor[1]}'`,
+          Filters: '',
           PageNumber: this.page.pageNumber,
           PageSize: this.page.pageSize,
         },
         type: this.zone,
         spaceId: this.spaceId
       }
+      if (this.floor[0] == 'isNull') {
+        pa.data.Filters += `BuildingId isNull`
+      } else if (this.floor[0] && this.floor[0] != 'all') {
+        pa.data.Filters += `BuildingId='${this.floor[0]}'`
+      }
+      if (this.floor[1] == 'isNull') {
+        pa.data.Filters += `;FloorId isNull`
+      } else if (this.floor[1] && this.floor[1] != 'all') {
+        pa.data.Filters += `;FloorId='${this.floor[1]}'`
+      }
       if (this.keycode != '') {
         pa.data.Filters += `;EquipName contain "${this.keycode}" or EquipLocalName contain "${this.keycode}" or EquipLocalID contain "${this.keycode}"`
       }
+      if (pa.data.Filters == '') {
+        delete pa.data.Filters
+      }
       console.log(this.showType)
       if (this.showType) {
         if (this.type == "Equipment") {

+ 10 - 5
src/components/business_space/newGraphy/canvasFun.vue

@@ -31,7 +31,7 @@
       <i class="iconfont icon-narrow" @click="reduce"></i>
     </div>
     <div class="line">
-      <el-slider tooltip-class="tooltip-class" :min="min" :max="maxScale" v-model="sliderVal" :show-tooltip="false" @input="scale"></el-slider>
+      <el-slider tooltip-class="tooltip-class" :min="min" v-model="sliderVal" :show-tooltip="false" @input="scale"></el-slider>
     </div>
     <div>
       <i class="iconfont icon-zoom" @click="plus"></i>
@@ -42,10 +42,10 @@
 export default {
   data() {
     return {
-      sliderVal: 0.004, // 滑块值
+      sliderVal: 1, // 滑块值
       active: '',
-      min: 0.004,
-      maxScale: 1,
+      min: 1,
+      everyScale: 1, // 每份的放大倍数
     }
   },
   props: {
@@ -53,6 +53,9 @@ export default {
       default: false
     }
   },
+  computed:{
+
+  },
   methods: {
     // 移动画布
     moveCanvas() {
@@ -95,7 +98,9 @@ export default {
     },
     // 缩放
     scale(val) {
-      this.$emit('scale', val);
+      // 换算
+      let scale = val * this.everyScale / 10;
+      this.$emit('scale', scale);
     },
     // 加
     plus() {

+ 37 - 10
src/components/business_space/newGraphy/graphy.vue

@@ -77,6 +77,7 @@ import {
   queryZone,
   updateZone,
   createZone,
+  getIspNotInSpace,
   createRelateInZoneAndISp
 } from "@/api/scan/request"
 const colorArr = [
@@ -142,6 +143,8 @@ export default {
       this.getUnrelateCount();
       // 获取当前楼层的元空间
       this.getFloorISpace();
+      // 查询未关联业务空间的元空间
+      this.getISPSPUnrelaBSP()
     },
     // 获取当前楼层的元空间
     getFloorISpace() {
@@ -200,7 +203,16 @@ export default {
     },
     // 获取未绑定业务空间的元空间
     getISPSPUnrelaBSP() {
-
+      let pa = {
+        data: {
+          Filters: `FloorId='${this.buildFloor[1]}'`,
+          PageSize: 1000
+        },
+        objectType: this.tab.code
+      }
+      getIspNotInSpace(pa, res => {
+        console.log(res)
+      })
     },
     // 获取底图
     getGraphy() {
@@ -223,6 +235,9 @@ export default {
         that.scene.addZoneList(tempArr);
         that.scene.click(that, that.canvasClick)
         that.view.fitSceneToView();
+        that.view.maxScale = that.view.scale * 10;
+        that.view.minScale = that.view.scale;
+        that.$refs.canvasFun.everyScale = that.view.scale;
       })
     },
     // 获取当前分区下的业务空间
@@ -260,7 +275,6 @@ export default {
     },
     // canvas点击事件
     canvasClick(item, event) {
-      console.log(arguments)
       this.scene.setSpaceSelectable(true);
       this.scene.setZoneSelectable(true);
       if (this.type == 4) {
@@ -398,7 +412,7 @@ export default {
       let item = this.curZoneItem.data;
       this.$router.push({
         path: "/ledger/spaceDetail",
-        query: { RoomID: item.RoomID, zone: this.zoneCode, isMyTab: 1 }
+        query: { RoomID: item.RoomID, zone: this.tab.code, isMyTab: 1 }
       })
     },
     // 重新划分业务空间
@@ -419,12 +433,15 @@ export default {
         IspaceIdList.push(this.BIMIDToSID[t.data.SourceId])
       })
       zoneObj.RoomID = this.curZoneItem.data.RoomID;
+      if (!zoneObj.Outline.length) {
+        zoneObj.Outline = null;
+      }
       let pa = {
         zone: this.tab.code,
         data: {
-          Content: [zoneObj]
+          Content: [zoneObj],
+          Projection: ['Outline']
         },
-        Projection: ['Outline']
       }
       updateZone(pa, res => {
         this.relationInBSPandISP(zoneObj.RoomID, IspaceIdList)
@@ -432,7 +449,10 @@ export default {
     },
     // 更新业务空间和元空间的关系
     relationInBSPandISP(SpaceId, IspaceIdList) {
-      let pa = { SpaceId: SpaceId, IspaceIdList: IspaceIdList }
+      let pa = {
+        data: { SpaceId: SpaceId, IspaceIdList: IspaceIdList },
+        type: this.tab.code
+      }
       createRelateInZoneAndISp(pa, res => {
         this.$message.success('创建成功');
         this.init();
@@ -467,11 +487,11 @@ export default {
     },
     // 保存为png
     savePng() {
-      this.view.saveImage(`${this.floor}.png`, 'png');
+      this.view.saveImage(`${this.buildFloor[1]}.png`, 'png');
     },
     // 保存为svg
     saveSvg() {
-      this.view.saveSceneSvg(`${this.floor}.png`, 6400, 4800);
+      this.view.saveSceneSvg(`${this.buildFloor[1]}.svg`, 6400, 4800);
     },
     // 切割划分
     divide() {
@@ -489,8 +509,8 @@ export default {
     redo() { },
     // 缩放
     scale(val) {
-      // let scale = this.view.scale
-      // this.view.scaleByPoint(val / scale, this.cadWidth / 2, this.cadHeight / 2)
+      let scale = this.view.scale;
+      this.view.scaleByPoint(val / scale, this.canvasWidth / 2, this.canvasHeight / 2);
     },
   },
   filters: {
@@ -507,6 +527,13 @@ export default {
     projectId() {
       this.FloorMap = '';
       this.tab = {};
+    },
+    "view.scale": {
+      handler(n) {
+        if (this.$refs.canvasFun) {
+          this.$refs.canvasFun.sliderVal = n * 10 / this.view.minScale;
+        }
+      }
     }
   }
 }

+ 178 - 0
src/components/ledger/cenote/dialog/addCenoteDialog.vue

@@ -0,0 +1,178 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <el-row class="filters">
+      <el-col :span="9">
+        <el-input placeholder="输入竖井名称或竖井本地编码查询进行查询" v-model="keycode" clearable @keyup.enter.native="getTableData">
+          <i slot="suffix" class="el-input__icon el-icon-search" @click="getTableData"></i>
+        </el-input>
+      </el-col>
+      <el-col :span="15">
+        <cenote-type @change="changeCenote"></cenote-type>
+      </el-col>
+    </el-row>
+    <div class="table-box">
+      <el-table :data="tableData" style="width: 100%" height="350" v-loading="loading" :header-cell-style="headerStyle" ref="multipleTable"
+        @selection-change="handleSelectionChange">
+        <el-table-column  type="selection" width="55"></el-table-column>
+        <el-table-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.ShaftLocalName||scope.row.ShaftName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="ShaftLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="StructureInfo.ShaftFuncType" :label="`${inSpaceType}类`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-button size="mini" @click="toDetail(scope.$index, scope.row)" plain>查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 分页 -->
+      <el-pagination class="fr" v-show="tableData && tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="page.pageNumber" :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper"
+        :total="page.total"></el-pagination>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+      <el-button size="small" type="primary" @click="savaRelation">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { unshaftThroughShaft, queryShaftType, linkShaft } from "@/api/scan/request";
+import cenoteType from "@/components/ledger/lib/cenoteType";
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    cenoteType
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      title: "添加连通的其他竖井",
+      keycode: '', //输入查询条件
+      cenoteType: '', // 选中的竖井类型
+      shaftType: {}, //全部竖井类型
+      inSpaceType: '竖井',
+      dialogVisible: false,
+      tableData: [],
+      loading: false,
+      selections: [], // 选中项
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      } // 列表样式
+    };
+  },
+  props: {
+    type: String, //选中的tab页
+    params: Object //查看的竖井关系信息
+  },
+  created() { 
+    queryShaftType(res => {
+      res.Content.forEach(item => {
+        this.shaftType[item.Code] = item.Name
+      })
+    })
+  },
+  methods: {
+    //修改竖井类型
+    changeCenote(value) {
+      this.cenoteType = value.Id
+      this.getTableData()
+    },
+    // 显示弹窗
+    showDialog() {
+      this.dialogVisible = true
+      this.page.pageNumber = 1
+      this.getTableData()
+    },
+    getTableData() {
+      let params = {
+        data: {
+          Filters: this.cenoteType? `ProjectId='${this.projectId}';structureInfo.ShaftFuncType='${this.cenoteType}'`: `ProjectId='${this.projectId}'`,
+          Orders: "createTime desc, ShaftID asc",
+          PageNumber: this.page.pageNumber,
+          PageSize: this.page.pageSize,
+        },
+        shaftId: this.params.ShaftID
+      }
+      if(this.keycode!=''){
+        params.data.Filters += `;ShaftName contain '${this.keycode}' or ShaftLocalName contain '${this.keycode}' or ShaftLocalID contain '${this.keycode}'`
+      }
+      unshaftThroughShaft(params, res => {
+        this.tableData = res.Content
+        this.tableData.forEach(item => {
+          if(item.StructureInfo && item.StructureInfo.ShaftFuncType){
+            item.StructureInfo.ShaftFuncType = this.shaftType[item.StructureInfo.ShaftFuncType]
+          }
+        })
+        this.page.total = res.Total
+      })
+    },
+    //选中项修改
+    handleSelectionChange(val) {
+      this.selections = val;
+    },
+    savaRelation() {
+      if(this.selections.length){
+        let params = {
+          ShaftId: this.params.ShaftID,
+          ShaftOtherIdList: this.selections.map(item => {
+            return item.ShaftID
+          })
+        }
+        linkShaft(params, res => {
+          this.dialogVisible = false
+          this.$message.success('关联成功!')
+          this.$emit('refresh')
+        })
+      }else {
+        this.$message('请选择要关联的设备')
+      }
+    },
+    //改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    //改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 查看详情
+    toDetail() {
+      this.$message('开发中')
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+#addEqDialog {
+  .filters {
+    margin-bottom: 10px;
+    /deep/ .el-input__inner {
+      vertical-align: baseline;
+    }
+  }
+  .table-box {
+    height: 370px;
+    .fr{
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 186 - 0
src/components/ledger/cenote/dialog/addEquipDialog.vue

@@ -0,0 +1,186 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <el-row class="filters">
+      <el-col :span="9">
+        <el-input placeholder="输入设备名称或设备本地编码查询进行查询" v-model="keycode" clearable @keyup.enter.native="getTableData">
+          <i slot="suffix" class="el-input__icon el-icon-search" @click="getTableData"></i>
+        </el-input>
+      </el-col>
+      <el-col :span="15">
+        <floor-cascader @change="changeFloor"></floor-cascader>
+      </el-col>
+    </el-row>
+    <div class="table-box">
+      <el-table :data="tableData" style="width: 100%" height="350" v-loading="loading" :header-cell-style="headerStyle" ref="multipleTable"
+        @selection-change="handleSelectionChange">
+        <el-table-column  type="selection" width="55"></el-table-column>
+        <el-table-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.EquipLocalName||scope.row.EquipName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="EquipLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipCategory.EquipName" :label="`${inSpaceType}类`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="ShaftListName" label="已关联其他竖井" show-overflow-tooltip min-width="100" max-width="200"></el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-button size="mini" @click="toDetail(scope.$index, scope.row)" plain>查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 分页 -->
+      <el-pagination class="fr" v-show="tableData && tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="page.pageNumber" :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper"
+        :total="page.total"></el-pagination>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+      <el-button size="small" type="primary" @click="savaRelation">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { unshaftInEq, linkEqSh } from "@/api/scan/request";
+import floorCascader from "@/components/ledger/lib/floorCascader";
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    floorCascader
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      title: "添加竖井内的设备",
+      keycode: '', //输入查询条件
+      Buildfloor: ['all'], // 选中的建筑楼层
+      inSpaceType: '设备',
+      dialogVisible: false,
+      tableData: [],
+      loading: false,
+      selections: [], // 选中项
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      } // 列表样式
+    };
+  },
+  props: {
+    type: String, //选中的tab页
+    params: Object //查看的竖井关系信息
+  },
+  created() { },
+  methods: {
+    //修改建筑楼层
+    changeFloor(value) {
+      this.Buildfloor = value
+      this.getTableData()
+    },
+    // 显示弹窗
+    showDialog() {
+      this.dialogVisible = true
+      this.page.pageNumber = 1
+      this.getTableData()
+    },
+    getTableData() {
+      let params = {
+        data: {
+          Cascade: [{ Name: 'equipCategory' }, {Name: 'shaftList'}],
+          Filters:`not EquipID isNull`,
+          Orders: "createTime desc, EquipID desc",
+          PageNumber: this.page.pageNumber,
+          PageSize: this.page.pageSize,
+        },
+        shaftId: this.params.ShaftID
+      }
+      if (this.Buildfloor[0] == "noKnow") {
+        params.data.Filters += `;buildingId isNull`
+      } else if (this.Buildfloor[0] && this.Buildfloor[0] != "all") {
+        params.data.Filters += `;buildingId='${this.Buildfloor[0]}'`
+      }
+      if (this.Buildfloor[1] == "noKnow") {
+        params.data.Filters += `;floorId isNull`
+      } else if (this.Buildfloor[1] && this.Buildfloor[1] != "all") {
+        params.data.Filters += `;floorId='${this.Buildfloor[1]}'`
+      }
+      if(this.keycode!=''){
+        params.data.Filters += `;EquipName contain '${this.keycode}' or EquipLocalName contain '${this.keycode}' or EquipLocalID contain '${this.keycode}'`
+      }
+      unshaftInEq(params, res => {
+        res.Content.forEach(item => {
+          item.ShaftListName = ""
+          if(item.ShaftList && item.ShaftList.length){
+            item.ShaftListName = item.ShaftList.map(shaft => {
+              return shaft.ShaftLocalName?shaft.ShaftLocalName:shaft.ShaftName
+            }).join("、")
+          }
+        })
+        this.tableData = res.Content
+        this.page.total = res.Total
+      })
+    },
+    //选中项修改
+    handleSelectionChange(val) {
+      this.selections = val;
+    },
+    savaRelation() {
+      if(this.selections.length){
+        let params = {
+          ShaftId: this.params.ShaftID,
+          EquipIdList: this.selections.map(item => {
+            return item.EquipID
+          })
+        }
+        linkEqSh(params, res => {
+          this.dialogVisible = false
+          this.$message.success('关联成功!')
+          this.$emit('refresh')
+        })
+      }else {
+        this.$message('请选择要关联的设备')
+      }
+    },
+    //改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    //改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 查看详情
+    toDetail() {
+      this.$message('开发中')
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+#addEqDialog {
+  .filters {
+    margin-bottom: 10px;
+    /deep/ .el-input__inner {
+      vertical-align: baseline;
+    }
+  }
+  .table-box {
+    height: 370px;
+    .fr{
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 146 - 0
src/components/ledger/cenote/dialog/addSystemDialog.vue

@@ -0,0 +1,146 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <div class="table-box">
+      <el-table :data="tableData" style="width: 100%" height="350" v-loading="loading" :header-cell-style="headerStyle" ref="multipleTable"
+        @selection-change="handleSelectionChange">
+        <el-table-column  type="selection" width="55"></el-table-column>
+        <el-table-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.SysLocalName||scope.row.SysName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="SysLocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="CategoryNames.CategoryName" :label="`${inSpaceType}类`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-button size="mini" @click="toDetail(scope.$index, scope.row)" plain>查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 分页 -->
+      <el-pagination class="fr" v-show="tableData && tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="page.pageNumber" :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper"
+        :total="page.total"></el-pagination>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+      <el-button size="small" type="primary" @click="savaRelation">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { unshaftInSys, linkSySh } from "@/api/scan/request";
+import floorCascader from "@/components/ledger/lib/floorCascader";
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    floorCascader
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      title: "添加竖井内的系统",
+      inSpaceType: '系统',
+      dialogVisible: false,
+      tableData: [],
+      loading: false,
+      selections: [], // 选中项
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      } // 列表样式
+    };
+  },
+  props: {
+    type: String, //选中的tab页
+    params: Object //查看的竖井关系信息
+  },
+  created() { },
+  methods: {
+    // 显示弹窗
+    showDialog() {
+      this.dialogVisible = true
+      this.page.pageNumber = 1
+      this.getTableData()
+    },
+    getTableData() {
+      let params = {
+        data: {
+          Cascade: [{ Name: 'categoryNames' }],
+          Orders: "createTime desc, SysID desc",
+          PageNumber: this.page.pageNumber,
+          PageSize: this.page.pageSize,
+        },
+        shaftId: this.params.ShaftID
+      }
+      unshaftInSys(params, res => {
+        this.tableData = res.Content
+        this.page.total = res.Total
+      })
+    },
+    //选中项修改
+    handleSelectionChange(val) {
+      this.selections = val;
+    },
+    savaRelation() {
+      if(this.selections.length){
+        let params = {
+          ShaftId: this.params.ShaftID,
+          SysIdList: this.selections.map(item => {
+            return item.SysID
+          })
+        }
+        linkSySh(params, res => {
+          this.dialogVisible = false
+          this.$message.success('关联成功!')
+          this.$emit('refresh')
+        })
+      }else {
+        this.$message('请选择要关联的设备')
+      }
+    },
+    //改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    //改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 查看详情
+    toDetail() {
+      this.$message('开发中')
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+#addEqDialog {
+  .filters {
+    margin-bottom: 10px;
+    /deep/ .el-input__inner {
+      vertical-align: baseline;
+    }
+  }
+  .table-box {
+    height: 370px;
+    .fr{
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 155 - 0
src/components/ledger/cenote/table/cenoteTable.vue

@@ -0,0 +1,155 @@
+<template>
+  <div id="eqInSp">
+    <el-row>
+      <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
+      <el-tooltip class="item" effect="dark" content="可前往“全部关系总览”中计算连通的其它竖井" 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-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.ShaftLocalName||scope.row.ShaftName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="ShaftLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column :label="`${inSpaceType}类型`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.StructureInfo.ShaftFuncType}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-tooltip class="item" effect="dark" content="删除关系" placement="left">
+              <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain icon="el-icon-delete"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <template slot="empty">
+          <div style="height: 60%;transform: translateY(50%);">
+            <i class="icon-wushuju iconfont"></i>
+            可前往“全部关系总览”中计算连通的其它竖井
+          </div>
+        </template>
+      </el-table>
+    </div>
+    <!-- 添加设备弹窗 -->
+    <addCenoteDialog ref="addCenoteDialog" @refresh="getTableData" :type="type" :params="params"></addCenoteDialog>
+  </div>
+</template>
+
+<script>
+import { queryCenoteTableData, queryShaftType, shthroughshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addCenoteDialog from "@/components/ledger/cenote/dialog/addCenoteDialog"
+export default {
+  components: {
+    addCenoteDialog
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      inSpaceType: '竖井',
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      }, // 列表样式
+      loading: false, // loading
+      tableData: [], //列表数据
+      shaftType: {} //竖井类型
+    };
+  },
+  props: {
+    params: Object,
+    type: String
+  },
+  created() {
+    queryShaftType(res => {
+      res.Content.forEach(item => {
+        this.shaftType[item.Code] = item.Name
+      })
+      this.getTableData()
+    })
+  },
+  methods: {
+    // 获取列表数据
+    getTableData() {
+      let params = {
+        Filters: `ShaftID='${this.params.ShaftID}'`,
+        Cascade: [
+          {
+            Name: 'shaftThroughList'
+          }
+        ]
+      }
+      queryCenoteTableData(params, res => {
+        this.tableData = res.Content[0].ShaftThroughList || []
+        this.tableData.forEach(item => {
+          if(item.StructureInfo && item.StructureInfo.ShaftFuncType){
+            item.StructureInfo.ShaftFuncType = this.shaftType[item.StructureInfo.ShaftFuncType]
+          }
+        })
+      })
+    },
+    // 删除关系
+    handleDelete(index, row) {
+      this.$confirm("确认删除该关系?", "提示", {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let params = {
+          ShaftOtherId: row.ShaftID,
+          ShaftId: this.params.ShaftID
+        }
+        this.deleteShThroughSh(params);
+      }).catch(() => {
+        this.$message("取消删除")
+      })
+    },
+    // 删除设备所在空间关系
+    deleteShThroughSh(params) {
+      shthroughshUnlink(params, res => {
+        this.$message.success('删除成功')
+        this.getTableData()
+      })
+    },
+    // 改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    // 改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 添加设备
+    add() {
+      this.$refs.addCenoteDialog.showDialog()
+    }
+  },
+  watch: {
+    type() {
+      this.getTableData()
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#eqInSp {
+  height: 100%;
+  .table-box {
+    margin-top: 10px;
+    height: calc(100% - 50px);
+  }
+}
+</style>

+ 143 - 0
src/components/ledger/cenote/table/deviceTable.vue

@@ -0,0 +1,143 @@
+<template>
+  <div id="eqInSp">
+    <el-row>
+      <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
+      <el-tooltip class="item" effect="dark" content="可前往“全部关系总览”中计算竖井内设备" 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-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.EquipLocalName||scope.row.EquipName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="EquipLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column :label="`${inSpaceType}类型`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.EquipCategory.EquipName}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-button title="删除关系" size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain icon="el-icon-delete"></el-button>
+          </template>
+        </el-table-column>
+        <template slot="empty">
+          <div style="height: 60%;transform: translateY(50%);">
+            <i class="icon-wushuju iconfont"></i>
+            可前往“全部关系总览”中计算竖井内设备
+          </div>
+        </template>
+      </el-table>
+    </div>
+    <!-- 添加设备弹窗 -->
+    <addEquipDialog ref="addEqDialog" @refresh="getTableData" :type="type" :params="params"></addEquipDialog>
+  </div>
+</template>
+
+<script>
+import { queryCenoteTableData, eqinshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addEquipDialog from "@/components/ledger/cenote/dialog/addEquipDialog"
+export default {
+  components: {
+    addEquipDialog
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      inSpaceType: '设备',
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      }, // 列表样式
+      loading: false, // loading
+      tableData: [] //列表数据
+    };
+  },
+  props: {
+    params: Object,
+    type: String
+  },
+  created() {
+    this.getTableData()
+  },
+  methods: {
+    // 获取列表数据
+    getTableData() {
+      let params = {
+        Filters: `ShaftID='${this.params.ShaftID}'`,
+        Cascade: [
+          {
+            Name: 'equipmentList',
+            Cascade: [{ Name: 'equipCategory' }]
+          }
+        ]
+      }
+      queryCenoteTableData(params, res => {
+        this.tableData = res.Content[0].EquipmentList || []
+      })
+    },
+    // 删除关系
+    handleDelete(index, row) {
+      this.$confirm("确认删除该关系?", "提示", {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let params = {
+          EquipId: row.EquipID,
+          ShaftId: this.params.ShaftID
+        }
+        this.deleteEqInSh(params);
+      }).catch(() => {
+        this.$message("取消删除")
+      })
+    },
+    // 删除设备所在竖井关系
+    deleteEqInSh(params) {
+      eqinshUnlink(params, res => {
+        this.$message.success('删除成功')
+        this.getTableData()
+      })
+    },
+    // 改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    // 改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 添加设备
+    add() {
+      this.$refs.addEqDialog.showDialog()
+    }
+  },
+  watch: {
+    type() {
+      this.getTableData()
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#eqInSp {
+  height: 100%;
+  .table-box {
+    margin-top: 10px;
+    height: calc(100% - 50px);
+  }
+}
+</style>

+ 145 - 0
src/components/ledger/cenote/table/systemTable.vue

@@ -0,0 +1,145 @@
+<template>
+  <div id="eqInSp">
+    <el-row>
+      <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
+      <el-tooltip class="item" effect="dark" content="可前往“全部关系总览”中计算竖井内系统" 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-column :label="`${inSpaceType}名称`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.SysLocalName||scope.row.SysName||''}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="SysLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column :label="`${inSpaceType}类型`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            <div>
+              {{scope.row.CategoryNames.CategoryName}}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="action" label="操作" min-width="100">
+          <template slot-scope="scope">
+            <el-tooltip class="item" effect="dark" content="删除关系" placement="left">
+              <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain icon="el-icon-delete"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <template slot="empty">
+          <div style="height: 60%;transform: translateY(50%);">
+            <i class="icon-wushuju iconfont"></i>
+            可前往“全部关系总览”中计算竖井内系统
+          </div>
+        </template>
+      </el-table>
+    </div>
+    <!-- 添加设备弹窗 -->
+    <addSystemDialog ref="addEqDialog" @refresh="getTableData" :type="type" :params="params"></addSystemDialog>
+  </div>
+</template>
+
+<script>
+import { queryCenoteTableData, syinshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addSystemDialog from "@/components/ledger/cenote/dialog/addSystemDialog"
+export default {
+  components: {
+    addSystemDialog
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      inSpaceType: '系统',
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      }, // 列表样式
+      loading: false, // loading
+      tableData: [] //列表数据
+    };
+  },
+  props: {
+    params: Object,
+    type: String
+  },
+  created() {
+    this.getTableData()
+  },
+  methods: {
+    // 获取列表数据
+    getTableData() {
+      let params = {
+        Filters: `ShaftID='${this.params.ShaftID}'`,
+        Cascade: [
+          {
+            Name: 'systemList',
+            Cascade: [{ Name: 'categoryNames' }]
+          }
+        ]
+      }
+      queryCenoteTableData(params, res => {
+        this.tableData = res.Content[0].SystemList || []
+      })
+    },
+    // 删除关系
+    handleDelete(index, row) {
+      this.$confirm("确认删除该关系?", "提示", {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let params = {
+          SysId: row.SysID,
+          ShaftId: this.params.ShaftID
+        }
+        this.deleteSyInSh(params);
+      }).catch(() => {
+        this.$message("取消删除")
+      })
+    },
+    // 删除系统所在竖井关系
+    deleteSyInSh(params) {
+      syinshUnlink(params, res => {
+        this.$message.success('删除成功')
+        this.getTableData()
+      })
+    },
+    // 改变pagesize
+    handleSizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+      this.getTableData();
+    },
+    // 改变pageno
+    handleCurrentChange(pageNo) {
+      this.page.pageNumber = pageNo;
+      this.getTableData();
+    },
+    // 添加设备
+    add() {
+      this.$refs.addEqDialog.showDialog()
+    }
+  },
+  watch: {
+    type() {
+      this.getTableData()
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#eqInSp {
+  height: 100%;
+  .table-box {
+    margin-top: 10px;
+    height: calc(100% - 50px);
+  }
+}
+</style>

+ 128 - 56
src/components/ledger/handsontables/assets.vue

@@ -22,32 +22,47 @@
     <supply-dialog @change="supplyChange" ref="supply" :id="id" :dialog="myDialog"></supply-dialog>
     <supplier-dialog ref="supplier" @changeSupplier="supplierChange" :dialog="myDialog"></supplier-dialog>
     <guarantee-dialog @change="guaranteeChange" :id="id" ref="guarantee" :dialog="myDialog"></guarantee-dialog>
-    <upload-files-dialog :read="onlyRead ? true : false" ref="upload" @changeFile="fileChange" :keysArr="filesArr" :dialog="myDialog" ></upload-files-dialog>
-    <upload-img-dialog :read="onlyRead ? true : false" @changeFile="imgChange" :keysArr="imgsArr" :dialog="myDialog" ></upload-img-dialog>
+    <upload-files-dialog :read="onlyRead ? true : false" ref="upload" @changeFile="fileChange" :keysArr="filesArr" :dialog="myDialog">
+    </upload-files-dialog>
+    <upload-img-dialog :read="onlyRead ? true : false" @changeFile="imgChange" :keysArr="imgsArr" :dialog="myDialog"></upload-img-dialog>
     <maintainer-dialog @changeMaintainer="changeMaintainer" ref="maintainer" :dialog="myDialog"></maintainer-dialog>
     <insurer-dialog @changeInsurer="changeInsurer" ref="insurer" :dialog="myDialog"></insurer-dialog>
-    <pic-dialog :read="onlyRead ? true : false" :dialog="myDialog" :keysArr="picsArr" @change="changePics" ></pic-dialog>
+    <pic-dialog :read="onlyRead ? true : false" :dialog="myDialog" :keysArr="picsArr" @change="changePics"></pic-dialog>
     <div class="center middle_sty" style="height: 91%" v-show="!mess.deviceId && (!tableData || !tableData.length)">
-        <p>
-          <i class="icon-wushuju iconfont"></i>
+      <p>
+        <i class="icon-wushuju iconfont"></i>
         请选择设备族
-        </p>
+      </p>
     </div>
     <div class="center middle_sty" style="height: 91%" v-show="mess.deviceId && (!tableData || !tableData.length)">
-        <p>
-          <i class="icon-wushuju iconfont"></i>
+      <p>
+        <i class="icon-wushuju iconfont"></i>
         暂无数据
-        </p>
+      </p>
     </div>
     <div v-show="mess.deviceId && tableData && tableData.length" v-loading="loading" id="handsontable" ref="handsontable"></div>
     <div v-show="tableData && tableData.length" class='right'>
-        <my-pagination @change="getTableData" :page="page"></my-pagination>
+      <my-pagination @change="getTableData" :page="page"></my-pagination>
     </div>
     <!-- <dialog-assets :assetType="[this.mess.deviceId]"  @close="closeDialog" ref="assets" v-if="myDialog.addDevice" :dialog="myDialog" ></dialog-assets> -->
     <details-dialog :iframeSrc="iframeSrc" v-if="myDialog.details" :dialog="myDialog"></details-dialog>
     <look-pic :dialog="myDialog" :keysArr="picsArr"></look-pic>
+    <!-- 不支持的输入方式 -->
+    <el-dialog title="临时维护信息点" :visible.sync="myDialog.update" @close="handleCloseUpdate" width="670px">
+      <el-row>
+        该信息点未定义对应组件,现在维护数据不确定后续是否可用。如确实需要维护,请点击<el-link @click="updateInputShow = true" type="primary" :underline="false">继续维护</el-link>。
+      </el-row>
+      <el-row style="margin-top:20px;" v-show="updateInputShow">
+        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8}" placeholder="请输入内容" v-model="updateInput"></el-input>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="myDialog.update = false">取 消</el-button>
+        <el-button type="primary" @click="handleClickUpdate">确 认</el-button>
+      </span>
+    </el-dialog>
     <!-- 新增资产 -->
-    <el-dialog class="add-assets" :title="showAddByDie?'未关联资产的设备批量创建资产':'确定新增资产类型'" @close="showAddByDie = false" :visible.sync="myDialog.addDevice" width="670px">
+    <el-dialog class="add-assets" :title="showAddByDie?'未关联资产的设备批量创建资产':'确定新增资产类型'" @close="showAddByDie = false" :visible.sync="myDialog.addDevice"
+      width="670px">
       <el-row>
         <my-cascader v-show="!showAddByDie" ref="cascader" :all="true" @change="changeCader"></my-cascader>
         <die-cascader v-show="showAddByDie" ref="dieCascader" :Family="addData.Family" @change="changeDevice"></die-cascader>
@@ -123,7 +138,7 @@ export default {
     buildFloor.getData(this.buildFloorData)
   },
   computed: {
-    ...mapGetters("layout", [ "projectId", "secret", "userId" ]),
+    ...mapGetters("layout", ["projectId", "secret", "userId"]),
     showTypes() {
       return this.onlyRead ?
         [{ value: "Visible", label: '只看采集信息' }, { value: "all", label: '全部' }] :
@@ -165,6 +180,7 @@ export default {
         details: false,//详情页
         changeRea: false,//关联资产
         lookPic: false,//图片查看
+        update: false,//临时维护信息点
       },
       row: null, //被修改的row
       filesArr: [], //保存临时的文件key
@@ -177,7 +193,7 @@ export default {
       iframeSrc: "",
       id: 0,
       onlyRead: true,
-      showType: 'all',
+      showType: 'Visible',
       linkNameFalg: false,
       qrcodeUrl: "", //二维码图片地址
       loading: false,
@@ -187,12 +203,18 @@ export default {
       showAddByDie: false,//是否显示通过设备添加资产页面
       addData: {}, //添加资产选择的资产类型
       numParams: { // 查询设备部件数量条件
-        category:'',
-        buildId:'',
-        floorId:'',
-        Family:''
+        category: '',
+        buildId: '',
+        floorId: '',
+        Family: ''
       },
-      dieNum: 0 // 查询设备部件数量
+      dieNum: 0, // 查询设备部件数量
+      inputMap: {
+        flowBuild: 'D1'
+      }, //信息点和输入方式映射表
+      updateInputShow: false, //是否显示临时维护输入框
+      updateInfoPoint: '',//临时维护信息点
+      updateInput: '', //临时维护信息点值
     };
   },
   methods: {
@@ -211,6 +233,11 @@ export default {
         };
         getDataDictionary(params, res => {
           this.tableHeader = res.Content;
+          this.tableHeader.forEach(item => {
+            if(item.Path && item.InputMode){
+              this.inputMap[item.Path] = item.InputMode
+            }
+          })
           this.getTableData()
         });
       }
@@ -381,7 +408,7 @@ export default {
       let param = this.formatFilter()
       createPropertys(param, res => {
         this.myDialog.addDevice = false
-        this.$emit('getJson',{code: this.numParams.Family})
+        this.$emit('getJson', { code: this.numParams.Family })
         this.$message.success("创建成功!")
       })
     },
@@ -401,7 +428,7 @@ export default {
     },
     //选择设备类型-添加资产
     changeCader(val) {
-      if(val.code && val.facility){
+      if (val.code && val.facility) {
         this.addData.Family = val.code
         this.addData.name = val.facility
         this.numParams.Family = val.code
@@ -409,7 +436,7 @@ export default {
     },
     //选择设备或部件
     changeDevice(val) {
-      if(val.code) {
+      if (val.code) {
         this.numParams.category = val.code
       } else {
         this.numParams.category = ''
@@ -602,7 +629,7 @@ export default {
     async removeDevice(param) {
       await deleteProperty(param, res => {
         this.$message.success("删除成功")
-        this.$emit('getJson','')
+        this.$emit('getJson', '')
         this.getTableData()
       })
     },
@@ -616,8 +643,8 @@ export default {
       change.map(item => {
         let key = item[1].split(".")[0]
         if (key == "flowBuild" && keyList.indexOf(key) == -1) {
-          keyList.push("BuildingId","FloorId")
-          param.Projection.push("BuildingId","FloorId")
+          keyList.push("BuildingId", "FloorId")
+          param.Projection.push("BuildingId", "FloorId")
         }
         if (item[1] && keyList.indexOf(key) == -1) {
           keyList.push(key)
@@ -675,6 +702,7 @@ export default {
     //获取到了正确的信息
     getInfors(infos, row, el) {
       let val = this.hot.colToProp(row.col);
+      let inputMode = this.inputMap[val];
       this.row = row.row;
       this.messKey = val;
       switch (val) {
@@ -682,7 +710,7 @@ export default {
         case 'caozuo':
           // window.open(`http://adm.sagacloud.cn:8058/spread?id=${infos.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
           this.$message("开发中...")
-          break;
+          return false
         //资产二维码图片
         case 'EquipQRCode':
           this.qrcodeUrl = this.tableData[row.row].EquipQRCode;
@@ -691,7 +719,7 @@ export default {
           } else {
             this.$message("此资产没有资产二维码");
           }
-          break;
+          return false
         //关联系统
         case 'LinkSystem':
           if (!this.onlyRead) {
@@ -699,37 +727,37 @@ export default {
             this.systemList = this.tableData[row.row].LinkSystem || [];
             this.myDialog.systemType = true;
           }
-          break;
+          return false
         //关联资产
         case 'LinkEquipLocalName':
           if (this.linkNameFalg) {
             this.myDialog.changeRea = true;
           }
-          break;
+          return false
         //品牌型号弹窗
         case 'DPManufacturerID':
           if (!this.onlyRead) {
             this.myDialog.firm = true;
           }
-          break;
+          return false
         //供应商信息弹窗
         case 'DPSupplierID':
           if (!this.onlyRead) {
             this.myDialog.supplier = true;
           }
-          break;
+          return false
         //维修商信息弹窗
         case 'DPMaintainerID':
           if (!this.onlyRead) {
             this.myDialog.maintainer = true;
           }
-          break;
+          return false
         //保险公司信息
         case 'DPInsurerID':
           if (!this.onlyRead) {
             this.myDialog.insurer = true;
           }
-          break;
+          return false
         //供应合同编号
         case 'LedgerParam.SupplyPurchase.SupplierContractID':
           if (!this.onlyRead) {
@@ -745,7 +773,7 @@ export default {
               this.$message("请先选择供应商");
             }
           }
-          break;
+          return false
         //保险单号
         case 'LedgerParam.InsuranceDoc.InsuranceNum':
           if (!this.onlyRead) {
@@ -761,7 +789,7 @@ export default {
               this.$message("请先选择保险商");
             }
           }
-          break;
+          return false
         //保险文件--资产文档--安装质检报告
         case 'LedgerParam.InsuranceDoc.InsuranceFile':
         case 'LedgerParam.PhotoDoc.Archive':
@@ -769,7 +797,7 @@ export default {
           let IPSdata = tools.dataForKey(this.tableData[row.row], val);
           this.filesArr = IPSdata ? IPSdata : [];
           this.myDialog.uploadFiles = true;
-          break;
+          return false
         //安装照片--安装图纸--资产铭牌照片--资产图纸
         case 'LedgerParam.Siteinstall.InstallPic':
         case 'LedgerParam.Siteinstall.InstallDrawing':
@@ -778,13 +806,13 @@ export default {
           let SSPPdata = tools.dataForKey(this.tableData[row.row], val);
           this.imgsArr = SSPPdata ? SSPPdata : [];
           this.myDialog.uploadImgs = true;
-          break;
+          return false
         //资产照片
         case 'LedgerParam.PhotoDoc.Pic':
           let Pdata = tools.dataForKey(this.tableData[row.row], val);
           this.picsArr = Pdata ? Pdata : [];
           this.myDialog.pic = true;
-          break;
+          return false
         //包含的部件字段
         case 'Count':
           if (this.onlyRead) {
@@ -792,10 +820,29 @@ export default {
           } else {
             this.$router.push({ path: '/ledger/partsmanage', query: { deviceId: infos.EquipID, typeId: this.mess.deviceId } });
           }
-          break;
+          return false
         default:
           break;
       }
+      if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
+      }
+    },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
+    //更新临时维护信息点
+    handleClickUpdate(){
+      tools.setDataForKey(this.tableData[this.row], this.updateInfoPoint, this.updateInput)
+      this.handleUpdataTable([[this.row, this.updateInfoPoint, null, this.updateInput]], "edit")
+      this.updateInputShow = false
+      this.myDialog.update = false
+      this.updateInput = ''
     },
     //获取被筛选掉的行号
     trimmedRows() {
@@ -828,8 +875,14 @@ export default {
     supplierChange(data) {
       tools.setDataForKey(this.tableData[this.row], "DPSupplierID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.SupplyPurchase.Supplier", data.name)
-      this.handleUpdataTable([[this.row, "DPSupplierID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPSupplierID", null, data.venderId],
+          [this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
     },
     //供应合同编号
     supplyChange(data) {
@@ -852,23 +905,42 @@ export default {
       tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brand)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Specification", data.name)
-      this.handleUpdataTable([[this.row, "DPManufacturerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPManufacturerID", null, data.venderId],
+          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand],
+          [this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
     },
     //保险商变更
     changeInsurer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPInsurerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.InsuranceDoc.Insurer", data.name)
-      this.handleUpdataTable([[this.row, "DPInsurerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPInsurerID", null, data.venderId],
+          [this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
     },
     //维修商变更
     changeMaintainer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPMaintainerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.OperationMainte.Maintainer", data.name)
-      this.handleUpdataTable([[this.row, "DPMaintainerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPMaintainerID", null, data.venderId],
+          [this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
     },
     //修改关联的资产
     changeProperty(val) {
@@ -916,11 +988,11 @@ export default {
       this.assetGroupList = assetGroupList
     },
   },
-  watch: {      
-    projectId(){
-        this.main = []
-        this.mess.deviceId = null
-        this.page.total = 0
+  watch: {
+    projectId() {
+      this.main = []
+      this.mess.deviceId = null
+      this.page.total = 0
     },
     showTypes: {
       handler(newName, oldName) {
@@ -948,16 +1020,16 @@ export default {
     font-size: 12px;
   }
 }
-.add-assets{
-  .el-dialog__body{
+.add-assets {
+  .el-dialog__body {
     height: 130px;
-    .die-text{
+    .die-text {
       margin-left: 10px;
       font-weight: bold;
       clear: both;
       padding-top: 25px;
       padding-bottom: 10px;
-      .die-num{
+      .die-num {
         width: 100px;
         text-align: center;
         display: inline-block;

+ 166 - 54
src/components/ledger/handsontables/device.vue

@@ -14,9 +14,9 @@
         <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
       </el-select>
       <!-- <el-button size="small" style='width: 80px;' @click="download" icon="iconfont icon-xiazai">下载</el-button> -->
-      <el-button size="small" style='width: 80px;' @click="addDevice" icon="iconfont icon-tianjia">添加设备</el-button>
-      <el-button size="small" style='width: 80px;' @click="reset" icon="iconfont icon-shuaxin">刷新</el-button>
-      <el-button size="small" style='width: 80px;' v-show="!onlyRead" @click="undo" icon="iconfont icon-undo">撤销</el-button>
+      <el-button size="small" style='width: 80px;' @click="addDevice">添加设备</el-button>
+      <el-button size="small" style='width: 80px;' @click="reset">刷新</el-button>
+      <el-button size="small" style='width: 80px;' v-show="!onlyRead" @click="undo">撤销</el-button>
     </div>
     <!-- 二维码弹窗 -->
     <qrcode :dialog="myDialog" :qrcodeUrl="qrcodeUrl" :addBody="true" ref="qrcode"></qrcode>
@@ -54,12 +54,26 @@
     </div>
     <details-dialog :iframeSrc="iframeSrc" v-if="myDialog.details" :dialog="myDialog"></details-dialog>
     <!-- 关联的系统 -->
-    <system-type :device="mess" :curDevice="curDevice" :dialog="myDialog" :type="onlyRead?'read':'edit'" @change="changeSystemType" :list="systemList"></system-type>
+    <system-type :device="mess" :curDevice="curDevice" :dialog="myDialog" :type="onlyRead?'read':'edit'" @change="changeSystemType"
+      :list="systemList"></system-type>
     <!-- 关联资产 -->
     <change-rea @changeProperty="changeProperty" :dialog="myDialog" :category="deviceType"></change-rea>
     <look-pic :dialog="myDialog" :keysArr="picsArr"></look-pic>
+    <!-- 不支持的输入方式 -->
+    <el-dialog title="临时维护信息点" :visible.sync="myDialog.update" @close="handleCloseUpdate" width="670px">
+      <el-row>
+        该信息点未定义对应组件,现在维护数据不确定后续是否可用。如确实需要维护,请点击<el-link @click="updateInputShow = true" type="primary" :underline="false">继续维护</el-link>。
+      </el-row>
+      <el-row style="margin-top:20px;" v-show="updateInputShow">
+        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8}" placeholder="请输入内容" v-model="updateInput"></el-input>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="myDialog.update = false">取 消</el-button>
+        <el-button type="primary" @click="handleClickUpdate">确 认</el-button>
+      </span>
+    </el-dialog>
     <!-- 新增设备 -->
-    <el-dialog title="确定新增设备的类型" :visible.sync="myDialog.addDevice" width="30%">
+    <el-dialog title="确定新增设备的类型" :visible.sync="myDialog.addDevice" width="670px">
       <el-row>
         <my-cascader ref="cascader" @change="changeAddType" :all="true"></my-cascader>
       </el-row>
@@ -84,32 +98,33 @@ import {
 } from "@/api/scan/request";
 
 
-import tools from "@/utils/scan/tools";
+import tools from "@/utils/scan/tools"
 import handsonUtils from "@/utils/hasontableUtils"
 import showTools from "@/utils/handsontable/notShow"
 import text from "@/utils/handsontable/mainText"
-import myCascader from "@/components/ledger/lib/cascader";
+import myCascader from "@/components/ledger/lib/cascader"
+import buildFloor from '@/utils/handsontable/buildFloorData'
 
-import qrcode from "@/components/ledger/lib/qrcode";
-import firm from "@/components/dialogs/list/firm";
-import supplyDialog from "@/components/dialogs/list/supplyDialog";
-import supplierDialog from "@/components/dialogs/list/supplierDialog";
-import maintainerDialog from "@/components/dialogs/list/maintainerDialog";
-import insurerDialog from "@/components/dialogs/list/insurerDialog";
-import guaranteeDialog from "@/components/dialogs/list/guaranteeDialog";
-import uploadFilesDialog from "@/components/dialogs/list/filesDialog";
-import uploadImgDialog from "@/components/dialogs/list/uploadImgDialog";
+import qrcode from "@/components/ledger/lib/qrcode"
+import firm from "@/components/dialogs/list/firm"
+import supplyDialog from "@/components/dialogs/list/supplyDialog"
+import supplierDialog from "@/components/dialogs/list/supplierDialog"
+import maintainerDialog from "@/components/dialogs/list/maintainerDialog"
+import insurerDialog from "@/components/dialogs/list/insurerDialog"
+import guaranteeDialog from "@/components/dialogs/list/guaranteeDialog"
+import uploadFilesDialog from "@/components/dialogs/list/filesDialog"
+import uploadImgDialog from "@/components/dialogs/list/uploadImgDialog"
 import picDialog from "@/components/dialogs/list/picDialog"
 import systemType from "@/components/dialogs/list/systemType"
-import myPagination from "@/components/ledger/lib/myPagination";
+import myPagination from "@/components/ledger/lib/myPagination"
 import detailsDialog from "@/components/ledger/lib/detailsDia"
 import changeRea from "@/components/dialogs/changeRea"
-import { mapGetters, mapActions } from "vuex";
+import { mapGetters, mapActions } from "vuex"
 //图片查看
 import lookPic from "@/components/ledger/lib/lookImages"
 import Handsontable from "handsontable-pro"
 import 'handsontable-pro/dist/handsontable.full.css'
-import zhCN from 'handsontable-pro/languages/zh-CN';
+import zhCN from 'handsontable-pro/languages/zh-CN'
 //下拉插件
 // import "@/assets/js/chosen.jquery.min";
 // import "@/assets/js/handsontable-chosen-editor";
@@ -134,12 +149,14 @@ export default {
     lookPic,
     myCascader
   },
-  created() { },
+  created() { 
+    buildFloor.getData(this.buildFloorData)
+  },
   computed: {
     ...mapGetters("layout", ["projectId", "secret", "userId"]),
     showTypes() {
       return this.onlyRead ?
-        [{ value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }] :
+        [{ value: "Visible", label: '只看采集信息' }, { value: "all", label: '全部' }] :
         [{ value: "partInfo", label: '隐藏信息点' }, { value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }]
     }
   },
@@ -152,6 +169,7 @@ export default {
         value: false,
         label: '编辑模式'
       }],
+      buildFloorData: [], //楼层数据
       tableData: [],
       mess: {},
       tableHeader: null,
@@ -177,18 +195,19 @@ export default {
         details: false,//详情页
         changeRea: false,//关联资产
         lookPic: false,//图片查看
+        update: false,//临时维护信息点
       },
       row: null, //被修改的row
       filesArr: [], //保存临时的文件key
       messKey: null,
       imgsArr: [], //临时保存的图片key数组
       picsArr: [], //临时设备图片keys数组
-      systemList:[], //关联的系统
+      systemList: [], //关联的系统
       copyMain: null,
       iframeSrc: "",
       id: 0,
       onlyRead: true,
-      showType: 'all',
+      showType: 'Visible',
       linkNameFalg: false,
       qrcodeUrl: "", //二维码图片地址
       loading: false,
@@ -196,6 +215,12 @@ export default {
       floorData: [],
       curDevice: '',//当前点击的设备id
       addData: {}, //添加设备选择的设备类型
+      inputMap: {
+        flowBuild: 'D1'
+      }, //信息点和输入方式映射表
+      updateInputShow: false, //是否显示临时维护输入框
+      updateInfoPoint: '',//临时维护信息点
+      updateInput: '', //临时维护信息点值
     };
   },
   methods: {
@@ -209,12 +234,17 @@ export default {
           data: {
             Orders: "sort asc",
             PageNumber: 1,
-            PageSize: 500
+            PageSize: 1000
           },
           type: this.mess.deviceId
         };
         getDataDictionary(params, res => {
           this.tableHeader = res.Content;
+          this.tableHeader.forEach(item => {
+            if(item.Path && item.InputMode){
+              this.inputMap[item.Path] = item.InputMode
+            }
+          })
           this.getTableData()
         });
       }
@@ -243,7 +273,14 @@ export default {
         }
         getEquipTableCon(param, res => {
           this.loading = false;
-          this.tableData = res.Content;
+          this.tableData = res.Content.map((item) => {
+            if (item.hasOwnProperty("BuildingId") && item.hasOwnProperty("FloorId")) {
+              item.flowBuild = item.BuildingId + "-" + item.FloorId
+            } else if (item.hasOwnProperty("BuildingId") && !item.hasOwnProperty("FloorId")) {
+              item.flowBuild = item.BuildingId
+            }
+            return item
+          });
           this.copyMain = tools.deepCopy(this.tableData);
           this.page.total = res.Total;
           if (this.tableData && this.tableData.length) {
@@ -384,6 +421,9 @@ export default {
       let arr = tools.copyArr(list)
       let data = showTools.headerTextFilter(arr, 'equipment', this.onlyRead, this.showType, true)
       data.unshift("操作", "当前关联的资产", "所属系统实例", "包含的部件");
+      if (this.showType == "all") {
+        data.splice(6, 0, "所属建筑楼层")
+      }
       return data;
     },
     //格式化表内容
@@ -410,9 +450,15 @@ export default {
           renderer: tools.lookDetails
         }
       );
-      if (this.onlyRead) {
-        data.map(item => {
-          item.readOnly = true
+      if (this.showType == "all") {
+        data.splice(6, 0, {
+          data: "flowBuild",
+          renderer: tools.customDropdownRenderer,
+          editor: "chosen",
+          chosenOptions: {
+            data: this.buildFloorData
+          },
+          readOnly: this.onlyRead
         })
       }
       return data;
@@ -507,7 +553,6 @@ export default {
           if (changeData.length == 1 && changeData[0][1].indexOf("/") > 0) {
             changeData[0][1] = changeData[0][1].split("/").join(".")
           }
-
           //存在data进行修改请求
           if (data && data.length) {
             this.updateBusiness(data, changeData);
@@ -555,6 +600,10 @@ export default {
       //生成要修改字段列表
       change.map(item => {
         let key = item[1].split(".")[0]
+        if (key == "flowBuild" && keyList.indexOf(key) == -1) {
+          keyList.push("BuildingId","FloorId")
+          param.Projection.push("BuildingId","FloorId")
+        }
         if (item[1] && keyList.indexOf(key) == -1 && item[1] != 'PropertyId') {
           keyList.push(key);
         }
@@ -565,8 +614,26 @@ export default {
       //生成对应修改数据
       data.map((item, index) => {
         keyList.map(value => {
-          let itemData = tools.dataForKey(item, value);
-          tools.setDataForKey(item, value, itemData == "" ? null : itemData);
+          if (value == "BuildingId") {
+            let itemData = tools.dataForKey(item, "flowBuild")
+            if (itemData == "") {
+              tools.setDataForKey(item, "BuildingId", null)
+              tools.setDataForKey(item, "FloorId", null)
+            } else {
+              let BuildingId = itemData.split("-")[0]
+              let FloorId = itemData.split("-")[1]
+              if (BuildingId && FloorId) {
+                tools.setDataForKey(item, "BuildingId", BuildingId)
+                tools.setDataForKey(item, "FloorId", FloorId)
+              } else if (BuildingId && !FloorId) {
+                tools.setDataForKey(item, "BuildingId", BuildingId)
+                tools.setDataForKey(item, "FloorId", null)
+              }
+            }
+          } else {
+            let itemData = tools.dataForKey(item, value)
+            tools.setDataForKey(item, value, itemData == "" ? null : itemData)
+          }
         });
         param.Content.push(item);
       });
@@ -593,6 +660,7 @@ export default {
     //获取到了正确的信息
     getInfors(infos, row, el) {
       let val = this.hot.colToProp(row.col);
+      let inputMode = this.inputMap[val];
       this.row = row.row;
       this.messKey = val;
       switch (val) {
@@ -600,7 +668,7 @@ export default {
         case 'caozuo':
           // window.open(`http://adm.sagacloud.cn:8058/spread?id=${infos.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
           this.$message("开发中...")
-          break;
+          return false
         //设备二维码图片
         case 'EquipQRCode':
           this.qrcodeUrl = this.tableData[row.row].EquipQRCode;
@@ -609,7 +677,7 @@ export default {
           } else {
             this.$message("此设备没有设备二维码");
           }
-          break;
+          return false
         //关联系统
         case 'LinkSystem':
           if (!this.onlyRead) {
@@ -617,37 +685,37 @@ export default {
             this.systemList = this.tableData[row.row].LinkSystem || [];
             this.myDialog.systemType = true;
           }
-          break;
+          return false
         //关联资产
         case 'LinkEquipLocalName':
           if (this.linkNameFalg) {
             this.myDialog.changeRea = true;
           }
-          break;
+          return false
         //品牌型号弹窗
         case 'DPManufacturerID':
           if (!this.onlyRead) {
             this.myDialog.firm = true;
           }
-          break;
+          return false
         //供应商信息弹窗
         case 'DPSupplierID':
           if (!this.onlyRead) {
             this.myDialog.supplier = true;
           }
-          break;
+          return false
         //维修商信息弹窗
         case 'DPMaintainerID':
           if (!this.onlyRead) {
             this.myDialog.maintainer = true;
           }
-          break;
+          return false
         //保险公司信息
         case 'DPInsurerID':
           if (!this.onlyRead) {
             this.myDialog.insurer = true;
           }
-          break;
+          return false
         //供应合同编号
         case 'LedgerParam.SupplyPurchase.SupplierContractID':
           if (!this.onlyRead) {
@@ -663,7 +731,7 @@ export default {
               this.$message("请先选择供应商");
             }
           }
-          break;
+          return false
         //保险单号
         case 'LedgerParam.InsuranceDoc.InsuranceNum':
           if (!this.onlyRead) {
@@ -679,7 +747,7 @@ export default {
               this.$message("请先选择保险商");
             }
           }
-          break;
+          return false
         //保险文件--设备文档--安装质检报告
         case 'LedgerParam.InsuranceDoc.InsuranceFile':
         case 'LedgerParam.PhotoDoc.Archive':
@@ -687,7 +755,7 @@ export default {
           let IPSdata = tools.dataForKey(this.tableData[row.row], val);
           this.filesArr = IPSdata ? IPSdata : [];
           this.myDialog.uploadFiles = true;
-          break;
+          return false
         //安装照片--安装图纸--设备铭牌照片--设备图纸
         case 'LedgerParam.Siteinstall.InstallPic':
         case 'LedgerParam.Siteinstall.InstallDrawing':
@@ -696,13 +764,13 @@ export default {
           let SSPPdata = tools.dataForKey(this.tableData[row.row], val);
           this.imgsArr = SSPPdata ? SSPPdata : [];
           this.myDialog.uploadImgs = true;
-          break;
+          return false
         //设备照片
         case 'LedgerParam.PhotoDoc.Pic':
           let Pdata = tools.dataForKey(this.tableData[row.row], val);
           this.picsArr = Pdata ? Pdata : [];
           this.myDialog.pic = true;
-          break;
+          return false
         //包含的部件字段
         case 'Count':
           if (this.onlyRead) {
@@ -710,10 +778,29 @@ export default {
           } else {
             this.$router.push({ path: '/ledger/partsmanage', query: { deviceId: infos.EquipID, typeId: this.mess.deviceId } });
           }
-          break;
+          return false
         default:
           break;
       }
+      if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
+      }
+    },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
+    //更新临时维护信息点
+    handleClickUpdate(){
+      tools.setDataForKey(this.tableData[this.row], this.updateInfoPoint, this.updateInput)
+      this.handleUpdataTable([[this.row, this.updateInfoPoint, null, this.updateInput]], "edit")
+      this.updateInputShow = false
+      this.myDialog.update = false
+      this.updateInput = ''
     },
     //获取被筛选掉的行号
     trimmedRows() {
@@ -746,8 +833,14 @@ export default {
     supplierChange(data) {
       tools.setDataForKey(this.tableData[this.row], "DPSupplierID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.SupplyPurchase.Supplier", data.name)
-      this.handleUpdataTable([[this.row, "DPSupplierID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPSupplierID", null, data.venderId],
+          [this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
     },
     //供应合同编号
     supplyChange(data) {
@@ -770,23 +863,42 @@ export default {
       tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brand)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Specification", data.name)
-      this.handleUpdataTable([[this.row, "DPManufacturerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPManufacturerID", null, data.venderId],
+          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand],
+          [this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
     },
     //保险商变更
     changeInsurer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPInsurerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.InsuranceDoc.Insurer", data.name)
-      this.handleUpdataTable([[this.row, "DPInsurerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPInsurerID", null, data.venderId],
+          [this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
     },
     //维修商变更
     changeMaintainer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPMaintainerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.OperationMainte.Maintainer", data.name)
-      this.handleUpdataTable([[this.row, "DPMaintainerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPMaintainerID", null, data.venderId],
+          [this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
     },
     //修改关联的资产
     changeProperty(val) {

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

@@ -31,6 +31,19 @@
     <!-- <dialog-assets :assetType="[this.mess.deviceId]" @close="getClose" v-if="myDialog.addDevice" ref="assets" :dialog="myDialog"></dialog-assets> -->
     <details-dialog :iframeSrc="iframeSrc" v-if="myDialog.details" :dialog="myDialog"></details-dialog>
     <system-relevance @close="reset" :id="systemId" :dialog="myDialog"></system-relevance>
+    <!-- 不支持的输入方式 -->
+    <el-dialog title="临时维护信息点" :visible.sync="myDialog.update" @close="handleCloseUpdate" width="670px">
+      <el-row>
+        该信息点未定义对应组件,现在维护数据不确定后续是否可用。如确实需要维护,请点击<el-link @click="updateInputShow = true" type="primary" :underline="false">继续维护</el-link>。
+      </el-row>
+      <el-row style="margin-top:20px;" v-show="updateInputShow">
+        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8}" placeholder="请输入内容" v-model="updateInput"></el-input>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="myDialog.update = false">取 消</el-button>
+        <el-button type="primary" @click="handleClickUpdate">确 认</el-button>
+      </span>
+    </el-dialog>
     <!-- 新增系统 -->
     <el-dialog title="确定新增系统的类型" :visible.sync="myDialog.addDevice" width="30%">
       <el-row>
@@ -126,6 +139,7 @@ export default {
         addDevice: false,
         details: false,//详情页
         relevance: false,//关联设备
+        update: false,//临时维护信息点
       },
       row: null,//被修改的row
       filesArr: [],//保存临时的文件key
@@ -137,11 +151,17 @@ export default {
       iframeSrc: "",
       systemId: "",
       onlyRead: true,
-      showType: 'all',
+      showType: 'Visible',
       linkNameFalg: false,
       qrcodeUrl: "",//二维码图片地址
       loading: false,
       addData: {}, //添加设备选择的设备类型
+      inputMap: {
+        flowBuild: 'D1'
+      }, //信息点和输入方式映射表
+      updateInputShow: false, //是否显示临时维护输入框
+      updateInfoPoint: '',//临时维护信息点
+      updateInput: '', //临时维护信息点值
     };
   },
   created() {
@@ -166,6 +186,11 @@ export default {
         }
         getDataDictionary(params, res => {
           this.tableHeader = res.Content;
+          this.tableHeader.forEach(item => {
+            if(item.Path && item.InputMode){
+              this.inputMap[item.Path] = item.InputMode
+            }
+          })
           this.getTableData()
         });
       }
@@ -486,6 +511,7 @@ export default {
     getInfors(infos, row) {
       //其他的开始判断
       let val = this.hot.colToProp(row.col);
+      let inputMode = this.inputMap[val];
       this.systemId = infos.SysID
       this.row = row.row
       this.messKey = val
@@ -494,7 +520,7 @@ export default {
         case 'caozuo':
           // window.open(`http://adm.sagacloud.cn:8058/system?id=${infos.id}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
           this.$message("开发中...")
-          break;
+          return false
         //设备二维码图片
         case 'EquipQRCode':
           this.qrcodeUrl = this.tableData[row.row].EquipQRCode;
@@ -503,16 +529,35 @@ export default {
           } else {
             this.$message("此设备没有设备二维码");
           }
-          break;
+          return false
         //关联设备数量
         case 'Count':
           if (!this.onlyRead) {
             this.myDialog.relevance = true
           }
-          break;
+          return false
         default:
           break;
       }
+      if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
+      }
+    },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
+    //更新临时维护信息点
+    handleClickUpdate(){
+      tools.setDataForKey(this.tableData[this.row], this.updateInfoPoint, this.updateInput)
+      this.handleUpdataTable([[this.row, this.updateInfoPoint, null, this.updateInput]], "edit")
+      this.updateInputShow = false
+      this.myDialog.update = false
+      this.updateInput = ''
     },
     //获取被筛选掉的行号
     trimmedRows() {

+ 319 - 0
src/components/ledger/lib/linkassets.vue

@@ -0,0 +1,319 @@
+<template>
+  <el-dialog title="批量关联资产" :visible.sync="dialog.linkAssets" @open="handleOpenReset" width="700px">
+    <el-row>
+      <span class="condition-title">设备类型:</span>
+      <el-select v-model="deviceType" filterable size="small" @change="handleChangeDevice" style="width:350px;">
+        <el-option  v-for="item in deviceTypeList" :key="item.Category" :label="item.CategoryName" :value="item.Category"></el-option>
+      </el-select>
+    </el-row>
+    <el-row style="margin-top:30px;">
+      <span class="condition-title">建筑楼层:</span>
+      <el-cascader :options="bfoptions" v-model="buildFloor" filterable size="small" @change="handleChangeBf" style="width:350px;"></el-cascader>
+    </el-row>
+    <el-row style="margin-top:30px;"  v-show="spaceShow">
+      <span class="condition-title">分区类型:</span>
+      <el-select v-model="zone" filterable size="small" @change="handleChangeZone" style="width:350px;">
+        <el-option  v-for="item in zoneList" :key="item.Code" :label="item.Name" :value="item.Code"></el-option>
+      </el-select>
+    </el-row>
+    <el-row style="margin-top:30px;" v-show="spaceShow && zone != 'all' && zone != 'noKnow'">
+      <span class="condition-title">空间实例:</span>
+      <el-select v-model="space" multiple filterable collapse-tags style="width:350px;" placeholder="请选择">
+        <el-option v-for="item in spaceList" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+    </el-row>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="handleClickClose">取 消</el-button>
+      <el-button type="primary" @click="toLinkAssets">确 认</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+
+import { floorQuery, buildingQuery, queryDictionaryHead, queryZone, TypePartsDie } from '@/api/scan/request'
+
+import { mapGetters } from "vuex"
+export default {
+  props: {
+    dialog: {
+      type: Object,
+      default: function () {
+        return {
+          linkAssets: false
+        };
+      }
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId", "secret", "userId"])
+  },
+  data() {
+    return {
+      bfoptions: [], //建筑楼层列表
+      buildFloor: ['all'], //选择的建筑楼层
+      deviceTypeList: [], //未关联资产的设备或部件列表
+      deviceType: '', //选择的设备类型
+      zone: 'all', //空间分区
+      zoneList: [], //空间分区列表
+      spaceList: [], //空间实例列表
+      space: [], //选择的空间实例
+      spaceShow: false
+    };
+  },
+  created() {
+    this.getPartsDieType() //获取未关联资产的设备或部件类型
+    this.getBuildFloorData() //获取建筑楼层数据
+    this.getSpaceData() //获取分区类型数据
+  },
+  mounted() { },
+  methods: {
+    //打开弹窗回调,初始化选择
+    handleOpenReset(){
+      this.deviceType = ''
+      this.buildFloor = ['all']
+      this.zone = 'all'
+      this.space = []
+      this.spaceShow = false
+    },
+    //获取未关联资产的设备或部件类型
+    getPartsDieType() {
+      TypePartsDie(res => {
+        this.deviceTypeList = res.Content.filter(item => {
+          return item.CategoryName
+        })
+      })
+    },
+    //获取建筑楼层数据
+    getBuildFloorData() {
+      let data, buildParams = {
+        PageNumber: 1,
+        PageSize: 1000,
+        Projection: [
+          "BuildID",
+          "BuildLocalName"
+        ]
+      }, floorParams = {
+        Orders: "FloorSequenceID desc",
+        PageNumber: 1,
+        PageSize: 1000,
+        Projection: [
+          "BuildID",
+          "FloorID",
+          "FloorLocalName",
+          "FloorSequenceID"
+        ]
+      }
+      let promise1 = new Promise((resolve, reject) => {
+        buildingQuery(buildParams, res => {
+          resolve(res)
+        })
+      })
+      let promise2 = new Promise((resolve, reject) => {
+        floorQuery(floorParams, res => {
+          resolve(res)
+        })
+      })
+      Promise.all([promise1, promise2]).then(values => {
+        let builData = values[0].Content, floorData = values[1].Content
+        data = builData.map(build => {
+          return {
+            value: build.BuildID,
+            label: build.BuildLocalName
+          }
+        })
+        data.unshift({
+          value: "all",
+          label: "全部"
+        }, {
+            value: "noKnow",
+            label: "不在建筑内"
+          })
+        data.forEach(build => {
+          floorData.forEach(floor => {
+            if (build.value == floor.BuildID && floor.FloorID && floor.FloorLocalName) {
+              if (build.children) {
+                build.children.push({
+                  value: floor.FloorID,
+                  label: floor.FloorLocalName,
+                  FloorSequenceID: floor.FloorSequenceID
+                })
+              } else {
+                build.children = []
+                build.children.push({
+                  value: "all",
+                  label: "全部"
+                }, {
+                    value: 'noKnow',
+                    label: "不在楼层内"
+                  }, {
+                    value: floor.FloorID,
+                    label: floor.FloorLocalName,
+                    FloorSequenceID: floor.FloorSequenceID
+                  })
+              }
+            }
+          })
+        })
+        this.bfoptions = data
+      })
+    },
+    //获取空间分区数据
+    getSpaceData(){
+      let params = {
+        Filters: "parentId = 'Space'",
+        PageNumber: 1,
+        PageSize: 1000,
+        Projection: [ "Code", "Name" ]
+      }
+      queryDictionaryHead(params, res => {
+        this.zoneList = res.Content.filter(item => {
+          if(item.Code != 'Ispace'){
+            return item
+          }
+        })
+        this.zoneList.unshift({
+          Name: '全部',
+          Code: 'all'
+        })
+        this.zoneList.push({
+          Name: '不在任何业务空间内',
+          Code: 'noKnow'
+        })
+      })
+    },
+    // 修改设备类型
+    handleChangeDevice(val) {
+      this.zoneListIsShow()
+    },
+    // 修改建筑楼层
+    handleChangeBf(val) {
+      this.zoneListIsShow()
+      // 重置空间实例选择
+      this.space = []
+      this.spaceList = []
+      this.handleChangeSpaceItem()
+    },
+    //判断是否显示空间分区选择
+    zoneListIsShow(){
+      let lastVal = this.buildFloor.slice(-1)[0]
+      if(!lastVal || lastVal == 'noKnow' || this.buildFloor[0] == 'all' || this.deviceType.length != 4) {
+        this.spaceShow = false
+      } else {
+        this.spaceShow = true
+      }
+    },
+    //修改分区类型
+    handleChangeZone() {
+      // 重置空间实例选择
+      this.space = []
+      this.spaceList = []
+      this.handleChangeSpaceItem()
+    },
+    // 获取空间实例
+    handleChangeSpaceItem() {
+      if(this.zone != 'all' && this.zone != 'noKnow') {
+        let nodes = []
+        let recursionGetData = (pageNum, zone) => {
+          pageNum = pageNum ? pageNum : 1
+          let params = {
+            zone: zone,
+            data: {
+              Orders: "CreateTime desc, RoomID asc",
+              PageNumber: pageNum,
+              PageSize: 1000,
+              Projection: ["RoomID", "RoomName", "RoomLocalName", "CreateTime"]
+            },
+          }
+          if(this.spaceShow) {
+            if(this.buildFloor.length == 2 && this.buildFloor[1] != 'all') {
+              params.data.Filters = `buildingId='${this.buildFloor[0]}';floorId='${this.buildFloor[1]}'`
+            } else {
+              params.data.Filters = `buildingId='${this.buildFloor[0]}'`
+            }
+          }
+          queryZone(params, res => {
+            nodes = nodes.concat(res.Content.map(item => ({
+              value: item.RoomID,
+              label: item.RoomLocalName?item.RoomLocalName:item.RoomName
+            })))
+            if (res.Total / (res.PageSize * res.PageNumber) > 1) {
+              recursionGetData(res.PageNumber + 1, zone)
+            } else {
+              this.spaceList = nodes
+            }
+          })
+        }
+        recursionGetData(1, this.zone)
+      }
+    },
+    // 点击取消关闭弹窗
+    handleClickClose() {
+      this.dialog.linkAssets = false
+    },
+    // 批量关联资产详情页
+    toLinkAssets() {
+      let query = {}
+      // 校验必填项
+      if(!this.deviceType) {
+        this.$message.info('请选择设备类型!')
+        return false
+      } else if (!this.buildFloor.length) {
+        this.$message.info('请选择建筑楼层!')
+        return false
+      }
+      if(this.spaceShow) { //选择了空间
+        if(this.zone == 'all'){//全部空间
+          query = {
+            deviceType: this.deviceType,
+            buildFloor: this.buildFloor
+          }
+        } else {
+          if(this.space.length){//选择了具体的空间实例
+            query = {
+              deviceType: this.deviceType,
+              buildFloor: this.buildFloor,
+              spaceList: this.space
+            }
+          } else {
+            query = {
+              deviceType: this.deviceType,
+              buildFloor: this.buildFloor,
+              spaceList: this.zone //(包含具体的业务空间分区和不在任何分区两种情况)
+            }
+          }
+        }
+      } else {
+        query = {
+          deviceType: this.deviceType,
+          buildFloor: this.buildFloor
+        }
+      }
+      this.$router.push({
+        name: "batchlinkAssets",
+        params: query
+      })
+    }
+  },
+  watch: {
+    
+  }
+};
+</script>
+
+<style lang="less" scoped>
+  .condition-title{
+    width: 100px;
+    display: inline-block;
+    text-align: right;
+    margin-left: 10px;
+    margin-right: 12px;
+    color: #999999;
+    font-size: 14px;
+    vertical-align: top;
+  }
+  /deep/ .el-dialog__body {
+    max-height: 420px;
+    overflow-y: auto;
+  }
+</style>

+ 43 - 67
src/components/model/file/floorTable.vue

@@ -1,72 +1,50 @@
 <template>
-  <el-table
-    ref="filterTable"
-    :data="tableData"
-    style="width: 100%"
-    :height="maxHeight"
-    :header-cell-style="{background:'#d9d9d9',color:'#2b2b2b'}"
-  >
-    <el-table-column prop="FloorName" label="模型文件" width="180">
-      <template slot-scope="scope">
-        <i class="el-icon-document-checked icon_font"></i>
-        <span style="margin-left: 10px">{{ scope.row.FloorName }}</span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="Note" label="备注" width="180"></el-table-column>
-    <el-table-column prop="Version" label="版本号"></el-table-column>
-    <el-table-column prop="AcceptTime" label="上传时间"></el-table-column>
-    <el-table-column prop="UserName" label="上传人"></el-table-column>
-    <el-table-column prop="address" align="center" label="操作"  width="240">
-      <template slot-scope="scope">
-        <div class="operate" v-show="!scope.row.isDown">
-          <el-button
-            type="primary"
-            size="mini"
-            class="iconfont icon-download"
-            @click="downloadModel(scope.row)"
-          ></el-button>
-          <el-button
-            type="primary"
-            size="mini"
-            class="iconfont icon-replace"
-            @click="repliaceModel(scope.row)"
-          ></el-button>
-          <el-button
-            type="primary"
-            size="mini"
-            class="iconfont icon-Log"
-            @click="queryModelLog(scope.row)"
-          ></el-button>
-        </div>
-        <div
-          :class="[scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11 || (!scope.row.Status && scope.row.precent == 100)? 'upLoad-loading':'','upLoad']"
-          v-show="scope.row.isDown"
-        >
-          <div class="progress">
-            <el-progress
-              :text-inside="scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11 || (!scope.row.Status && scope.row.precent == 100)?false:true"
-              :stroke-width="20"
-              :percentage="scope.row.precent"
-              :color="scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11?'#909399':'#67C23A'"
-            ></el-progress>
+  <div class="filterTable-container">
+    <el-table ref="filterTable" :data="tableData" style="width: 100%" height="100%" :header-cell-style="{background:'#d9d9d9',color:'#2b2b2b'}">
+      <el-table-column prop="FloorName" label="模型文件" width="180">
+        <template slot-scope="scope">
+          <i class="el-icon-document-checked icon_font"></i>
+          <span style="margin-left: 10px">{{ scope.row.FloorName }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="Note" label="备注" width="180"></el-table-column>
+      <el-table-column prop="Version" label="版本号"></el-table-column>
+      <el-table-column prop="AcceptTime" label="上传时间"></el-table-column>
+      <el-table-column prop="UserName" label="上传人"></el-table-column>
+      <el-table-column prop="address" align="center" label="操作" width="240">
+        <template slot-scope="scope">
+          <div class="operate" v-show="!scope.row.isDown">
+            <el-button type="primary" size="mini" class="iconfont icon-download" @click="downloadModel(scope.row)"></el-button>
+            <el-button type="primary" size="mini" class="iconfont icon-replace" @click="repliaceModel(scope.row)"></el-button>
+            <el-button type="primary" size="mini" class="iconfont icon-Log" @click="queryModelLog(scope.row)"></el-button>
           </div>
-          <div class="progress-right">
-            <!-- <el-button
+          <div
+            :class="[scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11 || (!scope.row.Status && scope.row.precent == 100)? 'upLoad-loading':'','upLoad']"
+            v-show="scope.row.isDown">
+            <div class="progress">
+              <el-progress
+                :text-inside="scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11 || (!scope.row.Status && scope.row.precent == 100)?false:true"
+                :stroke-width="20" :percentage="scope.row.precent"
+                :color="scope.row.Status == 1 || scope.row.Status == 10 || scope.row.Status == 11?'#909399':'#67C23A'"></el-progress>
+            </div>
+            <div class="progress-right">
+              <!-- <el-button
               v-show="!scope.row.Status"
               type="danger"
               class="iconfont icon-termination"
               @click="closeUpdate(scope.row)"
               circle
             ></el-button>-->
-            <span v-show="!scope.row.Status && scope.row.precent == 100">上传中</span>
-            <span v-show="scope.row.Status == 1">等待检查...</span>
-            <span v-show="scope.row.Status == 10">模型检查中</span>
-            <span v-show="scope.row.Status == 11">未通过检查</span>
+              <span v-show="!scope.row.Status && scope.row.precent == 100">上传中</span>
+              <span v-show="scope.row.Status == 1">等待检查...</span>
+              <span v-show="scope.row.Status == 10">模型检查中</span>
+              <span v-show="scope.row.Status == 11">未通过检查</span>
+            </div>
           </div>
-        </div>
-      </template>
-    </el-table-column>
-  </el-table>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
 </template>
 <script>
 import { mapGetters } from "vuex";
@@ -126,7 +104,7 @@ export default {
       if (item.Url) {
         let a = document.createElement("a");
         a.href = item.Url;
-        a.download =`${this.modelFolderName}${item.FloorName}模型文件v${item.Version}.rvt`;
+        a.download = `${this.modelFolderName}${item.FloorName}模型文件v${item.Version}.rvt`;
         a.click();
       } else {
         this.$message({
@@ -151,7 +129,7 @@ export default {
     persentList: {
       immediate: true,
       deep: true,
-      handler: function(val, oldVal) {
+      handler: function (val, oldVal) {
         if (val.length != 0) {
           val.map(item => {
             if (item.precent != 0) {
@@ -161,17 +139,15 @@ export default {
         }
       }
     }
-  },
-  mounted() {
-    this.$nextTick(function() {
-      this.maxHeight = $("#file_moddle_manage").height() - 60; // 获取最外层的高度
-    });
   }
 };
 </script>
 <style scoped lang="less">
 .box-card {
   height: 100%;
+  .filterTable-container {
+    height: calc(100% - 80px);
+  }
   .operate {
     .iconfont {
       font-size: 12px;

+ 5 - 2
src/framework/layout/layout-store.js

@@ -18,7 +18,7 @@ export default {
         projects: [],
         breadcrumb: [],
         secret: "", //密码
-        userId: "test", //用户id
+        userId: "", //用户id
     },
     getters: {
         sidebarClosed: state => state.sidebarClosed,
@@ -110,7 +110,10 @@ export default {
                     //     }
                     // } else {
                     if (resp.Result == 'success') {
-                        state.userInfo = { username: resp.Username }
+                        state.userInfo = { username: resp.Username, userId: resp.Userid }
+                        state.userId = resp.Userid
+                        storage.set('user_name', resp.Username)
+                        storage.set('user_id', resp.Userid)
                         state.permissions = {}
                         if (resp.Permissions) {
                             resp.Permissions.forEach(p => (state.permissions[p] = true))

+ 15 - 1
src/router/system.js

@@ -53,10 +53,12 @@ import propertyadd from '@/views/ledger/property/addproperty'
 import propertyLedger from '@/views/ledger/property'
 import spacelist from '@/views/ledger/spacelist'//业务空间台账
 import addPropertys from '@/views/ledger/property/addpropertys'//根据未关联资产的设备或部件批量创建设备
+import batchlinkAssets from '@/views/ledger/facility/batchlink' //批量关联资产
 import cenotelist from '@/views/ledger/cenotelist' //竖井清单
 import cenoteadd from '@/views/ledger/cenotelist/cenoteadd' //添加竖井
+import cenoteDetail from '@/views/ledger/cenotelist/cenoteDetail' //竖井关系详情
 import rentlist from '@/views/ledger/rentlist' //租户清单
-import rentadd from '@/views/ledger/rentlist/rentadd' //竖井清单
+import rentadd from '@/views/ledger/rentlist/rentadd' //租户清单
 import dataReport from '@/views/ledger/report'
 import auth from '@/views/system/auth'
 import noUser from '@/views/system/nouser'
@@ -260,6 +262,12 @@ export default [
                 meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账', path: '/ledger/facility' }, { label: '添加设备' }] }
             },
             {
+                path: 'batchlinkAssets',
+                name: 'batchlinkAssets',
+                component: batchlinkAssets,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账', path: '/ledger/facility' }, { label: '批量关联资产' }] }
+            },
+            {
                 path: 'property',
                 name: 'propertyLedger',
                 component: propertyLedger,
@@ -314,6 +322,12 @@ export default [
                 meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '竖井台账', path: '/ledger/cenotelist' }, { label: '添加竖井' }] }
             },
             {
+                path: 'cenoteDetail',
+                name: 'cenoteDetail',
+                component: cenoteDetail,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '竖井台账', path: '/ledger/cenotelist' }, { label: '竖井关系详情' }] }
+            },
+            {
                 path: 'rentlist',
                 name: 'rentlist',
                 component: rentlist,

+ 12 - 2
src/utils/handsontable/fillterField.js

@@ -11,11 +11,21 @@ const data = {
   },
   tenant: { //租户
     onlyRead: [],
-    edit: []
+    edit: [
+      "TenantID",
+      "TenantName",
+      "BIMID",
+      "BIMLocation"
+    ]
   },
   shaft: { //竖井
     onlyRead: [],
-    edit: []
+    edit: [
+      "ShaftID",
+      "ShaftName",
+      "BIMID",
+      "BIMLocation"
+    ]
   },
   parts: { //部件
     onlyRead: [],

+ 3 - 6
src/utils/handsontable/notShow.js

@@ -139,6 +139,7 @@ let partsAddNoShow = [
     "InsurerFax",
 ]
 const showTools = {
+    InputModeArr: ["A1", "A2", "B1", "B2", "C5", "D1", "D1L", "D2", "E1", "E2", "L", "L1", "L2", "F1", "F2", "M"],
     addArr: () => {
         return cutArr
     },
@@ -1055,9 +1056,7 @@ const showTools = {
                 readOnly: onlyRead,
                 correctFormat: true
             };
-        } else if (item.InputMode == "A3" ||
-            item.InputMode == "A4" ||
-            item.InputMode == "B1" ||
+        } else if (item.InputMode == "B1" ||
             item.InputMode == "B2" ||
             item.InputMode == "F1" ||
             item.InputMode == "F2" ||
@@ -1166,9 +1165,7 @@ const showTools = {
                 readOnly: !item.Editable,
                 correctFormat: true
             };
-        } else if (item.InputMode == "A3" ||
-            item.InputMode == "A4" ||
-            item.InputMode == "B1" ||
+        } else if (item.InputMode == "B1" ||
             item.InputMode == "B2" ||
             item.InputMode == "F1" ||
             item.InputMode == "F2" ||

+ 140 - 0
src/views/ledger/cenotelist/cenoteDetail/index.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="box">
+    <div class="condition">
+      <div class="header">
+        <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
+        <span>{{params.name||''}}</span>
+      </div>
+      <el-row class="spaceTypes">
+        <div class="types">
+          <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"></el-tab-pane>
+            </template>
+          </el-tabs>
+        </div>
+        <div class="deleBtn">
+          <el-button size="small" @click="deleteCenote">删除竖井</el-button>
+        </div>
+      </el-row>
+      <!-- 竖井内的设备 -->
+      <device-table v-if="activeTab=='device'" :params="params" :type="activeTab"></device-table>
+      <!-- 连通的其他竖井 -->
+      <cenote-table v-else-if="activeTab=='cenote'" :params="params" :type="activeTab"></cenote-table>
+      <!-- 竖井内系统 -->
+      <system-table v-else-if="activeTab=='system'" :params="params" :type="activeTab"></system-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex"
+import { deleteCenoteTableData } from '@/api/scan/request'
+import cenoteTable from '@/components/ledger/cenote/table/cenoteTable'
+import deviceTable from '@/components/ledger/cenote/table/deviceTable'
+import systemTable from '@/components/ledger/cenote/table/systemTable'
+export default {
+  data() {
+    return {
+      params: {},
+      tabsList: [
+        { Code: 'device', Name: '竖井内的设备' },
+        { Code: 'cenote', Name: '连通的其它竖井' },
+        { Code: 'system', Name: '竖井内系统' },
+      ], //tab页
+      activeTab: 'device' //当前选中的tab
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId", "userId", "secret"])
+  },
+  components: {
+    cenoteTable,
+    deviceTable,
+    systemTable
+  },
+  created() {
+    this.params = this.$route.query;
+  },
+  mounted() { },
+  watch: {
+    projectId() { }
+  },
+  methods: {
+    // 返回
+    goBack() {
+      this.$router.push({ name: "cenotelist" })
+    },
+    // 删除业务空间
+    deleteCenote() {
+      this.$confirm("此操作将删除竖井,是否继续?", "提示", {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteCenoteTableData([{ShaftID: this.params.ShaftID}], res => {
+          this.$message.success('删除成功')
+          this.goBack()
+        })
+      }).catch(() => {
+        this.$message("取消删除")
+      })
+    }
+  }
+};
+</script>
+
+<style scoped lang='less'>
+.box {
+  .condition {
+    padding: 10px;
+    display: flex;
+    height: 100%;
+    flex-direction: column;
+    border: 1px solid #dfe6ec;
+    background: #fff;
+    margin-bottom: 10px;
+    .header {
+      padding-bottom: 10px;
+      span {
+        line-height: 33px;
+        margin-left: 15px;
+      }
+    }
+    .spaceTypes {
+      .types {
+        float: left;
+        width: calc(100% - 200px);
+        /deep/ .el-tabs__item.is-top {
+          border-top: 2px solid transparent;
+          &.is-active {
+            border-top: 2px solid #409eff;
+          }
+        }
+      }
+      .deleBtn {
+        float: left;
+        width: 200px;
+        text-align: right;
+        height: 40px;
+        border-bottom: 1px solid #e4e7ed;
+      }
+    }
+    .main {
+      margin-top: 10px;
+      height: calc(100% - 96px);
+    }
+    .footer {
+      margin-bottom: 10px;
+    }
+  }
+}
+</style>
+
+<style lang="less">
+.el-table th {
+  background-color: #d9d9d9;
+  color: #000;
+}
+</style>
+

+ 6 - 6
src/views/ledger/cenotelist/cenoteadd/index.vue

@@ -2,6 +2,9 @@
   <div id="deviceList">
     <el-row class="right">
       <!-- <span style="float:left;">当前选择的部件类型:{{page.total || '--'}}</span> -->
+      <el-select v-model="showType" @change="initTable" style="width:125px;margin-right:10px;vertical-align:bottom;">
+        <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
       <span>增加</span>
       <el-input v-model="addNum" style="width:50px;" size="small"></el-input>
       <span>个竖井</span>
@@ -44,18 +47,15 @@ export default {
       isTableRightShow: false,
       relationids: "",
       onlyRead: false,
-      showType: "all",
+      showTypes: [{ value: "Visible", label: '只看采集信息' }, { value: "all", label: '全部' }],
+      showType: "Visible",
       tableHeader: [],
       tableData: session.get("cenoteAddData")? session.get("cenoteAddData").length? session.get("cenoteAddData"): [{}]: [{}],
       copyTableData: []
     };
   },
   computed: {
-    ...mapGetters("layout", [
-        "projectId",
-        "secret",
-        "userId"
-    ])
+    ...mapGetters("layout", [ "projectId", "secret", "userId" ])
   },
   created() {
     this.getTableHeader()

+ 69 - 3
src/views/ledger/cenotelist/index.vue

@@ -55,6 +55,19 @@
       layout="total, sizes, prev, pager, next, jumper"
       :total="page.total">
     </el-pagination>
+    <!-- 不支持的输入方式 -->
+    <el-dialog title="临时维护信息点" :visible.sync="myDialog.update" @close="handleCloseUpdate" width="670px">
+      <el-row>
+        该信息点未定义对应组件,现在维护数据不确定后续是否可用。如确实需要维护,请点击<el-link @click="updateInputShow = true" type="primary" :underline="false">继续维护</el-link>。
+      </el-row>
+      <el-row style="margin-top:20px;" v-show="updateInputShow">
+        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8}" placeholder="请输入内容" v-model="updateInput"></el-input>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="myDialog.update = false">取 消</el-button>
+        <el-button type="primary" @click="handleClickUpdate">确 认</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -97,7 +110,14 @@ export default {
       },
       tableData: [],
       copyTableData: [],
-      tableExample:null
+      tableExample:null,
+      myDialog: {
+        update: false,//临时维护信息点
+      },
+      inputMap: { }, //信息点和输入方式映射表
+      updateInputShow: false, //是否显示临时维护输入框
+      updateInfoPoint: '',//临时维护信息点
+      updateInput: '', //临时维护信息点值
     };
   },
   computed: {
@@ -109,7 +129,7 @@ export default {
     showTypes () {
       return this.onlyRead?
         [{value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]: 
-        [{value: "partInfo", label: '隐藏信息点'}, {value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]
+        [{value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]
     }
   },
   created() {
@@ -141,6 +161,11 @@ export default {
       }
       await getDataDictionary(param, res => {
         this.tableHeader = res.Content;
+        this.tableHeader.forEach(item => {
+          if(item.Path && item.InputMode){
+            this.inputMap[item.Path] = item.InputMode
+          }
+        })
         this.getTableData()
       })
     },
@@ -290,7 +315,7 @@ export default {
     formatHeaderData(list) {//格式化表头显示的数据
       let arr = tools.copyArr(list)
       let data = showTools.headerTextFilter(arr, "shaft", this.onlyRead, this.showType)
-      data.unshift("关联的元空间");
+      data.unshift("关联的元空间", "其他关系");
       return data;
     },
     formatHeaderType(list) {//格式化表头头映射的数据
@@ -300,12 +325,22 @@ export default {
         data: "SpaceCount",
         renderer: tools.num,
         readOnly: true
+      },{
+        data: "OtheRelations",
+        renderer: (instance, td, row, col, prop, value, cellProperties) => {
+          td.style.color = "#409EFF";
+          td.style.cursor = "pointer";
+          td.innerHTML = "查看";
+          return td;
+        },
+        readOnly: true
       })
       return data;
     },
     initTable() {//实例化表格
       let settings = {
         data: this.tableData,
+        fixedColumnsLeft: 4,
         colHeaders: this.formatHeaderData(this.tableHeader),
         columns: this.formatHeaderType(this.tableHeader),
         rowHeights: 30,
@@ -332,13 +367,44 @@ export default {
     getInfors(infos, row) {
       //其他的开始判断
       let val = this.tableExample.colToProp(row.col)
+      let inputMode = this.inputMap[val]
+      let name = infos.ShaftLocalName?infos.ShaftLocalName:infos.ShaftName
       this.shaftId = infos.ShaftID //要操作的数据id
       //点击关联的元空间
       if (val === "SpaceCount") {
         this.spaceList = infos.SpaceList
         this.isTableRightShow = true
+        return false
+      } else if (val === "OtheRelations") {
+        this.$router.push({
+          path: "/ledger/cenoteDetail",
+          query: {
+            ShaftID: this.shaftId,
+            name: name
+          }
+        })
+        return false
+      }
+      if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
       }
     },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
+    //更新临时维护信息点
+    handleClickUpdate(){
+      tools.setDataForKey(this.tableData[this.row], this.updateInfoPoint, this.updateInput)
+      this.handleUpdataTable([[this.row, this.updateInfoPoint, null, this.updateInput]], "edit")
+      this.updateInputShow = false
+      this.myDialog.update = false
+      this.updateInput = ''
+    },
     //表格点击事件
     handleTdClick(el, rowArr) {
       //点击的是表头

+ 7 - 9
src/views/ledger/facility/addfacility.vue

@@ -5,10 +5,9 @@
         <i class="el-icon-fa  el-icon-fa-compass"></i>
       </span>
       <span style="float:left;">当前选择的设备类型:{{category.name}}</span>
-      <div style="width:200px;display:inline-block;text-align:left;color:gray;">
-        <span>隐藏自动填充的信息</span>
-        <el-checkbox v-model="showTypeFlag" @change="getTableHeader"></el-checkbox>
-      </div>
+      <el-select v-model="showType" @change="initTable" style="width:125px;margin-right:10px;vertical-align:bottom;">
+        <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
       <span>增加</span>
       <el-input v-model="addNum" style="width:50px;" size="small"></el-input>
       <span>个{{category.name}}</span>
@@ -95,6 +94,7 @@ export default {
     return {
       addNum: 1,
       onlyRead: false,
+      showTypes: [{ value: "partInfo", label: '隐藏信息点' }, { value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }],
       tableHeader: [],
       tableData: session.get("deviceAddData")
         ? session.get("deviceAddData").length
@@ -128,7 +128,7 @@ export default {
       systemId: null,
       graphyId: null,
       id: 0,
-      showTypeFlag: true,
+      showType: 'partInfo',
       EquipmentList: [],
       firmId: "", //品牌型号所需字段--族id三位编码(传设备类id或部件类id)
       buildFloorData: [],
@@ -342,8 +342,7 @@ export default {
     //格式化表头显示的数据
     formatHeaderData(list) {
       let arr = tools.copyArr(list);
-      let showType = this.showTypeFlag ? 'partInfo' : 'all';
-      let data = showTools.headerTextFilter(arr, 'equipment', this.onlyRead, showType, true);
+      let data = showTools.headerTextFilter(arr, 'equipment', this.onlyRead, this.showType, true);
       data.unshift("同时创建资产", "所属系统实例");
       if (this.floorFlag) {
         data.splice(1, 0, "所属建筑楼层")
@@ -353,8 +352,7 @@ export default {
     formatHeaderType(list) {
       //格式化表头头映射的数据
       let arr = tools.copyArr(list);
-      let showType = this.showTypeFlag ? 'partInfo' : 'all';
-      let data = showTools.headerTypeFilter(arr, 'equipment', this.onlyRead, showType, true);
+      let data = showTools.headerTypeFilter(arr, 'equipment', this.onlyRead, this.showType, true);
       data.unshift({
         type: "checkbox",
         checkedTemplate: 1,

+ 281 - 0
src/views/ledger/facility/batchlink.vue

@@ -0,0 +1,281 @@
+<template>
+  <div class="box">
+    <div class="condition">
+      <div class="header">
+        <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
+        <span class="statistics-title">发现未关联资产的设备:<b>{{unlinkNumber}}</b></span>
+        <span class="statistics-title">可在此功能中批量关联的:<b>{{linkNumber}}</b></span>
+        <el-button style="float:right;margin-top:1px;" @click="handleClickCreate">保存选定的设备资产关联关系</el-button>
+        <el-button v-show="Object.keys(radio).length" style="float:right;margin-top:1px;margin-right:15px;" @click="handleClickReset">重置</el-button>
+      </div>
+      <div class="main">
+        <el-table ref="multipleTable" :data="tableData" v-loading='loading' stripe height="100%" :span-method="objectSpanMethod" :header-cell-style="headerStyle">
+          <el-table-column prop="EquipLocalName" label="设备本地名称" show-overflow-tooltip max-width="150">
+            <!-- <template slot-scope="scope">{{ scope.row.EquipLocalName?scope.row.EquipLocalName:scope.row.EquipName }}</template> -->
+          </el-table-column>
+          <el-table-column prop="EquipLocalID" label="设备本地编码" show-overflow-tooltip max-width="150">
+            <!-- <template slot-scope="scope">{{ scope.row.EquipLocalID?scope.row.EquipLocalID:scope.row.EquipID }}</template> -->
+          </el-table-column>
+          <el-table-column prop="Category" label="设备类" show-overflow-tooltip width="100"></el-table-column>
+          <el-table-column prop="CADID" label="设计图纸中编码" show-overflow-tooltip max-width="150"></el-table-column>
+          <el-table-column label="所属建筑楼层">
+            <template slot-scope="scope">{{ scope.row.BuildingId }}-{{ scope.row.FloorId }}</template>
+          </el-table-column>
+          <el-table-column prop="PropertyItem.EquipLocalName" label="资产本地名称" show-overflow-tooltip max-width="150">
+            <!-- <template slot-scope="scope">{{ scope.row.AssetsLocalName }}</template> -->
+          </el-table-column>
+          <el-table-column prop="PropertyItem.EquipLocalID" label="资产本地编码" show-overflow-tooltip max-width="150">
+            <!-- <template slot-scope="scope">{{ scope.row.AssetsLocalId }}</template> -->
+          </el-table-column>
+          <el-table-column prop="PropertyItem.Family" label="设备族" show-overflow-tooltip width="100"></el-table-column>
+          <el-table-column prop="PropertyItem.CADID" label="设计图纸中编码" show-overflow-tooltip max-width="150"></el-table-column>
+          <el-table-column label="所属建筑楼层" show-overflow-tooltip width="200">
+            <template slot-scope="scope">{{ scope.row.PropertyItem.BuildingId }}-{{ scope.row.PropertyItem.FloorId }}</template>
+          </el-table-column>
+          <el-table-column prop="address" label="操作" width="100">
+            <template slot-scope="scope">
+              <el-radio v-model="radio[scope.row.EquipID]" :label="scope.row.PropertyItem.EquipID" :disabled="scope.row.disabled" @change="handleChangeLink(scope.row)">&nbsp;</el-radio>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <!-- <div class=footer>
+        <el-pagination
+          class="right"
+          v-show="tableData && tableData.length"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.pageNumber"
+          :page-sizes="page.pageSizes"
+          :page-size="page.pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="page.total">
+        </el-pagination>
+      </div> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex"
+//api
+import { countEquip, equipCategoryProperty, equipRproperty } from "@/api/scan/request";
+
+export default {
+  components: {
+    
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId", "userId", "secret"])
+  },
+  created() {
+    this.params = this.$route.params
+    this.getTableData()
+  },
+  data() {
+    return {
+      params: {},
+      loading: false,
+      unlinkNumber: 0,
+      linkNumber: 0,
+      // page: {
+      //   pageSize: 50,
+      //   pageSizes: [10, 20, 50, 100],
+      //   pageNumber: 1,
+      //   total: 0
+      // },
+      radio: {},
+      tableData: [],
+      mergeCol: [],
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      }, // 列表样式
+    }
+  },
+  methods: {
+    //获取表格数据
+    getTableData() {
+      this.loading = true
+      this.tableData = []
+      let param = this.formatFilter()
+      equipCategoryProperty(param, res => {
+        this.unlinkNumber = res.Total
+        this.linkNumber = res.Content.length
+        // this.page.total = res.Total
+        res.Content.forEach(item =>{
+          if(item.PropertyList && item.PropertyList.length){
+            item.PropertyList.forEach((Assets, index) => {
+              let obj = JSON.parse(JSON.stringify(Object.assign(item, {PropertyItem: Assets, disabled: false})))
+              delete obj.PropertyList
+              this.tableData.push(obj)
+              if(index == 0){
+                this.mergeCol.push(item.PropertyList.length)
+              } else {
+                this.mergeCol.push(false)
+              }
+            })
+          }
+        })
+        this.loading = false
+      })
+    },
+    //格式化条件
+    formatFilter() {
+      let param = {
+          data: {
+          //   Cascade: [
+          //   {
+          //     Name: "equipCategory",
+          //     Projection: ["EquipCode", "EquipName"]
+          //   },
+          //   {
+          //     Name: "building",
+          //     Projection: [ "BuildLocalName", "BuildName", "BuildID" ]
+          //   },
+          //   {
+          //     Name: "floor",
+          //     Projection: [ "FloorLocalName", "FloorName", "FloorID" ]
+          //   }
+          // ],
+          Orders: "createTime desc, EquipID asc",
+          PageNumber: 1,
+          PageSize: 1000
+        },
+        category: this.params.deviceType
+      }
+
+      if (this.params.buildFloor[0] == "noKnow") {
+        param.data.Filters = `buildingId isNull`
+      } else if (this.params.buildFloor[0] && this.params.buildFloor[0] != "all") {
+        param.data.Filters = `buildingId='${this.params.buildFloor[0]}'`
+        if (this.params.buildFloor[1] == "noKnow") {
+          param.data.Filters += `;floorId isNull`
+        } else if (this.params.buildFloor[1] && this.params.buildFloor[1] != "all") {
+          param.data.Filters += `;floorId='${this.params.buildFloor[1]}'`
+        }
+      }
+      if(this.params.hasOwnProperty('spaceList')){
+        if(typeof this.params.spaceList == 'string'){
+          param.spaceIdList = `&spacrType=${this.params.spaceList}`
+        } else {
+          let spaceIdList = ''
+          this.params.spaceList.forEach(item => {
+            spaceIdList += `&spaceIdList=${item}`
+          })
+          param.spaceIdList = spaceIdList
+        }
+      }
+      return param
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex < 5) {
+        if (this.mergeCol[rowIndex]) {
+          return {
+            rowspan: this.mergeCol[rowIndex],
+            colspan: 1
+          };
+        } else {
+          return {
+            rowspan: 0,
+            colspan: 1
+          };
+        }
+      }
+    },
+    //切换关联
+    handleChangeLink(row) {
+      this.tableData.forEach(item => {
+        item.disabled = false
+        if(Object.keys(this.radio).length){
+          for(let key in this.radio){
+            if(item.EquipID != key && item.PropertyItem.EquipID == this.radio[key]){
+              item.disabled = true
+            }
+          }
+        }
+      })
+    },
+    //重置关联选择
+    handleClickReset() {
+      this.tableData.forEach(item => {
+        item.disabled = false
+      })
+      this.radio = {}
+    },
+    //创建已选
+    handleClickCreate() {
+      let params = {
+        Content: []
+      }
+      if(Object.keys(this.radio).length){
+        for(let key in this.radio){
+          params.Content.push({
+            EquipId: this.radio[key],
+            EquipmentId: key
+          })
+        }
+        equipRproperty(params, res => {
+          this.radio = {}
+          this.getTableData()
+          this.$message.success('关联成功!')
+        })
+      } else {
+        this.$message.info('请选择要关联的关系!')
+      }
+    },
+    //切换每页显示多少条数据
+    // handleSizeChange(val) {
+    //   this.page.pageSize = val
+    //   this.getTableData()
+    // },
+    //切换页数
+    // handleCurrentChange(val) {
+    //   this.page.pageNumber = val
+    //   this.getTableData()
+    // },
+    //返回
+    goBack() {
+      this.$router.push({ name: "facilityLedger" })
+    }
+  },
+  watch: {
+    projectId() {
+      this.$router.push({ name: "facilityLedger" })
+    }
+  }
+};
+</script>
+
+<style scoped lang='less'>
+.box {
+  .condition {
+    padding: 10px;
+    display: flex;
+    height: 100%;
+    flex-direction: column;
+    border: 1px solid #dfe6ec;
+    background: #fff;
+    .header{
+      padding-bottom: 10px;
+      border-bottom: 1px solid #bcbcbc;
+      .statistics-title{
+        margin-left: 20px;
+        line-height: 32px;
+      }
+    }
+    .main{
+      margin-top: 10px;
+      height: calc(100% - 46px);
+    }
+  }
+}
+</style>
+
+<style lang="less">
+.el-table th {
+  background-color: #d9d9d9;
+  color: #000;
+}
+</style>

+ 21 - 8
src/views/ledger/facility/index.vue

@@ -7,10 +7,12 @@
       <div class="search-header">
         <floor-cascader @change="changeFloor"></floor-cascader>
         <my-cascader ref="cascader" @change="changeDevice"></my-cascader>
+        <el-button size="small" @click="handleLinkAssets" class="iconfont icon-batchassociation">批量关联资产</el-button>
       </div>
       <hanson-table @close="close" :graphyId="graphyId" ref="tableMain"></hanson-table>
     </div>
     <!-- <table-transfers></table-transfers> -->
+    <linkassets-dialog :dialog="dialog"></linkassets-dialog>
   </div>
 </template>
 <script>
@@ -19,6 +21,7 @@ import floorCascader from "@/components/ledger/lib/floorCascader";
 import myCascader from "@/components/ledger/lib/cascader";
 import hansonTable from "@/components/ledger/handsontables/device";
 import tableTransfers from "@/components/ledger/tableTransfers";
+import linkassetsDialog from "@/components/ledger/lib/linkassets";
 import {
   getSpaceName,
   getGraphyId,
@@ -35,7 +38,8 @@ export default {
     floorCascader,
     myCascader,
     hansonTable,
-    tableTransfers
+    tableTransfers,
+    linkassetsDialog
   },
   data() {
     return {
@@ -60,16 +64,14 @@ export default {
         secret: ""
       },
       assetGroupList: [],
-      graphyId: null
+      graphyId: null,
+      dialog: {
+        linkAssets: false
+      }
     };
   },
   computed: {
-    ...mapGetters("layout", [
-      "projectId",
-      "projects",
-      "secret",
-      "userId"
-    ])
+    ...mapGetters("layout", [ "projectId", "projects", "secret", "userId" ])
   },
   created() {
     this.param.ProjId = this.projectId
@@ -169,6 +171,10 @@ export default {
         if (this.$refs.tableMain)
           this.$refs.tableMain.getHeaderData(this.param);
       }
+    },
+    // 批量关联资产
+    handleLinkAssets() {
+      this.dialog.linkAssets = true
     }
   }
 };
@@ -194,6 +200,13 @@ export default {
     padding-bottom: 10px;
     margin: 0 10px;
     border-bottom: 1px solid #bcbcbc;
+    .icon-batchassociation{
+      float: right;
+      font-size: 12px;
+      /deep/ span{
+        margin-left: 5px;
+      }
+    }
   }
 }
 </style>

+ 37 - 12
src/views/ledger/facility/partsmanage/index.vue

@@ -153,7 +153,7 @@ export default {
       id: 0,
       EquipmentList: [],
       firmId: "", //品牌型号所需字段--族id三位编码(传设备类id或部件类id)
-      deviceType:{}
+      deviceType: {}
     };
   },
   computed: {
@@ -245,10 +245,10 @@ export default {
       //生成要修改字段列表
       change.map((item) => {
         let key = item[1].split(".")[0]
-        if(item[1] && keyList.indexOf(key) == -1) {
+        if (item[1] && keyList.indexOf(key) == -1) {
           keyList.push(key)
         }
-        if(item[1] && item[3] == "" && param.data.Projection.indexOf(key) == -1) {
+        if (item[1] && item[3] == "" && param.data.Projection.indexOf(key) == -1) {
           param.data.Projection.push(key)
         }
       })
@@ -439,30 +439,55 @@ export default {
       tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brand)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Specification", data.name)
-      this.handleUpdataTable([[this.row, "DPManufacturerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPManufacturerID", null, data.venderId],
+          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand],
+          [this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand]], "edit")
+      // this.handleUpdataTable([[this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]], "edit")
     },
     //供应商变更
     supplierChange(data) {
       tools.setDataForKey(this.tableData[this.row], "DPSupplierID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.SupplyPurchase.Supplier", data.name)
-      this.handleUpdataTable([[this.row, "DPSupplierID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPSupplierID", null, data.venderId],
+          [this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.SupplyPurchase.Supplier", null, data.name]], "edit")
     },
     //保险商变更
     changeInsurer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPInsurerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.InsuranceDoc.Insurer", data.name)
-      this.handleUpdataTable([[this.row, "DPInsurerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPInsurerID", null, data.venderId],
+          [this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.InsuranceDoc.Insurer", null, data.name]], "edit")
     },
     //维修商变更
     changeMaintainer(data) {
       tools.setDataForKey(this.tableData[this.row], "DPMaintainerID", data.venderId)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.OperationMainte.Maintainer", data.name)
-      this.handleUpdataTable([[this.row, "DPMaintainerID", null, data.venderId]], "edit")
-      this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
+      this.handleUpdataTable(
+        [
+          [this.row, "DPMaintainerID", null, data.venderId],
+          [this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]
+        ],
+        "edit"
+      )
+      // this.handleUpdataTable([[this.row, "LedgerParam.OperationMainte.Maintainer", null, data.name]], "edit")
     },
     supplyChange(data) {
       let changeData = { id: data };

+ 7 - 9
src/views/ledger/property/addproperty.vue

@@ -2,10 +2,9 @@
   <div id="deviceList">
     <el-row class="right">
       <span style="float:left;">当前选择的设备族:{{category.name}}</span>
-      <div style="width:200px;display:inline-block;text-align:left;color:gray;">
-        <span>隐藏自动填充的信息</span>
-        <el-checkbox v-model="showTypeFlag" @change="getTableHeader"></el-checkbox>
-      </div>
+      <el-select v-model="showType" @change="initTable" style="width:125px;margin-right:10px;vertical-align:bottom;">
+        <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
       <span>增加</span>
       <el-input v-model="addNum" style="width:50px;" size="small"></el-input>
       <span>个{{category.name}}</span>
@@ -78,6 +77,7 @@ export default {
     return {
       addNum: 1,
       onlyRead: false,
+      showTypes: [{ value: "partInfo", label: '隐藏信息点' }, { value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }],
       buildFloorData: [],
       tableHeader: [],
       tableData: session.get("propertyAddData")
@@ -109,7 +109,7 @@ export default {
       systemId: null,
       graphyId: null,
       id: 0,
-      showTypeFlag: true,
+      showType: 'partInfo',
       EquipmentList: []
     };
   },
@@ -226,16 +226,14 @@ export default {
     //格式化表头显示的数据
     formatHeaderData(list) {
       let arr = tools.copyArr(list)
-      let showType = this.showTypeFlag?'partInfo':'all'
-      let data = showTools.headerTextFilter(arr, 'property', this.onlyRead, showType, true)
+      let data = showTools.headerTextFilter(arr, 'property', this.onlyRead, this.showType, true)
       data.unshift("所属建筑楼层")
       return data
     },
     //格式化表头头映射的数据
     formatHeaderType(list) {
       let arr = tools.copyArr(list)
-      let showType = this.showTypeFlag?'partInfo':'all'
-      let data = showTools.headerTypeFilter(arr, 'property', this.onlyRead, showType, true)
+      let data = showTools.headerTypeFilter(arr, 'property', this.onlyRead, this.showType, true)
       data.unshift({
         data: "flowBuild",
         renderer: tools.customDropdownRenderer,

+ 54 - 5
src/views/ledger/rentlist/index.vue

@@ -69,6 +69,19 @@
       layout="total, sizes, prev, pager, next, jumper"
       :total="page.total">
     </el-pagination>
+    <!-- 不支持的输入方式 -->
+    <el-dialog title="临时维护信息点" :visible.sync="myDialog.update" @close="handleCloseUpdate" width="670px">
+      <el-row>
+        该信息点未定义对应组件,现在维护数据不确定后续是否可用。如确实需要维护,请点击<el-link @click="updateInputShow = true" type="primary" :underline="false">继续维护</el-link>。
+      </el-row>
+      <el-row style="margin-top:20px;" v-show="updateInputShow">
+        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8}" placeholder="请输入内容" v-model="updateInput"></el-input>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="myDialog.update = false">取 消</el-button>
+        <el-button type="primary" @click="handleClickUpdate">确 认</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -111,7 +124,16 @@ export default {
         total: 0
       },
       tableData: [],
-      copyTableData: []
+      copyTableData: [],
+      myDialog: {
+        update: false,//临时维护信息点
+      },
+      inputMap: {
+        FloorId: 'B1'
+      }, //信息点和输入方式映射表
+      updateInputShow: false, //是否显示临时维护输入框
+      updateInfoPoint: '',//临时维护信息点
+      updateInput: '', //临时维护信息点值
     };
   },
   computed: {
@@ -123,7 +145,7 @@ export default {
     showTypes () {
       return this.onlyRead?
         [{value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]: 
-        [{value: "partInfo", label: '隐藏信息点'}, {value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]
+        [{value: "Visible", label: '只看采集信息'}, {value: "all", label: '全部'}]
     }
   },
   created() {
@@ -158,6 +180,11 @@ export default {
       }
       await getDataDictionary(param, res => {
         this.tableHeader = res.Content;
+        this.tableHeader.forEach(item => {
+          if(item.Path && item.InputMode){
+            this.inputMap[item.Path] = item.InputMode
+          }
+        })
         this.getTableData()
       })
     },
@@ -360,14 +387,16 @@ export default {
     //获取到了正确的信息
     getInfors(infos, row) {
       //其他的开始判断
-      let val = this.tableExample.colToProp(row.col);
+      let val = this.tableExample.colToProp(row.col)
+      let inputMode = this.inputMap[val]
       this.row = row.row //要操作的列号
       this.messKey = val //要操作的列类型
       this.tenantID = infos.TenantID //要操作的数据id
       //点击操作跳转详情
       if (val === "caozuo") {
-
-        window.open(`${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.tenantID}&type=0&code=VOTn`,"_blank")
+        this.$message("开发中!")
+        // window.open(`${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.tenantID}&type=0&code=VOTn`,"_blank")
+        return false
       }
       //点击关联的元空间
       if (val === "RoomCount") {
@@ -377,7 +406,27 @@ export default {
           this.roomId = ""
         }
         this.isTableRightShow = true;
+        return false
       }
+      if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
+      }
+    },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
+    //更新临时维护信息点
+    handleClickUpdate(){
+      tools.setDataForKey(this.tableData[this.row], this.updateInfoPoint, this.updateInput)
+      this.handleUpdataTable([[this.row, this.updateInfoPoint, null, this.updateInput]], "edit")
+      this.updateInputShow = false
+      this.myDialog.update = false
+      this.updateInput = ''
     },
     //表格点击事件
     handleTdClick(el, rowArr) {

+ 6 - 6
src/views/ledger/rentlist/rentadd/index.vue

@@ -2,6 +2,9 @@
   <div id="deviceList">
     <el-row class="right">
       <!-- <span style="float:left;">当前选择的部件类型:{{page.total || '--'}}</span> -->
+      <el-select v-model="showType" @change="initTable" style="width:125px;margin-right:10px;vertical-align:bottom;">
+        <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
       <span>增加</span>
       <el-input v-model="addNum" style="width:50px;" size="small"></el-input>
       <span>个租户</span>
@@ -43,18 +46,15 @@ export default {
       isTableRightShow: false,
       relationids: "",
       onlyRead: false,
-      showType: "all",
+      showTypes: [{ value: "partInfo", label: '隐藏信息点' }, { value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }],
+      showType: "partInfo",
       tableHeader: [],
       tableData: session.get("rentAddData")? session.get("rentAddData").length? session.get("rentAddData"): [{}]: [{}],
       copyTableData: []
     };
   },
   computed: {
-    ...mapGetters("layout", [
-        "projectId",
-        "secret",
-        "userId"
-    ])
+    ...mapGetters("layout", [ "projectId", "secret", "userId" ])
   },
   created() {
     this.getTableHeader()

+ 12 - 10
src/views/ledger/spacelist/index.vue

@@ -114,17 +114,12 @@ export default {
       floorToMap: {}, //楼层及其对应的模型图
       FloorMap: "", //当前选中的楼层平面图
       buildFloorSelectd: [], //当前所选的建筑楼层
+      childBackParam: {}
     };
   },
   created() {
     this.init();
-    let params = this.$route.params;
-    if (params.BuildingId) {
-      this.buildFloorSelectd = [params.BuildingId, params.FloorId];
-      this.activeName = params.zone;
-      this.isMyTab = params.isMyTab;
-      this.changeRadio(this.isMyTab)
-    }
+    this.childBackParam = this.$route.params;
   },
   mounted() { },
   methods: {
@@ -153,6 +148,9 @@ export default {
           }
           return t;
         })
+        if (this.childBackParam.zone) {
+          this.changeCascader(this.buildFloorSelectd)
+        }
       })
     },
     // 切换平面图和列表
@@ -166,9 +164,13 @@ export default {
       }
       queryDictionaryHead(pa, res => {
         this.tabsList = res.Content;
-        console.log(this.activeName == '0')
-        console.log(this.activeName == '0' ? 'GeneralZone' : this.activeName)
-        this.activeName = this.activeName == '0' ? 'GeneralZone' : this.activeName;
+        if (this.childBackParam.zone) {
+          this.activeName = this.childBackParam.zone;
+          this.buildFloorSelectd = [this.childBackParam.BuildingId, this.childBackParam.FloorId];
+          this.isMyTab = this.childBackParam.isMyTab;
+        } else {
+          this.activeName = 'GeneralZone';
+        }
       })
     },
     // 通过选中的tab-Code 获取选中的tab的所有数据

+ 7 - 9
src/views/ledger/system/addsystem.vue

@@ -5,10 +5,9 @@
         <i class="el-icon-fa  el-icon-fa-compass"></i>
       </span>
       <span style="float:left;">当前选择的系统类型:{{category.CategoryName}}</span>
-      <div style="width:200px;display:inline-block;text-align:left;color:gray;">
-        <span>隐藏自动填充的信息</span>
-        <el-checkbox v-model="showTypeFlag" @change="getTableHeader"></el-checkbox>
-      </div>
+      <el-select v-model="showType" @change="initTable" style="width:125px;margin-right:10px;vertical-align:bottom;">
+        <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
       <span>增加</span>
       <el-input v-model="addNum" style="width:50px;" size="small"></el-input>
       <span>个{{category.CategoryName}}</span>
@@ -54,6 +53,7 @@ export default {
     return {
       addNum: 1,
       onlyRead: false,
+      showTypes: [{ value: "partInfo", label: '隐藏信息点' }, { value: "all", label: '全部' }, { value: "Visible", label: '只看采集信息' }],
       tableHeader: [],
       tableData: session.get("systemAddData")
         ? session.get("systemAddData").length
@@ -86,7 +86,7 @@ export default {
       systemId: null,
       graphyId: null,
       id: 0,
-      showTypeFlag: true,
+      showType: 'partInfo',
       EquipmentList: [],
     };
   },
@@ -236,16 +236,14 @@ export default {
     //格式化表头显示的数据
     formatHeaderData(list) {
       let arr = tools.copyArr(list);
-      let showType = this.showTypeFlag ? 'partInfo' : 'all';
-      let data = showTools.headerTextFilter(arr, 'system', this.onlyRead, showType);
+      let data = showTools.headerTextFilter(arr, 'system', this.onlyRead, this.showType);
       data.unshift("所属建筑");
       return data;
     },
     formatHeaderType(list) {
       //格式化表头头映射的数据
       let arr = tools.copyArr(list);
-      let showType = this.showTypeFlag ? 'partInfo' : 'all';
-      let data = showTools.headerTypeFilter(arr, 'system', this.onlyRead, showType);
+      let data = showTools.headerTypeFilter(arr, 'system', this.onlyRead, this.showType);
       data.unshift({
         data: "flowBuild",
         renderer: tools.customDropdownRenderer,

+ 21 - 60
src/views/model/file/index.vue

@@ -23,17 +23,9 @@
             <div class="head">模型文件夹</div>
             <ul class="lists">
               <el-scrollbar style="height:100%;">
-                <li
-                  @click="openFolder(index,item)"
-                  v-for="(item,index) in navigationModel"
-                  :key="index"
-                  :class="[choiceIndex == index + 1 ? 'li-active' : '']"
-                >
-                  <i
-                    :class="[choiceIndex == index + 1 ?  'el-icon-folder-opened':'el-icon-folder','icon_font']"
-                    width="40"
-                    height="40"
-                  ></i>
+                <li @click="openFolder(index,item)" v-for="(item,index) in navigationModel" :key="index"
+                  :class="[choiceIndex == index + 1 ? 'li-active' : '']">
+                  <i :class="[choiceIndex == index + 1 ?  'el-icon-folder-opened':'el-icon-folder','icon_font']" width="40" height="40"></i>
                   <span>{{item.Name}}</span>
                 </li>
               </el-scrollbar>
@@ -44,66 +36,35 @@
     </el-col>
     <!-- 右边文件表格 -->
     <el-col class="col_left" :span="19">
-      <el-card class="box-card" :body-style="{ padding: '0px' }">
+      <el-card class="box-card" :body-style="{ padding: '0px', height:'100%' }">
         <!-- 顶部操作栏 -->
         <div class="top_hand right_top_hand">
           <el-button @click="addFloorFile">添加楼层文件</el-button>
           <el-button @click="queryFloorFile(currentFolderId)">刷新</el-button>
         </div>
         <!-- 列表 -->
-        <floorTable
-          ref="floorTable"
-          :tableData="tableData"
-          :modelFolderName="currentFolderName"
-          @openModelLog="queryModelLog"
-          @replaceModel="repliaceModel"
-          @closeUpdateFile="removePersentList"
-          @percentFinish="queryFloorFile(currentFolderId)"
-          :persentList="persentList"
-        ></floorTable>
+        <floorTable ref="floorTable" :tableData="tableData" :modelFolderName="currentFolderName" @openModelLog="queryModelLog"
+          @replaceModel="repliaceModel" @closeUpdateFile="removePersentList" @percentFinish="queryFloorFile(currentFolderId)"
+          :persentList="persentList"></floorTable>
       </el-card>
     </el-col>
     <!-- 弹窗 开始-->
 
     <!-- 模型日志弹窗 -->
-    <modelLog
-      :modelLogVisible="modelLogVisible"
-      :modelFolderName="currentFolderName"
-      @deleteFinish="updataLog"
-      @CloseModelLogDia="modelLogVisible=false"
-      :logData="logData"
-    ></modelLog>
+    <modelLog :modelLogVisible="modelLogVisible" :modelFolderName="currentFolderName" @deleteFinish="updataLog"
+      @CloseModelLogDia="modelLogVisible=false" :logData="logData"></modelLog>
     <!-- 替换模型弹窗 -->
-    <repliceModel
-      :repliceModelVisible="repliceModelVisible"
-      @closeReplaceModelDia="repliceModelVisible=false"
-      :replaceModelItem="replaceModelItem"
-      @updataModel="updateModelFile"
-    ></repliceModel>
+    <repliceModel :repliceModelVisible="repliceModelVisible" @closeReplaceModelDia="repliceModelVisible=false" :replaceModelItem="replaceModelItem"
+      @updataModel="updateModelFile"></repliceModel>
     <!-- 新增楼层 -->
-    <addFloorDialog
-      :addFloorFileVisible="addFloorFileVisible"
-      :floorList="tableData"
-      :FolderName="currentFolderName"
-      :FolderId="currentFolderId"
-      @closeAddFloorDia="addFloorFileVisible=false"
-      @finishCreateFloor="uploadModelFIle"
-    ></addFloorDialog>
+    <addFloorDialog :addFloorFileVisible="addFloorFileVisible" :floorList="tableData" :FolderName="currentFolderName" :FolderId="currentFolderId"
+      @closeAddFloorDia="addFloorFileVisible=false" @finishCreateFloor="uploadModelFIle"></addFloorDialog>
     <!-- 新增文件夹名称 -->
-    <addFolder
-      :addFolderVisible="addFolderVisible"
-      @closeAddFolderVisible="addFolderVisible=false;folderName=''"
-      :folderName="folderName"
-      @getfolderModel="queryModel"
-    ></addFolder>
+    <addFolder :addFolderVisible="addFolderVisible" @closeAddFolderVisible="addFolderVisible=false;folderName=''" :folderName="folderName"
+      @getfolderModel="queryModel"></addFolder>
     <!-- 编辑文件夹名字 -->
-    <changeFolderName
-      :currentFolderId="currentFolderId"
-      :changeFolderNameVisible="changeFolderNameVisible"
-      :folderName="folderName"
-      @finishChangeFolderName="queryModel"
-      @closeChangeFolderVisible="changeFolderNameVisible=false;folderName=''"
-    ></changeFolderName>
+    <changeFolderName :currentFolderId="currentFolderId" :changeFolderNameVisible="changeFolderNameVisible" :folderName="folderName"
+      @finishChangeFolderName="queryModel" @closeChangeFolderVisible="changeFolderNameVisible=false;folderName=''"></changeFolderName>
     <!-- 弹窗 结束-->
   </div>
 </template>
@@ -119,7 +80,7 @@ import changeFolderName from "@/components/model/file/changeFolderName"; //编
 import floorTable from "@/components/model/file/floorTable"; //右侧list表
 export default {
   // 离开此页面前要判断是是否有下载
-  beforeRouteLeave: function(to, from, next) {
+  beforeRouteLeave: function (to, from, next) {
     console.log(this.uploadClassList);
     if (this.uploadClassList.length) {
       this.$alert(
@@ -247,7 +208,7 @@ export default {
       request.queryModel("", res => {
         this.navigationModel = res.Content;
         this.loading = false;
-        if(this.navigationModel.length){
+        if (this.navigationModel.length) {
           //默认选择第一个文件夹
           this.choiceIndex = 1;
           this.currentFolderName = this.navigationModel[0].Name;
@@ -289,7 +250,7 @@ export default {
               if (this.persentList.length != 0) {
                 this.persentList.forEach(pItem => {
                   if (item.Id == pItem.Id) {
-                    Object.assign(item, { isDown: true, precent: pItem.precent?pItem.precent:0 });
+                    Object.assign(item, { isDown: true, precent: pItem.precent ? pItem.precent : 0 });
                   }
                 });
               }
@@ -551,7 +512,7 @@ export default {
   watch: {
     uploadClassList: {
       deep: true,
-      handler: function(val) {
+      handler: function (val) {
         console.log(val);
       }
     },

+ 1 - 1
src/views/point/dynamicdata/index.vue

@@ -3,7 +3,7 @@
     <!-- tab分页 -->
     <el-row class="top-tab" v-show="typeList.length">
       <el-tabs v-model="curType" type='card'>
-        <el-tab-pane v-for="(item) in typeList" :key="item.Name" :label="item.Name+'('+item.Sum+'/'+item.Rcount+')'" :name="item.Name">
+        <el-tab-pane v-for="(item) in typeList" :key="item.Name" :label="item.Name+'('+item.Sum+''+item.Rcount+')'" :name="item.Name">
         </el-tab-pane>
       </el-tabs>
       <div class="pos-right">

+ 1 - 1
src/views/ready/buildfloor/addFloor/index.vue

@@ -4,7 +4,7 @@
       <formItems :type="'Floor'" ref="formItems"></formItems>
     </div>
     <span slot="footer" class="dialog-footer">
-      <el-button size="small">取消</el-button>
+      <el-button size="small" @click="dialogVisible=false">取消</el-button>
       <el-button size="small" type="primary" @click="confirm">确认</el-button>
     </span>
   </el-dialog>

+ 7 - 6
src/views/ready/buildfloor/drawGraphy/drawFloor.vue

@@ -72,8 +72,10 @@ export default {
           that.view.scene = that.drawMainScene
           that.view.fitSceneToView();
           that.canvasLoading = false;
-          that.view.maxScale = that.view.scale * 1000;
-          that.$refs.canvasFun.maxScale = that.view.maxScale;
+          that.view.maxScale = that.view.scale * 10;
+          that.view.minScale = that.view.scale;
+          that.$refs.canvasFun.everyScale = that.view.scale;
+          that.drawMainScene.isSpaceSelectable = false;
           if (that.OutlineFlag) {
             this.getFloorData()
           }
@@ -124,7 +126,7 @@ export default {
     },
     // 保存为svg
     saveSvg() {
-      this.view.saveSceneSvg(`${this.floor}.png`, 6400, 4800);
+      this.view.saveSceneSvg(`${this.floor}.svg`, 6400, 4800);
     },
     // 切割划分
     divide() {
@@ -132,7 +134,6 @@ export default {
     },
     // 清除切割划分
     clearDivide() {
-      console.log(this.drawMainScene)
       this.drawMainScene.clearSceneMark()
     },
     // 撤销
@@ -143,7 +144,7 @@ export default {
     redo() { },
     // 缩放
     scale(val) {
-      let scale = this.view.scale
+      let scale = this.view.scale;
       this.view.scaleByPoint(val / scale, this.cadWidth / 2, this.cadHeight / 2)
     },
   },
@@ -151,7 +152,7 @@ export default {
     "view.scale": {
       handler(n) {
         if (this.$refs.canvasFun) {
-          this.$refs.canvasFun.sliderVal = n;
+          this.$refs.canvasFun.sliderVal = n * 10 / this.view.minScale;
         }
       }
     }