Bläddra i källkod

Merge branch 'msg-sever' of http://39.106.8.246:3003/web/ibms into msg-sever

LXXXY 5 år sedan
förälder
incheckning
f6e093963e
71 ändrade filer med 3755 tillägg och 756 borttagningar
  1. 7 0
      config/index.js
  2. 6 6
      config/prod.env.js
  3. 4 4
      package.json
  4. 20 0
      src/api/data_admin/buildTaskApi.js
  5. 56 0
      src/api/msgsever.js
  6. 17 0
      src/api/scan/request.js
  7. 94 6
      src/assets/style/iconfont/iconfont.css
  8. BIN
      src/assets/style/iconfont/iconfont.eot
  9. 66 0
      src/assets/style/iconfont/iconfont.svg
  10. BIN
      src/assets/style/iconfont/iconfont.ttf
  11. BIN
      src/assets/style/iconfont/iconfont.woff
  12. 86 11
      src/components/business_space/business/handsontable.vue
  13. 2 0
      src/components/business_space/newAddDialogs/addEquipDialog.vue
  14. 26 7
      src/components/business_space/newGraphy/canvasFun.vue
  15. 76 22
      src/components/business_space/newGraphy/graphy.vue
  16. 1 0
      src/components/common/myPagination.vue
  17. 18 2
      src/components/config_point/select_one.vue
  18. 129 40
      src/components/config_point/step3_point/3_temps.vue
  19. 20 7
      src/components/config_point/step3_point/steps3_main.vue
  20. 141 32
      src/components/data_admin/buildTask/detail/assetsDetail.vue
  21. 76 58
      src/components/data_admin/buildTask/detail/deviceDetail.vue
  22. 97 124
      src/components/data_admin/buildTask/dialog/modelTaskDialog.vue
  23. 0 2
      src/components/data_admin/buildTask/draw/drawModel.vue
  24. 70 0
      src/components/data_admin/buildTask/lib/assetsCascader.vue
  25. 70 0
      src/components/data_admin/buildTask/lib/deviceCascader.vue
  26. 70 0
      src/components/data_admin/buildTask/lib/modelCascader.vue
  27. 81 0
      src/components/data_admin/buildTask/lib/modelFile.vue
  28. 53 0
      src/components/data_admin/buildTask/lib/taskState.vue
  29. 37 10
      src/components/data_admin/buildTask/table/assetsTable.vue
  30. 53 18
      src/components/data_admin/buildTask/table/deviceTable.vue
  31. 57 15
      src/components/data_admin/buildTask/table/modelTable.vue
  32. 27 23
      src/components/data_admin/buildTask/table/replaceTable.vue
  33. 27 23
      src/components/data_admin/buildTask/table/tearTable.vue
  34. 35 41
      src/components/ledger/handsontables/system.vue
  35. 80 0
      src/components/ledger/lib/editSysFloor.vue
  36. 64 0
      src/components/ledger/lib/spaceSelect.vue
  37. 179 0
      src/components/ledger/system/dialog/addCenoteDialog.vue
  38. 198 0
      src/components/ledger/system/dialog/addEquipDialog.vue
  39. 179 0
      src/components/ledger/system/dialog/addSpaceDialog.vue
  40. 140 0
      src/components/ledger/system/lib/equipType.vue
  41. 156 0
      src/components/ledger/system/table/cenoteTable.vue
  42. 143 0
      src/components/ledger/system/table/deviceTable.vue
  43. 144 0
      src/components/ledger/system/table/spaceTable.vue
  44. 1 1
      src/components/point/dynamicdata/applyRulesDialog.vue
  45. 66 0
      src/components/point/dynamicdata/autoGroupRelaDialog.vue
  46. 4 4
      src/components/point/dynamicdata/delRelationDialog.vue
  47. 21 8
      src/components/point/dynamicdata/equipRules.vue
  48. 4 4
      src/components/point/dynamicdata/historyDialog.vue
  49. 11 2
      src/components/point/dynamicdata/partsRules.vue
  50. 11 2
      src/components/point/dynamicdata/spaceRules.vue
  51. 11 2
      src/components/point/dynamicdata/systemRules.vue
  52. 275 25
      src/framework/components/messagesever/index.vue
  53. 29 10
      src/framework/components/messagesever/msmq.js
  54. 11 4
      src/router/system.js
  55. 33 1
      src/utils/handsontable/mainText.js
  56. 26 0
      src/utils/scan/directive.js
  57. 53 9
      src/views/business_space/dataUtil/index.vue
  58. 47 64
      src/views/data_admin/buildTask/addTask/addAssetsTask.vue
  59. 79 82
      src/views/data_admin/buildTask/addTask/addDeviceTask.vue
  60. 16 5
      src/views/data_admin/buildTask/addTask/addModelTask.vue
  61. 25 27
      src/views/data_admin/buildTask/index.vue
  62. 19 17
      src/views/ledger/spacelist/index.vue
  63. 5 4
      src/views/ledger/spacelist/spaceDetail/index.vue
  64. 5 11
      src/views/ledger/system/index.vue
  65. 164 0
      src/views/ledger/system/systemDetail/index.vue
  66. 1 1
      src/views/point/dynamicdata/addRelation/equipRela/index.vue
  67. 1 1
      src/views/point/dynamicdata/addRelation/partsRela/index.vue
  68. 1 1
      src/views/point/dynamicdata/addRelation/spaceRela/index.vue
  69. 1 1
      src/views/point/dynamicdata/addRelation/systemRela/index.vue
  70. 22 5
      src/views/point/dynamicdata/index.vue
  71. 8 14
      src/views/ready/buildfloor/drawGraphy/drawFloor.vue

+ 7 - 0
config/index.js

@@ -95,6 +95,13 @@ module.exports = {
                     "^/modelapi": "/"
                 }
             },
+            '/messageapi': {
+                target: 'http://192.168.20.153:8080',
+                changeOrigin: true,
+                pathRewrite: {
+                    "^/messageapi": "/"
+                }
+            },
         },
 
         // Various Dev Server settings

+ 6 - 6
config/prod.env.js

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

+ 4 - 4
package.json

@@ -25,10 +25,10 @@
         "vue-router": "^3.0.1",
         "vuex": "^3.1.0",
         "cad-engine": "2.0.250",
-        "@saga-web/base": "2.1.8",
-        "@saga-web/draw": "2.1.57",
-        "@saga-web/graphy": "2.1.28",
-        "@saga-web/cad-engine": "2.0.292"
+        "@saga-web/base": "2.1.9",
+        "@saga-web/draw": "2.1.58",
+        "@saga-web/graphy": "2.1.30",
+        "@saga-web/cad-engine": "2.0.345"
     },
     "devDependencies": {
         "ajv": "^6.9.1",

+ 20 - 0
src/api/data_admin/buildTaskApi.js

@@ -33,6 +33,16 @@ export function updateModelTask(param, success) {
   let url = `${baseUrl}/datacenter/model-scan-task/update`;
   http.postJson(url, param, success)
 }
+//查询设备分类
+export function queryModelCategory(param, success) {
+  let url = `${baseUrl}/datacenter/model-scan-task/model-category-query`;
+  http.postJson(url, param, success)
+}
+//查询模型文件夹和文件
+export function queryModelFile(param, success) {
+  let url = `${baseUrl}/datacenter/model-scan-task/model-file-query`;
+  http.postJson(url, param, success)
+}
 
 /*************************设备台账任务接口****************************/
 //创建设备台账任务
@@ -55,6 +65,11 @@ export function updateDeviceTask(param, success) {
   let url = `${baseUrl}/datacenter/equip-scan-task/update`;
   http.postJson(url, param, success)
 }
+//查询设备分类
+export function queryDeviceCategory(param, success) {
+  let url = `${baseUrl}/datacenter/equip-scan-task/equip-category-query`;
+  http.postJson(url, param, success)
+}
 
 /*************************资产台账任务接口****************************/
 //统计数量
@@ -81,4 +96,9 @@ export function queryAssetsTask(param, success) {
 export function updateAssetsTask(param, success) {
   let url = `${baseUrl}/datacenter/property-scan-task/update`;
   http.postJson(url, param, success)
+}
+//查询设备族
+export function queryAssetsFamily(param, success) {
+  let url = `${baseUrl}/datacenter/property-scan-task/property-category-query`;
+  http.postJson(url, param, success)
 }

+ 56 - 0
src/api/msgsever.js

@@ -0,0 +1,56 @@
+import http from './scan/httpUtil'
+const baseUrl = '/messageapi';
+
+/*************************消息中心接口****************************/
+
+/**
+ * title: 统计数量
+ * info: 查询总数量不传参数,查询 已读Read = true,未读 Read = false
+ */
+export function messgeCount(param, success) {
+  let url = `${baseUrl}/message-center/message/count`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 创建消息
+ * info: 消息类型:提示(Info)、警告(Warning)、错误(Error)、成功(Success)
+ */
+export function messgeCreate(param, success) {
+  let url = `${baseUrl}/message-center/message/create`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 删除消息
+ */
+export function messgeDelete(param, success) {
+  let url = `${baseUrl}/message-center/message/delete`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 查询消息列表
+ */
+export function messgeQuery(param, success) {
+  let url = `${baseUrl}/message-center/message/page-query`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 更新消息状态
+ * info: 是否读过:未读(f)、已读(t)
+ */
+export function messgeUpdate(param, success) {
+  let url = `${baseUrl}/message-center/message/update`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 根据接收人将消息置为已读
+ * info: 已读Read = true,*UserId
+ */
+export function messgeUpdateState(param, success) {
+  let url = `${baseUrl}/message-center/message/update-state`;
+  http.postJson(url, param, success)
+}

+ 17 - 0
src/api/scan/request.js

@@ -1089,6 +1089,12 @@ export function dynamicClashConfirm(param, success) {
     http.postJson(url, param, success)
 }
 
+//子系统点位接入-第三部步骤3保存
+export function groupCreatePointRelation(param, success) {
+    let url = `${baseUrl}/pointconfig/relation/group-create`;
+    http.postJson(url, param, success)
+}
+
 //动态数据关联-查询数据源列表(P1&2)
 export function dynamicDataSource(param, success) {
     let url = `${baseUrl}/pointconfig/dynamic/datasource-list`;
@@ -1179,6 +1185,12 @@ export function dynamicPointTypeList(param, success) {
     http.postJson(url, param, success)
 }
 
+//动态数据关联-自动关联
+export function dynamicAutoRelate(param, success) {
+    let url = `${baseUrl}/pointconfig/dynamic/auto-relate`;
+    http.postJson(url, param, success)
+}
+
 //查询楼层信息
 export function floorQuery(param, success) {
     let url = `${baseUrl}/datacenter/floor/query`;
@@ -1415,6 +1427,11 @@ export function groupCreRelaZoneAndISp(param, success) {
     let url = `${baseUrl}/datacenter/si-in-sp-base/link-list?type=${param.type}`;
     http.postJson(url, param.data, success)
 }
+//关系-----业务空间所属建筑楼层修改
+export function updateRelateInSpAndBuild(param, success) {
+    let url = `${baseUrl}/datacenter/update-relationship/update-sp`;
+    http.postJson(url, param, success)
+}
 
 /**系统集成成果管理 */
 //系统集成统计条形图

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 94 - 6
src/assets/style/iconfont/iconfont.css


BIN
src/assets/style/iconfont/iconfont.eot


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 66 - 0
src/assets/style/iconfont/iconfont.svg


BIN
src/assets/style/iconfont/iconfont.ttf


BIN
src/assets/style/iconfont/iconfont.woff


+ 86 - 11
src/components/business_space/business/handsontable.vue

@@ -38,10 +38,11 @@ import addBusiness from "@/components/business_space/dialogs/addDialog/businessD
 import showTools from "@/utils/handsontable/notShow"
 import handsonUtils from "@/utils/hasontableUtils"
 import Handsontable from "handsontable-pro"
+import buildFloor from '@/utils/handsontable/buildFloorData'
 import 'handsontable-pro/dist/handsontable.full.css'
 import zhCN from 'handsontable-pro/languages/zh-CN';
 import qrcode from "@/components/ledger/lib/qrcode";
-import { queryZone, updateZone, deleteZone, createZone, BeatchQueryParam } from "@/api/scan/request";
+import { queryZone, updateZone, deleteZone, createZone, BeatchQueryParam, updateRelateInSpAndBuild } from "@/api/scan/request";
 import { mapGetters, mapActions } from "vuex";
 export default {
   props: {
@@ -95,10 +96,12 @@ export default {
       buildMess: null,
       filtersArr: [], //表格数据被过滤后的下标
       copyMain: [], //深拷贝数组
+      buildFloorData: [], //楼层数据
     };
   },
   created() {
     this.setData()
+    buildFloor.getData(this.buildFloorData)
   },
   mounted() { },
   methods: {
@@ -107,7 +110,7 @@ export default {
       this.param.UserId = this.userId
       this.param.secret = this.secret
     },
-    //获取表
+    //获取表格数据
     getHeader(headers, buildFloorSelectd) {
       this.headers = headers
       this.buildFloorSelectd = buildFloorSelectd
@@ -124,9 +127,24 @@ export default {
           PageSize: this.page.pageSize
         }
       }
-      if (this.buildFloorSelectd.length && this.buildFloorSelectd[0] && this.buildFloorSelectd[1]) {
-        params.data.Filters = `BuildingId='${this.buildFloorSelectd[0]}';FloorId='${this.buildFloorSelectd[1]}'`
+      if (this.buildFloorSelectd[0] == "noKnow") {
+        params.data.Filters += `buildingId isNull`
+      } else if (this.buildFloorSelectd[0] && this.buildFloorSelectd[0] != "all") {
+        params.data.Filters += `buildingId='${this.buildFloorSelectd[0]}'`
       }
+      if (this.buildFloorSelectd.length > 1) {
+        if (this.buildFloorSelectd[1] == "noKnow") {
+          params.data.Filters += `;floorId isNull`
+        } else if (this.buildFloorSelectd[1] && this.buildFloorSelectd[1] != "all") {
+          params.data.Filters += `;floorId='${this.buildFloorSelectd[1]}'`
+        }
+      }
+      if (!params.data.Filters) {
+        delete params.data.Filters
+      }
+      // if (this.buildFloorSelectd.length && this.buildFloorSelectd[0] && this.buildFloorSelectd[1]) {
+      //   params.data.Filters = `BuildingId='${this.buildFloorSelectd[0]}';FloorId='${this.buildFloorSelectd[1]}'`
+      // }
       // else if (buildFloorSelectd.length && buildFloorSelectd[0] && !buildFloorSelectd[1]) {
       //   params.data.Filters = `BuildingId='${buildFloorSelectd[0]}'`
       // } else {
@@ -134,7 +152,14 @@ export default {
       // }
       queryZone(params, res => {
         this.page.total = res.Total
-        this.main = res.Content
+        this.main = 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
+        });
         if (this.main && this.main.length && this.main[0].RoomID) {
           this.copyMain = tools.deepCopy(this.main);
         }
@@ -168,6 +193,7 @@ export default {
         sortIndicator: true, //添加排序
         renderAllRows: true,
         autoColumnSize: true,
+        observeChanges: false,
         language: "zh-CN",
         manualColumnResize: true,
         manualColumnMove: true,
@@ -339,6 +365,10 @@ export default {
       //生成要修改字段列表
       change.map((item) => {
         let key = item[1].split(".")[0]
+        if (key == "flowBuild" && keyList.indexOf(key) == -1) {
+          keyList.push("BuildingId", "FloorId")
+          param.data.Projection.push("BuildingId", "FloorId")
+        }
         if (item[1] && keyList.indexOf(key) == -1) {
           keyList.push(key)
         }
@@ -349,13 +379,44 @@ 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.data.Content.push(item);
       })
-      param.Projection = []
-      updateZone(param, (res) => { })
+      if (param.data.Projection.indexOf('BuildingId') > -1) {
+        let pa = param.data.Content.map(t => {
+          return {
+            type: this.zoneCode,
+            spaceId: t.RoomID,
+            id: t.FloorId || t.BuildingId || null,
+          }
+        })
+        updateRelateInSpAndBuild(pa, res => {
+          this.$message.success('修改成功')
+        })
+      } else {
+        param.data.Projection = []
+        updateZone(param, (res) => { })
+      }
     },
     //获取被筛选掉的行号
     trimmedRows() {
@@ -436,7 +497,7 @@ export default {
                         item,
                         head.Path,
                         // child.error ? "表号功能号格式错误" : "表号功能号不存在"
-                        child.error ? child.value? "表号功能号格式错误" : "表号功能号不存在" : "暂未采集到实时数据"
+                        child.error ? child.value ? "表号功能号格式错误" : "表号功能号不存在" : "暂未采集到实时数据"
                       );
                     }
                   });
@@ -459,6 +520,9 @@ export default {
       let arr = tools.copyArr(list)
       let data = showTools.headerTextFilter(arr, "space", this.onlyRead, this.showType)
       data.unshift("是否关联平面图", "与空间相关联的设备");
+      if (this.showType == "all") {
+        data.splice(4, 0, "所属建筑楼层")
+      }
       return data;
     },
     /**
@@ -479,10 +543,21 @@ export default {
         renderer: this.facilityRender,
         readOnly: true
       });
+      if (this.showType == "all") {
+        data.splice(4, 0, {
+          data: "flowBuild",
+          renderer: tools.customDropdownRenderer,
+          editor: "chosen",
+          chosenOptions: {
+            data: this.buildFloorData
+          },
+          readOnly: this.onlyRead
+        })
+      }
       return data;
     },
     myRenderer(instance, td, row, col, prop, value, cellProperties) {
-      if (value && value.length) {
+      if (value && value.length && value[0]) {
         td.innerHTML = "已关联"
       } else {
         td.innerHTML = "未关联"

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

@@ -156,6 +156,8 @@ export default {
       if (this.keycode != '') {
         pa.data.Filters += `;EquipName contain "${this.keycode}" or EquipLocalName contain "${this.keycode}" or EquipLocalID contain "${this.keycode}"`
       }
+      // 删除首尾分号
+      pa.data.Filters = pa.data.Filters.replace(/(^;)|(;$)/g,'');
       if (pa.data.Filters == '') {
         delete pa.data.Filters
       }

+ 26 - 7
src/components/business_space/newGraphy/canvasFun.vue

@@ -1,8 +1,8 @@
 <template>
   <el-row id="canvas-actions-box" :class="{'isEdit':isEdit}">
-    <div :class="{'active':active=='move'}">
+    <!-- <div :class="{'active':active=='move'}">
       <i class="iconfont icon-move" @click="moveCanvas"></i>
-    </div>
+    </div> -->
     <div>
       <i class="iconfont icon-maximize" @click="fitToWindow"></i>
     </div>
@@ -16,7 +16,14 @@
       </el-dropdown>
     </div>
     <div v-if="isEdit" :class="{'active':active=='divide'}">
-      <i class="iconfont icon-edit1" @click="divide"></i>
+      <el-dropdown size="mini" placement="top-start" @command="handleDivideCommand" :hide-on-click="false">
+        <i class="iconfont icon-edit1" @click="divide"></i>
+        <el-dropdown-menu slot='dropdown'>
+          <el-dropdown-item command="savePng">
+            吸附<el-switch v-model="isSwitch"></el-switch>
+          </el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
     </div>
     <div v-if="isEdit">
       <i class="iconfont icon-Erase" @click="clearDivide"></i>
@@ -46,6 +53,7 @@ export default {
       active: '',
       min: 1,
       everyScale: 1, // 每份的放大倍数
+      isSwitch: false, // 是否开启吸附
     }
   },
   props: {
@@ -58,10 +66,10 @@ export default {
   },
   methods: {
     // 移动画布
-    moveCanvas() {
-      this.active = this.active != "move" ? "move" : '';
-      this.$emit('move', this.active == 'move');
-    },
+    // moveCanvas() {
+    //   this.active = this.active != "move" ? "move" : '';
+    //   this.$emit('move', this.active == 'move');
+    // },
     // 适配大小
     fitToWindow() {
       this.$emit('fit');
@@ -70,6 +78,10 @@ export default {
     handleCommand(command) {
       this.$emit(command)
     },
+    // 是否开启吸附
+    handleDivideCommand(commond) {
+      this.$emit('changeAbsorb', this.isSwitch);
+    },
     // 切割编辑
     divide() {
       this.active = 'divide';
@@ -124,14 +136,21 @@ export default {
     background-color: #6da60f;
     i {
       cursor: pointer;
+      color: #fff;
     }
   }
+  & > div:active {
+    background-color: #4b7902;
+  }
   & > div.active {
     background-color: #4b7902;
   }
   &.isEdit > div {
     background-color: #02a7f0;
   }
+  &.isEdit > div:active {
+    background-color: #027db4;
+  }
   &.isEdit > div.active {
     background-color: #027db4;
   }

+ 76 - 22
src/components/business_space/newGraphy/graphy.vue

@@ -25,7 +25,12 @@
         <div class="button-group">
           <!-- 默认操作模式 -->
           <div v-show="type==1">
-            <el-button @click="editGraphy">编辑平面图</el-button>
+            <el-dropdown split-button type="primary" @click="editGraphy" @command="handleCommand">
+              创建业务空间
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="groupCreateBSpace">批量创建业务空间</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
           </div>
           <!-- 点击已经关联的业务空间 -->
           <div v-show="type==2">
@@ -35,8 +40,8 @@
           </div>
           <!-- 点击未关联的业务空间 -->
           <div v-show="type==3">
-            <el-button plain @click="createNewZone">创建新的业务空间</el-button>
-            <el-button type="primary" @click="lookUnrelatBSpace(true)">从未关联平面图的业务空间中选择</el-button>
+            <el-button plain @click="createNewZone">创建单个全新的业务空间</el-button>
+            <el-button plain @click="lookUnrelatBSpace(true)">从未关联平面图的业务空间中选择</el-button>
             <el-button plain @click="cancelGraphy">取 消</el-button>
           </div>
           <!-- 重新划分业务空间 -->
@@ -60,14 +65,30 @@
     <unRelateBSP ref="unRelateBSP" :tableData="BSPUnrelaISPList" :isAction="isAction" @createFromUnrelated="createFromUnrelated"></unRelateBSP>
     <!-- 创建新的业务空间 -->
     <createBSP ref="createBSP" @createRoom="createRoom"></createBSP>
+    <!-- 批量创建选择弹窗 -->
+    <el-dialog title="提示" :visible.sync="groupCreateDialogVis" width="30%">
+      <div id="autoRelate">
+        <p>请选择批量创建方式:</p>
+        <p>
+          <el-radio v-model="groupCreateType" :label="1">批量将所有的空白空间创建业务空间</el-radio>
+        </p>
+        <p>
+          <el-radio v-model="groupCreateType" :label="2">批量选择空白空间创建业务空间</el-radio>
+        </p>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="groupCreateDialogVis=false">取消</el-button>
+        <el-button size="small" type="primary" @click="confirm">确认</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 <script>
 import canvasFun from "./canvasFun"
 import { mapGetters, mapActions } from "vuex";
-import { SGraphyView } from "@saga-web/graphy/lib";
 import { SColor, SPoint } from "@saga-web/draw/lib";
 import { DivideFloorScene, SpaceItem, ZoneItem } from "@saga-web/cad-engine/lib";
+import { FloorView } from "@saga-web/cad-engine/lib/FloorView";
 import unRelateBSP from "./unRelateBSP";
 import createBSP from "./createBSP";
 import {
@@ -124,6 +145,8 @@ export default {
       curZoneItem: {}, //当前选中的业务空间item
       allUnRelatISP: [], //
       zoneList: [], // 业务空间-canvas图中
+      groupCreateDialogVis: false, //批量创建业务空间弹窗
+      groupCreateType: 1, //批量创建方式
     }
   },
   computed: {
@@ -145,6 +168,9 @@ export default {
         this.scene.clearSpaceSelection();
         this.scene.clearZoneSelection();
       }
+      if (this.buildFloor.indexOf('all') > -1 || this.buildFloor.indexOf('noKnow') > -1) {
+        return;
+      }
       if (initType == 1) {
         // 底图
         this.getGraphy();
@@ -358,20 +384,37 @@ export default {
     cancelGraphy() {
       this.init(2);
     },
+    // 批量创建业务空间弹窗
+    handleCommand(command) {
+      this.groupCreateDialogVis = true;
+    },
+    // 创建弹窗确认
+    confirm() {
+      if (this.groupCreateType == 1) {
+        this.groupCreateBSpace()
+      } else if (this.groupCreateType == 2) {
+        
+      }
+    },
     // 批量创建业务空间
     groupCreateBSpace() {
       let text = []
       let Spaces = this.allUnRelatISP.map(t => {
-        text.push(t.RoomLocalName || t.RoomName)
-        return {
-          IspaceId: t.RoomID,
-          RoomLocalName: t.RoomLocalName || t.RoomName,
-          Outline: [t.Outline],
-          BuildingId: this.buildFloor[0],
-          FloorId: this.buildFloor[1]
+        if (t.Outline) {
+          text.push(t.RoomLocalName || t.RoomName)
+          return {
+            IspaceId: t.RoomID,
+            RoomLocalName: t.RoomLocalName || t.RoomName,
+            Outline: [t.Outline],
+            BuildingId: this.buildFloor[0],
+            FloorId: this.buildFloor[1],
+            Height: t.Height || 0
+          }
+        } else {
+          return undefined
         }
-      });
-      if(Spaces.length){
+      }).filter(item => item);
+      if (Spaces.length) {
         this.$confirm(
           "<p>确定根据未关联业务空间的空间批量创建业务空间</p>" +
           "<p>涉及的空间:</p>" +
@@ -419,7 +462,7 @@ export default {
             message: "已取消批量创建"
           });
         });
-      }else{
+      } else {
         this.$message('没有未关联的元空间')
       }
     },
@@ -439,10 +482,14 @@ export default {
     // 创建新的业务空间-弹窗返回确认创建
     createRoom(val) {
       let arr = this.scene.getSelectedSpaces();
-      let zoneObj = { Outline: [] }, IspaceIdList = [];
+      let zoneObj = { Outline: [], Height: 0 }, IspaceIdList = [];
       arr.map(t => {
         zoneObj.Outline.push(t.data.OutLine);
-        IspaceIdList.push(this.BIMIDToSID[t.data.SourceId])
+        IspaceIdList.push(this.BIMIDToSID[t.data.SourceId]);
+        console.log(zoneObj.Height)
+        if (t.data.Height && (zoneObj.Height == 0 || t.data.Height < zoneObj.Height)) {
+          zoneObj.Height = t.data.Height;
+        }
       })
       zoneObj.RoomLocalName = val;
       zoneObj.BuildingId = this.buildFloor[0];
@@ -459,10 +506,14 @@ export default {
     },
     // 从未关联平面图的业务空间中选择--按钮返回关联信号
     createFromUnrelated(BSP) {
-      BSP.Outline = []
+      BSP.Outline = [];
+      BSP.Height = 0;
       let arr = this.scene.getSelectedSpaces();
       arr.map(t => {
         BSP.Outline.push(t.data.OutLine);
+        if (t.Height && (BSP.Height == 0 || t.Height < BSP.Height)) {
+          BSP.Height = t.Height;
+        }
       })
       let pa = {
         zone: BSP.ObjectType,
@@ -498,10 +549,13 @@ export default {
     saveRefactorBSP() {
       let arr = this.scene.getSelectedSpaces();
       //更新业务空间
-      let zoneObj = { Outline: [] }, IspaceIdList = [];
+      let zoneObj = { Outline: [], Height: 0 }, IspaceIdList = [];
       arr.map(t => {
         zoneObj.Outline.push(t.data.OutLine);
-        IspaceIdList.push(this.BIMIDToSID[t.data.SourceId])
+        IspaceIdList.push(this.BIMIDToSID[t.data.SourceId]);
+        if (t.Height && (zoneObj.Height == 0 || t.Height < zoneObj.Height)) {
+          zoneObj.Height = t.Height;
+        }
       })
       zoneObj.RoomID = this.curZoneItem.data.RoomID;
       if (!zoneObj.Outline.length) {
@@ -539,7 +593,7 @@ export default {
         this.view.scene = null;
         return
       }
-      this.view = new SGraphyView('floorCanvas')
+      this.view = new FloorView('floorCanvas')
     },
     // 工具栏操作
     // 移动底图
@@ -566,11 +620,11 @@ export default {
     },
     // 切割划分
     divide() {
-      this.drawMainScene.isMarking = true;
+      this.scene.isMarking = true;
     },
     // 清除切割划分
     clearDivide() {
-      this.drawMainScene.clearSceneMark()
+      this.scene.clearSceneMark()
     },
     // 撤销
     undo() {

+ 1 - 0
src/components/common/myPagination.vue

@@ -36,6 +36,7 @@ export default {
     //当前条数发生改变
     handleSizeChange(val) {
       this.page.size = val;
+      this.page.currentPage = 1;
       this.change()
     },
     //当前页发生改变

+ 18 - 2
src/components/config_point/select_one.vue

@@ -10,11 +10,11 @@
         <p>{{name}}</p>
         <ul v-if="renderData.length">
             <li v-for="(item,index) in renderData" :key="index">
-                <div @click="checkItem(item,index)" :class="index == active ? 'saga-active-select': ''" class="select-item border-bottom pointer">
+                <div @click="checkItem(item,index)" :class="{'saga-active-select': index == active,'disabled':item.RelationStatus=='Waiting'||item.RelationStatus=='Pending'}" class="select-item border-bottom pointer">
                     <!-- <span v-if="isSelected" :class="{'is-checked': item[isCheckInfo]}" class="el-checkbox__input">
                         <span class="el-checkbox__inner"></span>
                     </span> -->
-                    <span v-if="isSelected" :class="item[isCheckInfo] ? 'el-icon-success' : 'el-icon-error'" style="color:#409EFF;">
+                    <span v-if="isSelected" :class="item.RelationStatus=='Waiting'||item.RelationStatus=='Pending'?'iconfont icon-shenglvehao load-color':item[isCheckInfo] ? 'el-icon-success success-color' : 'el-icon-error error-color'">
                     </span>
                     {{overString(item[infosKey])}}
                     <i v-if="isDel" @click.stop="delItem(item)" class="el-icon-error saga-delete pointer"></i>
@@ -60,6 +60,10 @@
         mounted() {},
         methods: {
             checkItem(item, index) {
+                if(item.RelationStatus=='Waiting'||item.RelationStatus=='Pending'){
+                    this.$message('正在执行')
+                    return
+                }
                 this.$emit("check", item)
                 this.active = index
             },
@@ -123,6 +127,18 @@
     .select-item {
         height: 30px;
         line-height: 30px;
+        &.disabled{
+            background-color: #ccc;
+        }
+        .success-color{
+            color: #409EFF;
+        }
+        .error-color{
+            color: #F56C6C;
+        }
+        .load-color{
+            color: #909399;
+        }
     }
     .saga-delete {
         display: none;

+ 129 - 40
src/components/config_point/step3_point/3_temps.vue

@@ -56,11 +56,14 @@
     </div>
     <div class="collapse-item" v-if="activeName == 2">
       <div v-if="renderData.length" style="height:258px;">
-        <handsontable-component ref="handsontable"></handsontable-component>
+        <handsontable-component ref="handsontable" @change="changeTable"></handsontable-component>
       </div>
       <div v-if="!renderData.length" class="center" style="padding: 50px 0;box-sizing:border-box;">
         <i class="icon-wushuju iconfont"></i> 暂无数据
       </div>
+      <div v-if="pages.total>pages.size" class="right">
+        <pagination :page="pages" @change="changePage"></pagination>
+      </div>
       <div class="center">
         <el-button @click="undo">上一步</el-button>
         <el-button v-show="renderData.length" @click="save">保存</el-button>
@@ -77,6 +80,11 @@ import formulaHandle from '@/components/config_point/step3_edit/formula_handle'
 import splitHandle from '@/components/config_point/step3_edit/split_handle'
 import handsontableComponent from "@/components/common/handsontable"
 import dictionaryCas from '@/components/config_point/dictionaryCascader'
+import pagination from "@/components/common/myPagination"
+import handsonUtils from "@/utils/hasontableUtils"
+import {
+  groupCreatePointRelation
+} from "@/api/scan/request";
 import {
   mapGetters,
   mapActions
@@ -107,7 +115,9 @@ export default {
       default: function () {
         return []
       }
-    }
+    },
+    pages: Object,
+    queryParam: Object
   },
   data() {
     return {
@@ -168,21 +178,24 @@ export default {
     formulaHandle,
     splitHandle,
     handsontableComponent,
-    dictionaryCas
+    dictionaryCas,
+    pagination
   },
   methods: {
-    getMain(param) {
-      this.activeName = 0
-      this.dealType = {}
-      this.form1 = {
-        dict: 1
-      }
-      this.$refs.dictionaryCas.setCascaderVal([])
-      this.form2 = {
-        ValueDescription: '',
-        DataRuleType: '无需处理,直接使用'
+    getMain(param, pagechange) {
+      if (!pagechange) {
+        this.activeName = 0
+        this.dealType = {}
+        this.form1 = {
+          dict: 1
+        }
+        this.$refs.dictionaryCas.setCascaderVal([])
+        this.form2 = {
+          ValueDescription: '',
+          DataRuleType: '无需处理,直接使用'
+        }
+        this.unitObj = {}
       }
-      this.unitObj = {}
       let params = {
         data: {
           DataSourceId: this.datasourceId,
@@ -197,32 +210,41 @@ export default {
     },
     //保存
     save() {
-      let data = this.hot.getSourceData()
-      let params = data.map(item => {
-        let obj = Object.assign({}, {
-          DataSourceId: this.datasourceId,
-          PointId: item.Id,
-          EquipmentMark: item.EquipmentMark
-        })
-        return Object.assign(obj, this.dealType)
-      }),
-        sameFalg = false,
-        magFalg = false;
-      params.map((item, index) => {
-        if (!item.EquipmentMark) {
-          magFalg = true
-        }
-        params.map((child, childIndex) => {
-          if (childIndex != index && child.EquipmentMark == item.EquipmentMark) {
-            sameFalg = true
-          }
-        })
+      // let data = this.hot.getSourceData()
+      // let params = data.map(item => {
+      //   let obj = Object.assign({}, {
+      //     DataSourceId: this.datasourceId,
+      //     PointId: item.Id,
+      //     EquipmentMark: item.EquipmentMark
+      //   })
+      //   return Object.assign(obj, this.dealType)
+      // }),
+      //   sameFalg = false,
+      //   magFalg = false;
+      // params.map((item, index) => {
+      //   if (!item.EquipmentMark) {
+      //     magFalg = true
+      //   }
+      //   params.map((child, childIndex) => {
+      //     if (childIndex != index && child.EquipmentMark == item.EquipmentMark) {
+      //       sameFalg = true
+      //     }
+      //   })
+      // })
+      // if (sameFalg) {
+      //   this.confirm("点位中存在对象标识相同的点位,确认保存吗?", params)
+      // } else {
+      //   this.createParam(params)
+      // }
+      let pa = Object.assign({
+        DataSourceId: this.queryParam.DataSourceId,
+        KeyEquipmentParameter: this.queryParam.EquipmentParameter,
+        KeyEquipmentType: this.queryParam.EquipmentType,
+      }, this.dealType);
+      groupCreatePointRelation(pa, res => {
+        this.$message.success("处理成功")
+        this.$emit("changed")
       })
-      if (sameFalg) {
-        this.confirm("点位中存在对象标识相同的点位,确认保存吗?", params)
-      } else {
-        this.createParam(params)
-      }
     },
     confirm(assage, params) {
       this.$confirm(assage, { type: 'warning' }).then(_ => {
@@ -322,7 +344,7 @@ export default {
               this.activeName += 1
               let setting = {
                 data: this.renderData,
-                maxRows: this.renderData.length,
+                maxRows: 1000,
                 colHeaders: ['对象标识', '原始点位描述', '位置标签', '备注'],
                 columns: [{
                   data: 'EquipmentMark'
@@ -583,6 +605,73 @@ export default {
       this.infoDict = this.$refs.dictionaryCas.pointDataSource
       this.unitObj = this.infoDict[val[val.length - 1]]
       this.InfomationPoint = this.unitObj.InfoPointName || ''
+    },
+    //分页发生更改
+    changePage() {
+      this.$emit('changePage', this.queryParam);
+    },
+    // 修改table
+    changeTable(changeData, source) {
+      console.log(source)
+      if (source == 'edit' || source == 'Autofill.fill') {
+        let trimmedArr = this.trimmedRows();
+        let param = handsonUtils.getParam(changeData, source, this.hot, trimmedArr);
+        let updateParams = {
+          data: {
+            Content: []
+          },
+          type: this.protocolType
+        }
+        updateParams.data.Content = param.map(t => {
+          return {
+            Id: t.Id,
+            EquipmentMark: t.EquipmentMark
+          }
+        })
+        console.log(updateParams)
+        updatePoint(updateParams, data => {
+          this.$message.success("修改成功")
+        })
+      }
+    },
+    //获取被筛选掉的行号
+    trimmedRows() {
+      var plugin = this.hot.getPlugin("trimRows").trimmedRows;
+      let dataLength = this.renderData.length;
+      let dataArr = new Array();
+      for (let i = 0; i < dataLength; i++) {
+        dataArr.push(i);
+      }
+      if (plugin.length <= 0) {
+        dataArr = undefined;
+      } else {
+        dataArr = this.array_diff(dataArr, plugin);
+      }
+      return dataArr || [];
+    },
+    //去除数组中相同的元素
+    array_diff(a, b) {
+      for (var i = 0; i < b.length; i++) {
+        for (var j = 0; j < a.length; j++) {
+          if (a[j] == b[i]) {
+            a.splice(j, 1);
+            j = j - 1;
+          }
+        }
+      }
+      return a;
+    },
+  },
+  watch: {
+    'renderData': {
+      handler(n, o) {
+        if (n.length && this.hot) {
+          this.hot.loadData(n);
+          console.log('load')
+        }
+      },
+      immediate: true,
+      deep: true
     }
   }
 }

+ 20 - 7
src/components/config_point/step3_point/steps3_main.vue

@@ -4,7 +4,7 @@
         <select-one @check="typeCheck" :renderData="typeArr" :isSelected="true" isCheckInfo="PhysicalRelated" infosKey="EquipmentType" :name="'原始点位描述中识别的对象类型'"></select-one>
         <select-one @check="paramCheck" :isDel="true" @deleteItem="deleteItem" :renderData="identifyArr" :isSelected="true" isCheckInfo="PhysicalRelated" infosKey="ownMess" :name="'原始点位描述中识别的对象参数'"></select-one>
         <div class="own-collape">
-            <temp-collape ref="ident" :renderData="identDataArr" @changed="changed"></temp-collape>
+            <temp-collape ref="ident" :renderData="identDataArr" @changed="changed" :pages="pages" @changePage="changePage" :queryParam="queryParam"></temp-collape>
         </div>
     </div>
 </template>
@@ -33,7 +33,14 @@
                 typeArr: [],
                 identifyArr: [],
                 KeyEquipmentType: "",
-                identDataArr: []
+                identDataArr: [],
+                pages: {
+                    size: 100,
+                    sizes: [50, 100, 200, 500],
+                    total: 0,
+                    currentPage: 0
+                },
+                queryParam:{}
             }
         },
         computed: {
@@ -105,8 +112,9 @@
                     this.typeArr = res.Content
                 })
             },
-            paramCheck(param) {
+            paramCheck(param,pagechange) {
                 console.log(param,'param')
+                this.queryParam = param
                 if(!!param &&!!param.PhysicalRelated){
                     this.$message("已完成设置,您可以重新设置")
                 }
@@ -120,7 +128,8 @@
                         type: this.protocolType
                     }, res => {
                         this.identDataArr = res.Content
-                        this.$refs.ident.getMain(param)
+                        this.pages.total = res.Total || 0;
+                        this.$refs.ident.getMain(param,pagechange)
                     })
                 } else {
                     //不是空的情况查询点位列表
@@ -136,14 +145,15 @@
                                     // KeyEquipmentParameter: '温度',
                                     // KeyEquipmentType: '冷机'
                                 },
-                                PageNumber: 1,
-                                PageSize: 1000
+                                PageNumber: this.pages.currentPage,
+                                PageSize: this.pages.size
                             },
                             type: this.protocolType
                         }, res => {
                             console.log(res, "reslist")
                             this.identDataArr = res.Content
-                            this.$refs.ident.getMain(param)
+                            this.pages.total = res.Total || 0
+                            this.$refs.ident.getMain(param,pagechange)
                         })
                     }
                 }
@@ -165,6 +175,9 @@
                         })
                     })
                 }
+            },
+            changePage(){
+                this.paramCheck(this.queryParam,'pagechange')
             }
         },
         components: {

+ 141 - 32
src/components/data_admin/buildTask/detail/assetsDetail.vue

@@ -1,38 +1,141 @@
 <template>
   <div class="detail-box">
     <el-scrollbar style="height:100%;">
-      <div class="attribute-detail"></div>
-      <div class="implement-detail"></div>
+      <div class="attribute-detail detail-item">
+        <el-form :model="detail" label-width="150px">
+          <el-form-item label="资产基本信息"></el-form-item>
+          <el-form-item label="任务创建时间:">{{ detail.CreateTime || '--' }}</el-form-item>
+          <el-form-item label="任务当前状态:">{{ detail.TaskState || '--' }}</el-form-item>
+          <el-form-item label="任务执行方案:">{{ detail.TaskId || '--' }}</el-form-item>
+          <el-form-item label="设备族:">{{ detail.EquipFamily.FamilyName || '--' }}</el-form-item>
+          <el-form-item label="全局名称:">{{ detail.EquipName || '--' }}</el-form-item>
+          <el-form-item label="资产本地名称:">{{ detail.EquipLocalName || '--' }}</el-form-item>
+          <el-form-item label="资产本地编码:">{{ detail.EquipLocalID || '--' }}</el-form-item>
+          <el-form-item label="设计图纸中编码:">{{ detail.CadId || '--' }}</el-form-item>
+          <el-form-item label="安装位置:">{{ detail.InstallLocation || '--' }}</el-form-item>
+          <el-form-item label="生产厂家:">{{ detail.Manufacturer || '--' }}</el-form-item>
+          <el-form-item label="型号:">{{ detail.Specification || '--' }}</el-form-item>
+          <el-form-item label="供应商:">{{ detail.Supplier || '--' }}</el-form-item>
+        </el-form>
+      </div>
+      <div class="implement-detail detail-item" v-if="detail.TaskState == '未找到'">
+        <el-form :model="detail" label-width="150px">
+          <el-form-item label="执行任务人:">{{ detail.WorkerName || '--' }}</el-form-item>
+          <el-form-item label="执行时间:">{{ detail.ProcessTime || '--' }}</el-form-item>
+          <el-form-item label="未找到对象信息"></el-form-item>
+          <el-form-item label="设备信息:">
+            <div v-if="detail.Equipment.Component && detail.Equipment.Component.length">
+              <p v-for="(item, index) in detail.Equipment.Component" :key="index" show-overflow-tooltip>
+               {{ item.EquipName }}
+              </p>
+            </div>
+            <div v-else>--</div>
+          </el-form-item>
+          <el-form-item label="全景图:">
+            <div class="img-item" @click="dialogVisible = true">
+              <img src="@/assets/house.jpg" style="width:100%;" alt="图片走丢了">
+              <!-- 遮罩层 
+              <div class="img-hide">
+                <i class="el-icon-help" style="font-size:30px;"></i>
+                <span> 点击查看全景图 </span>
+              </div> -->
+            </div>
+          </el-form-item>
+          <el-form-item label="部件照片:">
+            <div class="img-item">
+              <div class="demo-image__preview">
+                <el-image style="width:100%;" @click="nowUrl = url1" :src="url1" :preview-src-list="srcList"></el-image>
+                <el-image style="width:100%;" @click="nowUrl = url2" :src="url2" :preview-src-list="srcList"></el-image>
+                <el-image style="width:100%;" @click="nowUrl = url3" :src="url3" :preview-src-list="srcList"></el-image>
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item label="现场视频:">
+            <video controls style="width:100%;">
+              <source src="https://www.runoob.com/try/demo_source/movie.mp4" type="video/mp4">
+              您的浏览器不支持 HTML5 video ,暂无法播放。
+            </video>
+          </el-form-item>
+          <el-form-item label="备注信息:">{{ detail.Note || '--' }}</el-form-item>
+        </el-form>
+      </div>
+      <div class="operation-detail detail-item">
+        <el-form>
+          <el-form-item label="操作信息:"></el-form-item>
+          <div class="block">
+            <el-timeline>
+              <el-timeline-item timestamp="2018/4/12" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/12 20:46</p>
+                </el-card>
+              </el-timeline-item>
+              <el-timeline-item timestamp="2018/4/3" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/3 20:46</p>
+                </el-card>
+              </el-timeline-item>
+              <el-timeline-item timestamp="2018/4/2" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/2 20:46</p>
+                </el-card>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </el-form>
+      </div>
     </el-scrollbar>
+    <el-dialog title="全景图" :visible.sync="dialogVisible" width="70%" append-to-body>
+      一张图
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import {  } from "@/api/scan/request"
+import { } from "@/api/scan/request"
 import { mapGetters } from "vuex"
 export default {
   components: {
-    
+
   },
   computed: {
-    ...mapGetters("layout", ["projectId"])
+    ...mapGetters("layout", ["projectId"]),
+    srcList: function () {
+      let index = this.urls.indexOf(this.nowUrl) >= 1 ? this.urls.indexOf(this.nowUrl) : 0;
+      //  let temp = this.urls.concat();
+      let temp = this.urls;
+      let tempArr1 = temp.slice(0, index);
+      let tempArr2 = temp.slice(index, temp.length);
+
+      let res = tempArr2.concat(tempArr1);
+      return res;
+    }
   },
   props: {
-    id: String,
+    detail: Object,
   },
   data() {
     return {
-      
+      dialogVisible: false,//全景图弹出框
+      nowUrl: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',//当前正在显示的图
+      url1: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+      url2: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
+      url3: 'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg',
+      urls: ['https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+             'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', 
+             'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
+            ]
     };
   },
   created() {
-    
+    console.log(this.detail);
   },
   methods: {
-    
   },
   watch: {
-    id: {
+    detail: {
       handler(newName, oldName) {
         // this.page.pageNumber = 1
         // this.getTableData()
@@ -44,28 +147,34 @@ export default {
 };
 </script>
 <style lang="less" scoped>
-  .detail-box{
-    width: 100%;
-    height: 100%;
+.detail-box {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  /deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+  /deep/ .el-icon-circle-close {
+    color: white;
+  }
+
+  /deep/ .el-form-item__content {
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+
+  .detail-item {
+    width: calc(100% - 30px);
+    margin: 15px 15px 10px;
+    padding: 10px;
     box-sizing: border-box;
-    /deep/ .el-scrollbar__wrap {
-      overflow-x: hidden;
-    }
-    .attribute-detail{
-      width: calc(100% - 30px);
-      height: 500px;
-      margin: 15px 15px 10px;
-      box-sizing: border-box;
-      border-left: 1px solid #eee;
-      box-shadow: 0px 1px 5px 0px rgba(59, 66, 84, 0.15);
-    }
-    .implement-detail{
-      width: calc(100% - 30px);
-      height: 500px;
-      margin: 15px 15px 10px;
-      box-sizing: border-box;
-      border-left: 1px solid #eee;
-      box-shadow: 0px 1px 5px 0px rgba(59, 66, 84, 0.15);
-    }
+    border-left: 1px solid #eee;
+    box-shadow: 0px 1px 5px 0px rgba(59, 66, 84, 0.15);
+  }
+
+  .img-item {
+    position: relative;
+    cursor: pointer;
   }
+}
 </style>

+ 76 - 58
src/components/data_admin/buildTask/detail/deviceDetail.vue

@@ -3,7 +3,7 @@
     <el-scrollbar style="height:100%;">
       <div class="attribute-detail detail-item">
         <el-form :model="detail" label-width="150px">
-          <el-form-item label="设备基本信息"></el-form-item>
+          <el-form-item label="设备基本信息"></el-form-item>
           <el-form-item label="任务创建时间:">{{ detail.CreateTime || '--' }}</el-form-item>
           <el-form-item label="任务当前状态:">{{ detail.TaskState || '--' }}</el-form-item>
           <el-form-item label="任务执行方案:">{{ detail.TaskId || '--' }}</el-form-item>
@@ -13,47 +13,86 @@
           <el-form-item label="设备本地编码:">{{ detail.EquipLocalID || '--' }}</el-form-item>
           <el-form-item label="设计图纸中编码:">{{ detail.CadId || '--' }}</el-form-item>
           <el-form-item label="安装位置:">{{ detail.InstallLocation || '--' }}</el-form-item>
-          <el-form-item label="生产厂家:">{{ detail.Equipment.DpSupplierID || '--' }}</el-form-item>
-          <el-form-item label="型号:">{{ detail.Equipment.DpManufacturerID || '--' }}</el-form-item>
-          <el-form-item label="包含部件:">{{ detail.EquipId || '--' }}</el-form-item>
-          <el-form-item label="执行任务人:">{{ detail.WorkerName || '--' }}</el-form-item>
-          <el-form-item label="执行时间:">{{ detail.ProcessTime || '--' }}</el-form-item>
+          <el-form-item label="生产厂家:">{{ detail.Manufacturer || '--' }}</el-form-item>
+          <el-form-item label="型号:">{{ detail.Specification || '--' }}</el-form-item>
+          <el-form-item label="供应商:">{{ detail.Supplier || '--' }}</el-form-item>
+          <el-form-item label="包含部件:">
+            <div v-if="detail.Component && detail.Component.length">
+              <p v-for="(item, index) in detail.Component?detail.Component:[]" :key="index" show-overflow-tooltip>
+               {{ item.EquipName }}
+              </p>
+            </div>
+            <div v-else>--</div>
+          </el-form-item>
         </el-form>
       </div>
-      <div class="implement-detail detail-item">
+      <div class="implement-detail detail-item" v-if="detail.TaskState == '未找到'">
         <el-form :model="detail" label-width="150px">
-          <el-form-item label="未找到对象信息:"></el-form-item>
-          <el-form-item label="部件信息:">{{ '' || '--' }}</el-form-item>
+          <el-form-item label="执行任务人:">{{ detail.WorkerName || '--' }}</el-form-item>
+          <el-form-item label="执行时间:">{{ detail.ProcessTime || '--' }}</el-form-item>
+          <el-form-item label="未找到对象信息"></el-form-item>
+          <el-form-item label="部件信息:">
+            <div v-if="detail.ComponentCount && detail.ComponentCount.length">
+              <p v-for="item in detail.ComponentCount?detail.ComponentCount:[]" :key="item.code" show-overflow-tooltip>
+               {{ `${item.name}:${item.count}`}}
+              </p>
+            </div>
+            <div v-else>--</div>
+          </el-form-item>
           <el-form-item label="全景图:">
+            <div class="img-item" @click="dialogVisible = true">
+              <img src="@/assets/house.jpg" style="width:100%;" alt="图片走丢了">
+            </div>
+          </el-form-item>
+          <el-form-item label="部件照片:">
             <div class="img-item">
               <div class="demo-image__preview">
                 <el-image style="width:100%;" @click="nowUrl = url1" :src="url1" :preview-src-list="srcList"></el-image>
                 <el-image style="width:100%;" @click="nowUrl = url2" :src="url2" :preview-src-list="srcList"></el-image>
                 <el-image style="width:100%;" @click="nowUrl = url3" :src="url3" :preview-src-list="srcList"></el-image>
-                </div>
-              <div class="img-hide">
-                <i class="el-icon-help" style="font-size:30px;"></i><br />
-                <span> 点击查看全景图 </span>
               </div>
             </div>
           </el-form-item>
-          <el-form-item label="部件照片:">
-            
-          </el-form-item>
           <el-form-item label="现场视频:">
-            <div class="img-item">
-              <img src="@/assets/house.jpg" style="width:100%;" alt="图片走丢了">
-              <div class="img-hide">
-                <i class="el-icon-help" style="font-size:30px;"></i><br />
-                <span> 点击查看视频 </span>
-              </div>
-            </div>
+            <video controls style="width:100%;">
+              <source src="https://www.runoob.com/try/demo_source/movie.mp4" type="video/mp4">
+              您的浏览器不支持 HTML5 video ,暂无法播放。
+            </video>
           </el-form-item>
           <el-form-item label="备注信息:">{{ detail.Note || '--' }}</el-form-item>
         </el-form>
       </div>
-      <div class="operation-detail detail-item"></div>
+      <div class="operation-detail detail-item">
+        <el-form>
+          <el-form-item label="操作信息:"></el-form-item>
+          <div class="block">
+            <el-timeline>
+              <el-timeline-item timestamp="2018/4/12" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/12 20:46</p>
+                </el-card>
+              </el-timeline-item>
+              <el-timeline-item timestamp="2018/4/3" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/3 20:46</p>
+                </el-card>
+              </el-timeline-item>
+              <el-timeline-item timestamp="2018/4/2" placement="top">
+                <el-card>
+                  <h4>更新 Github 模板</h4>
+                  <p>王小虎 提交于 2018/4/2 20:46</p>
+                </el-card>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </el-form>
+      </div>
     </el-scrollbar>
+    <el-dialog title="全景图" :visible.sync="dialogVisible" width="70%" append-to-body>
+      一张图
+    </el-dialog>
   </div>
 </template>
 
@@ -68,11 +107,11 @@ export default {
     ...mapGetters("layout", ["projectId"]),
     srcList: function () {
       let index = this.urls.indexOf(this.nowUrl) >= 1 ? this.urls.indexOf(this.nowUrl) : 0;
-    //  let temp = this.urls.concat();
-    let temp = this.urls;
+      //  let temp = this.urls.concat();
+      let temp = this.urls;
       let tempArr1 = temp.slice(0, index);
       let tempArr2 = temp.slice(index, temp.length);
-      
+
       let res = tempArr2.concat(tempArr1);
       return res;
     }
@@ -82,6 +121,7 @@ export default {
   },
   data() {
     return {
+      dialogVisible: false,//全景图弹出框
       nowUrl: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',//当前正在显示的图
       url1: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
       url2: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
@@ -93,12 +133,9 @@ export default {
     console.log(this.detail);
   },
   methods: {
-    handleClick(){
-      debugger
-    }
   },
   watch: {
-    id: {
+    detail: {
       handler(newName, oldName) {
         // this.page.pageNumber = 1
         // this.getTableData()
@@ -117,6 +154,14 @@ export default {
   /deep/ .el-scrollbar__wrap {
     overflow-x: hidden;
   }
+  /deep/ .el-icon-circle-close {
+    color: white;
+  }
+
+  /deep/ .el-form-item__content {
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
 
   .detail-item {
     width: calc(100% - 30px);
@@ -129,34 +174,7 @@ export default {
 
   .img-item {
     position: relative;
-  }
-
-  .img-item:hover {
-    .img-hide {
-      height: 100%;
-      transition: all 1s;
-    }
-  }
-
-  .img-hide {
-    color: white;
-    font-size: 16px;
-    font-weight: 400;
-    width: 100%;
-    height: 0px;
-    background: rgba(0, 0, 0, 0.2);
-    position: absolute;
-    top: 0px;
-    right: 0px;
-    display: flex;
-    overflow: hidden;
-    -webkit-align-items: center;
-    align-items: center;
-    -webkit-justify-content: center;
-    justify-content: center;
-    text-align: center;
     cursor: pointer;
-    display: none;
   }
 }
 </style>

+ 97 - 124
src/components/data_admin/buildTask/dialog/modelTaskDialog.vue

@@ -6,27 +6,25 @@
         <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column type="expand">
           <template slot-scope="props">
-            <p v-if="props.row.partsList && props.row.partsList.length" style="color:#99a9bf;line-height:32px;font-size:14px;">包含的部件:</p>
-            <el-form label-position="left" inline class="demo-table-expand" v-if="props.row.partsList && props.row.partsList.length">
-              <el-form-item v-for="item in props.row.partsList" :key="item.name" :label="`${item.name}:`">
-                <span>{{ item.number }}</span>
+            <p v-if="props.row.ComponentCount && props.row.ComponentCount.length" style="color:#99a9bf;line-height:32px;font-size:14px;">包含的部件:</p>
+            <el-form label-position="left" label-width="auto" inline class="demo-table-expand" v-if="props.row.ComponentCount && props.row.ComponentCount.length">
+              <el-form-item v-for="item in props.row.ComponentCount?props.row.ComponentCount:[]" :key="item.code" :label="`${item.name}:`">
+                <span>{{ item.count }}</span>
               </el-form-item>
             </el-form>
           </template>
         </el-table-column>
-        <el-table-column label="所属模型文件夹" width="110" show-overflow-tooltip>
-          <template slot-scope="scope">{{ scope.row.build }}</template>
-        </el-table-column>
-        <el-table-column label="模型文件名" width="100" show-overflow-tooltip>
-          <template slot-scope="scope">{{ scope.row.floor }}</template>
-        </el-table-column>
+        <el-table-column prop="FolderName" label="所属模型文件夹" width="110" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="FileName" label="模型文件名" width="80" show-overflow-tooltip></el-table-column>
         <el-table-column prop="EquipLocalName" label="设备本地名称" show-overflow-tooltip width="100"></el-table-column>
-        <el-table-column prop="EquipLocalId" label="设备本地编码" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="EquipName" label="设备类" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="installation" label="BIM ID" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="EquipLocalID" label="设备本地编码" show-overflow-tooltip width="100"></el-table-column>
+        <el-table-column prop="EquipCategory.EquipName" label="设备类" show-overflow-tooltip width="120"></el-table-column>
+        <el-table-column prop="BimId" label="BIM Id" show-overflow-tooltip width="80"></el-table-column>
         <el-table-column prop="type" label="现场验证操作规定" width="150">
           <template slot-scope="scope">
-            <el-button @click.native.prevent="handleOpenDetail(scope.row, tableData)" type="text" size="small">详情</el-button>
+            <el-select style="width:100px;" v-model="scope.row.SchemeId" placeholder="请选择">
+              <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            </el-select>
           </template>
         </el-table-column>
         <template slot="empty">
@@ -49,8 +47,9 @@
 </template>
 
 <script>
-import {  } from "@/api/scan/request";
-import { mapGetters } from "vuex";
+import { queryEquip } from "@/api/scan/request"
+import { createModelTask } from "@/api/data_admin/buildTaskApi"
+import { mapGetters } from "vuex"
 export default {
   components: {
     
@@ -61,55 +60,11 @@ export default {
   data() {
     return {
       title: "确认创建任务",
-      tableData: [{
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1',
-        partsList: [{
-          name: '部件1',
-          number: 6
-        }, {
-          name: '部件2',
-          number: 23
-        }, {
-          name: '部件3',
-          number: 5
-        }, {
-          name: '部件4',
-          number: 9
-        }, {
-          name: '部件5',
-          number: 1
-        }]
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
+      options: [{//方案
+        value: '1',
+        label: '标准'
       }],
+      tableData: [],
       loading: false,
       selections: [], // 选中项
       page: {
@@ -133,16 +88,72 @@ export default {
   methods: {
     getTableData() {
       let params = {
-        Cascade: [{ Name: 'equipCategory' }],
-        Orders: "CreateTime desc, EquipID desc",
+        Cascade: [
+          {
+            Name: "equipCategory",
+            Projection: ["EquipCode", "EquipName"]
+          },
+          {
+            Name: "component",
+            Cascade: [{Name: "equipCategory"}]
+          },
+          {
+            Name: "building",
+            Projection: [ "BuildLocalName", "BuildName", "BuildID" ]
+          },
+          {
+            Name: "floor",
+            Projection: [ "FloorLocalName", "FloorName", "FloorID" ]
+          }
+        ],
+        Filters: `ProjectId='${this.projectId}'`,
+        Orders: "CreateTime desc, EquipID asc",
         PageNumber: this.page.pageNumber,
-        PageSize: this.page.pageSize,
+        PageSize: this.page.pageSize
       }
-      // unshaftInSys(params, res => {
-        /**将模型文件夹和模型文件名加入到table数据中 */
-        this.tableData = res.Content
+
+      if(this.params.spaceList && this.params.spaceList.length){
+        //通过平面图区域查询(接口未支持)
+      } else {
+        params.Filters += `;ModelId='${this.params.CurrentModelId}'`
+      }
+
+      if(this.params.isVerification){
+        params.Filters += `;TaskState isNull`
+      }
+
+      if(this.params.device){
+        params.Filters += `;Category='${this.params.category}'`
+      }
+
+      queryEquip(params, res => {
+        this.tableData = res.Content.map(item => {
+          if(item.Component && item.Component.length){
+            item.ComponentCount = []
+            item.Component.map(parts => {
+              if(parts.EquipCategory && parts.EquipCategory.EquipCode && parts.EquipCategory.EquipName){
+                let index = item.ComponentCount.findIndex(c => {return c.code == parts.EquipCategory.EquipCode})
+                if(index != -1){
+                  item.ComponentCount[index].count++
+                } else {
+                  item.ComponentCount.push({
+                    name: parts.EquipCategory.EquipName,
+                    code: parts.EquipCategory.EquipCode,
+                    count: 1
+                  })
+                }
+              }
+            })
+          }
+          item.FolderName = this.params.modelFolderName
+          item.FolderId = this.params.modelFolderId
+          item.FileName = this.params.modelFileName
+          item.FileId = this.params.CurrentModelId
+          item.SchemeId = "1"
+          return item
+        })
         this.page.total = res.Total
-      // })
+      })
     },
     //选中项修改
     handleSelectionChange(val) {
@@ -150,16 +161,25 @@ export default {
     },
     savaRelation() {
       if(this.selections.length){
+        let list = this.selections.map((item) => {
+          return {
+            EquipId: item.EquipID,
+            FileId: item.FileId,
+            FileName: item.FileName,
+            FolderId: item.FolderId,
+            FolderName: item.FolderName
+          }
+        })
         let params = {
-          
+          Content: list
         }
-        // linkSySh(params, res => {
+        createModelTask(params, res => {
           this.$emit('update:dialogVisible',false)
           this.$message.success('创建成功!')
           this.$router.push({name:'buildTask'})//跳转回首页
-        // })
+        })
       }else {
-        this.$message('请选择要创建的设备!')
+        this.$message('请选择要创建的任务!')
       }
     },
     //改变pagesize
@@ -169,6 +189,7 @@ export default {
     },
     //改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData();
     },
@@ -179,55 +200,7 @@ export default {
   watch: {
     dialogVisible(newData,oldData){
       if(newData){
-        this.tableData = [{
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1',
-        partsList: [{
-          name: '部件1',
-          number: 6
-        }, {
-          name: '部件2',
-          number: 23
-        }, {
-          name: '部件3',
-          number: 5
-        }, {
-          name: '部件4',
-          number: 9
-        }, {
-          name: '部件5',
-          number: 1
-        }]
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }]
+        this.tableData = []
         this.page.pageNumber = 1
         this.getTableData()
       }

+ 0 - 2
src/components/data_admin/buildTask/draw/drawModel.vue

@@ -81,11 +81,9 @@ export default {
         if(list.length){
           return list
         } else {
-          this.$message('请选择模型空间')
           return []
         }
       } else {
-        this.$message('请选择模型空间')
         return []
       }
     },

+ 70 - 0
src/components/data_admin/buildTask/lib/assetsCascader.vue

@@ -0,0 +1,70 @@
+<template>
+  <div id="cascaderMap">
+    <span class="buildFloor" style="margin-right: 12px;">设备族</span>
+    <el-select v-model="value" placeholder="请选择" clearable filterable :style="isWidth ? '' : 'width:160px;'" size="small" @change="changeVal">
+      <el-option  v-for="item in options" :key="item.Code" :label="item.Name" :value="item.Code"></el-option>
+    </el-select>
+  </div>
+</template>
+<script>
+import { mapGetters } from 'vuex';
+import { queryAssetsFamily } from "@/api/data_admin/buildTaskApi"
+export default {
+  props: {
+    isWidth: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      value: "",
+      options: []
+    };
+  },
+  created() {
+    this.getData();
+  },
+  watch: {
+    projectId() {
+      this.value = '';
+      this.getData();
+    }
+  },
+  methods: {
+    setValue(val) {
+      this.value = val
+    },
+    //修改val
+    changeVal(val) {
+      let value = {}
+      this.options.map(item => {
+        if (item.Code == val) {
+          value = item
+        }
+      })
+      this.value = val
+      this.$emit("change", value)
+    },
+    //获取当前项目下的资产任务-设备族
+    getData() {
+      queryAssetsFamily('', res => {
+        this.options = res.Content
+      })
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#cascaderMap {
+  float: left;
+  margin-left: 10px;
+  .buildFloor {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 70 - 0
src/components/data_admin/buildTask/lib/deviceCascader.vue

@@ -0,0 +1,70 @@
+<template>
+  <div id="cascaderMap">
+    <span class="buildFloor" style="margin-right: 12px;">设备类别</span>
+    <el-select v-model="value" placeholder="请选择" clearable filterable :style="isWidth ? '' : 'width:160px;'" size="small" @change="changeVal">
+      <el-option  v-for="item in options" :key="item.Code" :label="item.Name" :value="item.Code"></el-option>
+    </el-select>
+  </div>
+</template>
+<script>
+import { mapGetters } from 'vuex';
+import { queryDeviceCategory } from "@/api/data_admin/buildTaskApi"
+export default {
+  props: {
+    isWidth: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      value: "",
+      options: []
+    };
+  },
+  created() {
+    this.getData();
+  },
+  watch: {
+    projectId() {
+      this.value = '';
+      this.getData();
+    }
+  },
+  methods: {
+    setValue(val) {
+      this.value = val
+    },
+    //修改val
+    changeVal(val) {
+      let value = {}
+      this.options.map(item => {
+        if (item.Code == val) {
+          value = item
+        }
+      })
+      this.value = val
+      this.$emit("change", value)
+    },
+    //获取当前项目下的设备任务-设备类型
+    getData() {
+      queryDeviceCategory('', res => {
+        this.options = res.Content
+      })
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#cascaderMap {
+  float: left;
+  margin-left: 10px;
+  .buildFloor {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 70 - 0
src/components/data_admin/buildTask/lib/modelCascader.vue

@@ -0,0 +1,70 @@
+<template>
+  <div id="cascaderMap">
+    <span class="buildFloor" style="margin-right: 12px;">设备类别</span>
+    <el-select v-model="value" placeholder="请选择" clearable filterable :style="isWidth ? '' : 'width:160px;'" size="small" @change="changeVal">
+      <el-option  v-for="item in options" :key="item.Code" :label="item.Name" :value="item.Code"></el-option>
+    </el-select>
+  </div>
+</template>
+<script>
+import { mapGetters } from 'vuex';
+import { queryModelCategory } from "@/api/data_admin/buildTaskApi"
+export default {
+  props: {
+    isWidth: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      value: "",
+      options: []
+    };
+  },
+  created() {
+    this.getData();
+  },
+  watch: {
+    projectId() {
+      this.value = '';
+      this.getData();
+    }
+  },
+  methods: {
+    setValue(val) {
+      this.value = val
+    },
+    //修改val
+    changeVal(val) {
+      let value = {}
+      this.options.map(item => {
+        if (item.Code == val) {
+          value = item
+        }
+      })
+      this.value = val
+      this.$emit("change", value)
+    },
+    //获取当前项目下的模型任务-设备类型
+    getData() {
+      queryModelCategory('', res => {
+        this.options = res.Content
+      })
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#cascaderMap {
+  float: left;
+  margin-left: 10px;
+  .buildFloor {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 81 - 0
src/components/data_admin/buildTask/lib/modelFile.vue

@@ -0,0 +1,81 @@
+<template>
+    <div id="modelFile">
+        <span class="modelFile" style="margin-right: 12px;">模型文件</span>
+        <el-cascader :options="options" :props="props" :show-all-levels="false" @change="handleChange" style="width:160px;"
+        clearable placeholder="请选择模型文件" v-model="casVal"></el-cascader>
+    </div>
+</template>
+<script>
+import tools from "@/utils/scan/tools"
+import { queryModelFile } from "@/api/data_admin/buildTaskApi"
+import { mapGetters, mapActions } from "vuex"
+
+export default {
+  computed: {
+    ...mapGetters("layout", [ "projectId", "secret", "userId" ])
+  },
+  data() {
+    return {
+      casVal: [],
+      options: [],
+      modelIdToFloorId: {},
+      props: {
+        value: "FileId",
+        label: "FileName",
+        children: "FileList"
+      },
+    };
+  },
+  created() {
+    this.init()
+  },
+  watch: {
+    projectId() {
+      this.casVal =[]
+      this.options = []
+      this.init()
+    }
+  },
+  methods: {
+    //设置默认选项
+    setValue(val) {
+        if (val && val.length) {
+          this.casVal = val
+        }
+    },
+    //获取数据
+    init() {
+      this.getDirectory()
+    },
+    // 获取文件夹
+    getDirectory() {
+      queryModelFile("", res => {
+        this.options = res.Content.map(item => {
+          item.FileId = item.FolderId
+          item.FileName = item.FolderName
+          return item
+        })
+      });
+    },
+    //改变item
+    handleChange(value) {
+      this.$emit("change", value)
+    }
+  }
+};
+</script>
+<style lang="less">
+    .el-cascader .el-input .el-input__inner {
+        vertical-align: bottom;
+    }
+</style>
+<style lang="less" scoped>
+    #modelFile {
+        margin-left: 10px;
+        float: left;
+        .modelFile {
+            color: #999999;
+            font-size: 14px;
+        }
+    }
+</style>

+ 53 - 0
src/components/data_admin/buildTask/lib/taskState.vue

@@ -0,0 +1,53 @@
+<template>
+  <div id="cascaderMap">
+    <span class="task-state" style="margin-right: 12px;">任务执行情况</span>
+    <el-select v-model="taskState" placeholder="请选择" filterable style="width:120px;" size="small" @change="changeState">
+      <el-option  v-for="item in taskStateList" :key="item.code" :label="item.label" :value="item.value"></el-option>
+    </el-select>
+  </div>
+</template>
+<script>
+import { mapGetters } from 'vuex';
+export default {
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      taskStateList: [{
+				value: '',
+				label: '全部'
+			}, {
+				value: 1,
+				label: '待验证'
+			}, {
+				value: 0,
+				label: '已完成'
+			}, {
+				value: -1,
+				label: '未找到'
+			}],
+			taskState: '',//任务执行情况
+    };
+  },
+  methods: {
+    setValue(val) {
+      this.taskState = val
+    },
+    //修改val
+    changeState(val) {
+      this.$emit("change", val)
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#cascaderMap {
+  float: left;
+  margin-left: 10px;
+  .task-state {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 37 - 10
src/components/data_admin/buildTask/table/assetsTable.vue

@@ -10,9 +10,9 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="LocalName" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="LocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="Family" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalID" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalName" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipFamily.FamilyName" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="InstallLocation" label="安装位置" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="TaskState" label="任务执行情况" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="action" label="操作" min-width="100">
@@ -35,13 +35,13 @@
      :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="page.total">
     </el-pagination>
     <el-drawer title="任务详情" :visible.sync="drawer" direction="rtl" size="600px">
-      <assets-detail :id="detailId"></assets-detail>
+      <assets-detail :detail="detailAssets"></assets-detail>
     </el-drawer>
   </div>
 </template>
 
 <script>
-import { queryAssetsTask, deleteAssetsTask } from "@/api/data_admin/buildTaskApi"
+import { queryAssetsTask, deleteAssetsTask, createAssetsTask, updateAssetsTask } from "@/api/data_admin/buildTaskApi"
 import { mapGetters } from "vuex"
 import assetsDetail from '../detail/assetsDetail'
 export default {
@@ -59,7 +59,7 @@ export default {
       inSpaceType: '资产',
       loading: false, // loading
       drawer: false, // 详情侧弹窗
-      detailId: '',
+      detailAssets: {},
       tableData: [], //列表数据
       page: {
         pageSize: 50,
@@ -89,7 +89,7 @@ export default {
         Filters: `ProjectId='${this.projectId}'`,
         Cascade: [
           {
-            Name: 'familyName'
+            Name: 'equipFamily'
           }, {
             Name: 'building',
           }, {
@@ -114,7 +114,7 @@ export default {
         params.Filters += `;TaskState=${this.paramsData.taskState}`
       }
       if(this.paramsData.family){
-        params.Filters += `;Family='${this.paramsData.family}'`
+        params.Filters += `;Category='${this.paramsData.family}'`
       }
       queryAssetsTask(params, res => {
         this.page.total = res.Total;
@@ -140,10 +140,36 @@ export default {
         this.$message("取消删除")
       })
     },
+    //重新生成任务
+    handleRegenerate(index, row){
+      let params = {
+        Content: [{
+          EquipId: row.EquipId,
+          TaskState: -1
+        }]
+      }
+      createAssetsTask(params, res => {
+        this.$message.success('重新生成任务成功!')
+        this.getTableData()
+      })
+    },
+    //认可此任务执行情况
+    handleConfirm(index, row){
+      let params = {
+        Content: [{
+          TaskId: row.TaskId,
+          TaskState: 0
+        }]
+      }
+      updateAssetsTask(params, res => {
+        this.$message.success('更新成功!')
+        this.getTableData()
+      })
+    },
     //查看任务详情
-    handleDetail() {
+    handleDetail(row) {
       this.drawer = true
-      this.detailId = row.TaskId
+      this.detailAssets = row
     },
     // 改变pagesize
     handleSizeChange(pageSize) {
@@ -152,6 +178,7 @@ export default {
     },
     // 改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData()
     }

+ 53 - 18
src/components/data_admin/buildTask/table/deviceTable.vue

@@ -13,24 +13,15 @@
         <el-table-column :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100">
           <template slot-scope="scope">
             <div>
-              {{scope.row.LocalName}}
+              {{scope.row.EquipLocalName}}
               <el-badge v-if="scope.row.Equipment?scope.row.Equipment.Component?scope.row.Equipment.Component.length:false:false" 
                 :value="scope.row.Equipment?scope.row.Equipment.Component?scope.row.Equipment.Component.length:0:0" class="item" type="warning">
               </el-badge>
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="LocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="Equipment.EquipCategory.EquipName" :label="`${inSpaceType}类型`" show-overflow-tooltip min-width="100">
-          <template slot-scope="scope">
-            <div>
-              {{scope.row.Equipment?
-              scope.row.Equipment.EquipCategory?
-              scope.row.Equipment.EquipCategory.EquipName?
-              scope.row.Equipment.EquipCategory.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="InstallLocation" label="安装位置" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="TaskState" label="任务执行情况" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="action" label="操作" min-width="100">
@@ -53,13 +44,13 @@
      :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="page.total">
     </el-pagination>
     <el-drawer title="任务详情" :visible.sync="drawer" direction="rtl" size="600px">
-      <device-detail :id="detailId"></device-detail>
+      <device-detail :detail="detailDevice"></device-detail>
     </el-drawer>
   </div>
 </template>
 
 <script>
-import { queryDeviceTask, deleteDeviceTask } from "@/api/data_admin/buildTaskApi"
+import { queryDeviceTask, deleteDeviceTask, createDeviceTask, updateDeviceTask } from "@/api/data_admin/buildTaskApi"
 import { mapGetters } from "vuex"
 import deviceDetail from '../detail/deviceDetail'
 export default {
@@ -77,7 +68,7 @@ export default {
       inSpaceType: '设备',
       loading: false, // loading
       drawer: false, // 详情侧弹窗
-      detailId: '',
+      detailDevice: {},
       tableData: [], //列表数据
       page: {
         pageSize: 50,
@@ -133,12 +124,29 @@ export default {
       if(this.paramsData.taskState !== ''){
         params.Filters += `;TaskState=${this.paramsData.taskState}`
       }
-      if(this.paramsData.category){
-        params.Filters += `;Category='${this.paramsData.category}'`
+      if(this.paramsData.deviceCategory){
+        params.Filters += `;Category='${this.paramsData.deviceCategory}'`
       }
       queryDeviceTask(params, res => {
         this.page.total = res.Total;
         this.tableData = res.Content.map(item => {
+          if(item.Component && item.Component.length){
+            item.ComponentCount = []
+            item.Component.map(parts => {
+              if(parts.EquipCategory && parts.EquipCategory.EquipCode && parts.EquipCategory.EquipName){
+                let index = item.ComponentCount.findIndex(c => {return c.code == parts.EquipCategory.EquipCode})
+                if(index != -1){
+                  item.ComponentCount[index].count++
+                } else {
+                  item.ComponentCount.push({
+                    name: parts.EquipCategory.EquipName,
+                    code: parts.EquipCategory.EquipCode,
+                    count: 1
+                  })
+                }
+              }
+            })
+          }
           item.TaskState = this.taskStateMap[item.TaskState]
           return item
         })
@@ -160,10 +168,36 @@ export default {
         this.$message("取消删除")
       })
     },
+    //重新生成任务
+    handleRegenerate(index, row){
+      let params = {
+        Content: [{
+          EquipId: row.EquipId,
+          TaskState: -1
+        }]
+      }
+      createDeviceTask(params, res => {
+        this.$message.success('重新生成任务成功!')
+        this.getTableData()
+      })
+    },
+    //认可此任务执行情况
+    handleConfirm(index, row){
+      let params = {
+        Content: [{
+          TaskId: row.TaskId,
+          TaskState: 0
+        }]
+      }
+      updateDeviceTask(params, res => {
+        this.$message.success('更新成功!')
+        this.getTableData()
+      })
+    },
     //查看任务详情
     handleDetail(index, row) {
       this.drawer = true
-      this.detailId = row.TaskId
+      this.detailDevice = row
     },
     // 改变pagesize
     handleSizeChange(pageSize) {
@@ -172,6 +206,7 @@ export default {
     },
     // 改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData()
     }

+ 57 - 15
src/components/data_admin/buildTask/table/modelTable.vue

@@ -7,19 +7,15 @@
         <el-table-column :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100">
           <template slot-scope="scope">
             <div>
-              {{scope.row.LocalName}}
+              {{scope.row.EquipLocalName}}
               <el-badge v-if="scope.row.Equipment?scope.row.Equipment.Component?scope.row.Equipment.Component.length:false:false" 
                 :value="scope.row.Equipment?scope.row.Equipment.Component?scope.row.Equipment.Component.length:0:0" class="item" type="warning">
               </el-badge>
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="LocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column :label="`${inSpaceType}类型`" show-overflow-tooltip min-width="80">
-          <template slot-scope="scope">
-            <div>{{scope.row.EquipCategory?scope.row.EquipCategory.EquipName?scope.row.EquipCategory.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="80"></el-table-column>
         <el-table-column prop="BIMID" label="BIM ID" show-overflow-tooltip min-width="190"></el-table-column>
         <el-table-column prop="TaskState" label="任务执行情况" show-overflow-tooltip min-width="60"></el-table-column>
         <el-table-column prop="action" label="操作" min-width="100">
@@ -48,7 +44,7 @@
 </template>
 
 <script>
-import { queryModelTask, deleteModelTask } from "@/api/data_admin/buildTaskApi"
+import { queryModelTask, deleteModelTask, updateModelTask, createModelTask } from "@/api/data_admin/buildTaskApi"
 import { mapGetters } from "vuex"
 import deviceDetail from '../detail/deviceDetail'
 export default {
@@ -66,7 +62,7 @@ export default {
       inSpaceType: '设备',
       loading: false, // loading
       drawer: false, // 详情侧弹窗
-      detailModel: '',
+      detailModel: {},
       tableData: [], //列表数据
       taskStateMap: {
         '-1': '未找到',
@@ -96,9 +92,7 @@ export default {
         Filters: `ProjectId='${this.projectId}'`,
         Cascade: [
           {
-            Name: 'equipment',
-            Cascade: [{ Name: 'component' }]
-            // Name: 'component'
+            Name: 'component'
           }, {
             Name: 'equipCategory'
           }
@@ -113,18 +107,35 @@ export default {
       if(this.paramsData.modelFile){
         params.Filters += `;FileId='${this.paramsData.modelFile}'`
       }
-      if(this.paramsData.category){
-        params.Filters += `;Category='${this.paramsData.category}'`
+      if(this.paramsData.modelCategory){
+        params.Filters += `;Category='${this.paramsData.modelCategory}'`
       }
       queryModelTask(params, res => {
         this.page.total = res.Total;
         this.tableData = res.Content.map(item => {
+          if(item.Component && item.Component.length){
+            item.ComponentCount = []
+            item.Component.map(parts => {
+              if(parts.EquipCategory && parts.EquipCategory.EquipCode && parts.EquipCategory.EquipName){
+                let index = item.ComponentCount.findIndex(c => {return c.code == parts.EquipCategory.EquipCode})
+                if(index != -1){
+                  item.ComponentCount[index].count++
+                } else {
+                  item.ComponentCount.push({
+                    name: parts.EquipCategory.EquipName,
+                    code: parts.EquipCategory.EquipCode,
+                    count: 1
+                  })
+                }
+              }
+            })
+          }
           item.TaskState = this.taskStateMap[item.TaskState]
           return item
         })
       })
     },
-    // 删除关系
+    // 删除任务
     handleDelete(index, row) {
       this.$confirm("确认删除该任务?", "提示", {
         confirmButtonText: '确定',
@@ -140,6 +151,36 @@ export default {
         this.$message("取消删除")
       })
     },
+    //重新生成任务
+    handleRegenerate(index, row){
+      let params = {
+        Content: [{
+          EquipId: row.EquipId,
+          FileId: row.FileId,
+          FileName: row.FileName,
+          FolderId: row.FolderId,
+          FolderName: row.FolderName,
+          TaskState: -1
+        }]
+      }
+      createModelTask(params, res => {
+        this.$message.success('重新生成任务成功!')
+        this.getTableData()
+      })
+    },
+    //认可此任务执行情况
+    handleConfirm(index, row){
+      let params = {
+        Content: [{
+          TaskId: row.TaskId,
+          TaskState: 0
+        }]
+      }
+      updateModelTask(params, res => {
+        this.$message.success('更新成功!')
+        this.getTableData()
+      })
+    },
     //查看任务详情
     handleDetail(index, row) {
       this.drawer = true
@@ -152,6 +193,7 @@ export default {
     },
     // 改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData()
     }

+ 27 - 23
src/components/data_admin/buildTask/table/replaceTable.vue

@@ -10,9 +10,9 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="LocalName" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="LocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="Family" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalID" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalName" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipFamily.FamilyName" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="InstallLocation" label="安装位置" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="TaskType" label="任务执行情况" show-overflow-tooltip min-width="100"></el-table-column>
         <!-- <el-table-column prop="action" label="操作" min-width="100">
@@ -68,7 +68,10 @@ export default {
         total: 0
       },
       taskTypeMap: {//待撕码,待换码
-
+        '-5': '已撕码',
+        '3': '待撕码',
+        '2': '待换码',
+        '0': '正常贴码'
       },
       taskStateMap: {
         '-1': '未找到',
@@ -83,16 +86,16 @@ export default {
     };
   },
   created() {
-    // this.getTableData()
+    this.getTableData()
   },
   methods: {
     // 获取列表数据
     getTableData() {
       let params = {
-        Filters: `ProjectId='${this.projectId}'`,
+        Filters: `ProjectId='${this.projectId}';TaskType in ['2']`,
         Cascade: [
           {
-            Name: 'familyName'
+            Name: 'equipFamily'
           }, {
             Name: 'building',
           }, {
@@ -103,22 +106,22 @@ export default {
         PageNumber: this.page.pageNumber,
         PageSize: this.page.pageSize
       }
-      if (this.paramsData.buildfloor[0] == "noKnow") {
-        params.Filters += `;BuildingId isNull`
-      } else if (this.paramsData.buildfloor[0] && this.paramsData.buildfloor[0] != "all") {
-        params.Filters += `;BuildingId='${this.paramsData.buildfloor[0]}'`
-        if (this.paramsData.buildfloor[1] == "noKnow") {
-          params.Filters += `;FloorId isNull`
-        } else if (this.paramsData.buildfloor[1] && this.paramsData.buildfloor[1] != "all") {
-          params.Filters += `;FloorId='${this.paramsData.buildfloor[1]}'`
-        }
-      }
-      if(this.paramsData.taskState !== ''){
-        params.Filters += `;TaskState=${this.paramsData.taskState}`
-      }
-      if(this.paramsData.family){
-        params.Filters += `;Family='${this.paramsData.family}'`
-      }
+      // if (this.paramsData.buildfloor[0] == "noKnow") {
+      //   params.Filters += `;BuildingId isNull`
+      // } else if (this.paramsData.buildfloor[0] && this.paramsData.buildfloor[0] != "all") {
+      //   params.Filters += `;BuildingId='${this.paramsData.buildfloor[0]}'`
+      //   if (this.paramsData.buildfloor[1] == "noKnow") {
+      //     params.Filters += `;FloorId isNull`
+      //   } else if (this.paramsData.buildfloor[1] && this.paramsData.buildfloor[1] != "all") {
+      //     params.Filters += `;FloorId='${this.paramsData.buildfloor[1]}'`
+      //   }
+      // }
+      // if(this.paramsData.taskState !== ''){
+      //   params.Filters += `;TaskState=${this.paramsData.taskState}`
+      // }
+      // if(this.paramsData.family){
+      //   params.Filters += `;Family='${this.paramsData.family}'`
+      // }
       queryAssetsTask(params, res => {
         this.page.total = res.Total;
         this.tableData = res.Content.map(item => {
@@ -156,6 +159,7 @@ export default {
     },
     // 改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData()
     }

+ 27 - 23
src/components/data_admin/buildTask/table/tearTable.vue

@@ -10,9 +10,9 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column prop="LocalName" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="LocalId" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="Family" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalID" :label="`${inSpaceType}本地名称`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipLocalName" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="EquipFamily.FamilyName" label="设备族" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="InstallLocation" label="安装位置" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="TaskType" label="任务执行情况" show-overflow-tooltip min-width="100"></el-table-column>
         <!-- <el-table-column prop="action" label="操作" min-width="100">
@@ -68,7 +68,10 @@ export default {
         total: 0
       },
       taskTypeMap: {//待撕码,待换码
-
+        '-5': '已撕码',
+        '3': '待撕码',
+        '2': '待换码',
+        '0': '正常贴码'
       },
       taskStateMap: {
         '-1': '未找到',
@@ -83,16 +86,16 @@ export default {
     };
   },
   created() {
-    // this.getTableData()
+    this.getTableData()
   },
   methods: {
     // 获取列表数据
     getTableData() {
       let params = {
-        Filters: `ProjectId='${this.projectId}'`,
+        Filters: `ProjectId='${this.projectId}';TaskType in ['3','-5']`,
         Cascade: [
           {
-            Name: 'familyName'
+            Name: 'equipFamily'
           }, {
             Name: 'building',
           }, {
@@ -103,22 +106,22 @@ export default {
         PageNumber: this.page.pageNumber,
         PageSize: this.page.pageSize
       }
-      if (this.paramsData.buildfloor[0] == "noKnow") {
-        params.Filters += `;BuildingId isNull`
-      } else if (this.paramsData.buildfloor[0] && this.paramsData.buildfloor[0] != "all") {
-        params.Filters += `;BuildingId='${this.paramsData.buildfloor[0]}'`
-        if (this.paramsData.buildfloor[1] == "noKnow") {
-          params.Filters += `;FloorId isNull`
-        } else if (this.paramsData.buildfloor[1] && this.paramsData.buildfloor[1] != "all") {
-          params.Filters += `;FloorId='${this.paramsData.buildfloor[1]}'`
-        }
-      }
-      if(this.paramsData.taskState !== ''){
-        params.Filters += `;TaskState=${this.paramsData.taskState}`
-      }
-      if(this.paramsData.family){
-        params.Filters += `;Family='${this.paramsData.family}'`
-      }
+      // if (this.paramsData.buildfloor[0] == "noKnow") {
+      //   params.Filters += `;BuildingId isNull`
+      // } else if (this.paramsData.buildfloor[0] && this.paramsData.buildfloor[0] != "all") {
+      //   params.Filters += `;BuildingId='${this.paramsData.buildfloor[0]}'`
+      //   if (this.paramsData.buildfloor[1] == "noKnow") {
+      //     params.Filters += `;FloorId isNull`
+      //   } else if (this.paramsData.buildfloor[1] && this.paramsData.buildfloor[1] != "all") {
+      //     params.Filters += `;FloorId='${this.paramsData.buildfloor[1]}'`
+      //   }
+      // }
+      // if(this.paramsData.taskState !== ''){
+      //   params.Filters += `;TaskState=${this.paramsData.taskState}`
+      // }
+      // if(this.paramsData.family){
+      //   params.Filters += `;Family='${this.paramsData.family}'`
+      // }
       queryAssetsTask(params, res => {
         this.page.total = res.Total;
         this.tableData = res.Content.map(item => {
@@ -156,6 +159,7 @@ export default {
     },
     // 改变pageno
     handleCurrentChange(pageNo) {
+      this.page.pageNumber = 1
       this.page.pageNumber = pageNo;
       this.getTableData()
     }

+ 35 - 41
src/components/ledger/handsontables/system.vue

@@ -32,18 +32,7 @@
     <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>
+    <editSysfloor ref="editFloor" @handleClickUpdate="handleClickUpdate"></editSysfloor>
     <!-- 新增系统 -->
     <el-dialog title="确定新增系统的类型" :visible.sync="myDialog.addDevice" width="30%">
       <el-row>
@@ -57,11 +46,7 @@
 </template>
 <script>
 import {
-  getTableHeader,
-  getBillSystemList,
-  updateBusiness,
   BeatchQueryParam,
-  delBatchList,
   getDataDictionary,
   queryLinkSys,
   updateGeneralSys,
@@ -80,13 +65,11 @@ import dialogAssets from "@/components/ledger/addDialog/dialogSystem"
 import detailsDialog from "@/components/business_space/lib/detailsDia"
 import systemRelevance from "@/components/ledger/tableTransfers"
 import Handsontable from "handsontable-pro"
+import text from "@/utils/handsontable/mainText"
 import 'handsontable-pro/dist/handsontable.full.css'
-import zhCN from 'handsontable-pro/languages/zh-CN'
+import editSysfloor from "@/components/ledger/lib/editSysFloor";
 
-import {
-  mapGetters,
-  mapActions
-} from "vuex";
+import { mapGetters } from "vuex";
 export default {
   components: {
     qrcode, //二维码页面
@@ -97,7 +80,8 @@ export default {
     dialogAssets,
     detailsDialog,
     systemRelevance,
-    myCascader
+    myCascader,
+    editSysfloor
   },
   computed: {
     ...mapGetters("layout", ["projectId", "secret", "userId"]),
@@ -187,7 +171,7 @@ export default {
         getDataDictionary(params, res => {
           this.tableHeader = res.Content;
           this.tableHeader.forEach(item => {
-            if(item.Path && item.InputMode){
+            if (item.Path && item.InputMode) {
               this.inputMap[item.Path] = item.InputMode
             }
           })
@@ -272,6 +256,9 @@ export default {
       let arr = tools.copyArr(list)
       let data = showTools.headerTextFilter(arr, 'system', this.onlyRead, this.showType)
       data.unshift("操作", "关联设备数量");
+      if (this.showType == "all") {
+        data.splice(3, 0, "所属建筑楼层")
+      }
       return data;
     },
     //格式化表内容
@@ -295,6 +282,13 @@ export default {
           item.readOnly = true
         })
       }
+      if (this.showType == "all") {
+        data.splice(3, 0, {
+          data: "sysInBuildFloor",
+          renderer: text.sysInBuildFloor,
+          readOnly: this.onlyRead
+        })
+      }
       return data;
     },
     //获取动态参数
@@ -478,7 +472,7 @@ export default {
     async removeSys(param) {
       await deleteGeneralSys(param, res => {
         this.$message.success("删除成功")
-        this.$emit('close','')
+        this.$emit('close', '')
         this.getTableData()
       })
     },
@@ -488,7 +482,7 @@ export default {
         Content: [],
         Projection: []
       }, keyList = [];
-       //生成要修改字段列表
+      //生成要修改字段列表
       change.map(item => {
         let key = item[1].split(".")[0]
         if (item[1] && keyList.indexOf(key) == -1) {
@@ -520,7 +514,11 @@ export default {
         //操作
         case 'caozuo':
           // window.open(`http://adm.sagacloud.cn:8058/system?id=${infos.id}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
-          this.$message("开发中...")
+          // this.$message("开发中...")
+          this.$router.push({
+            path: "/ledger/systemDetail",
+            query: { SysID: infos.SysID, Name: infos.SysLocalName || infos.SysName, SysType:infos.Category }
+          })
           return false
         //设备二维码图片
         case 'EquipQRCode':
@@ -541,24 +539,20 @@ export 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
+        // this.updateInfoPoint = val
+        // this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        let floor = tools.dataForKey(this.tableData[row.row], val);
+        this.$refs.editFloor.showDialog();
       }
     },
-    //关闭临时维护弹窗回调
-    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 = ''
+    handleClickUpdate() {
+      // this.$message("更新成功");
+      // 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() {

+ 80 - 0
src/components/ledger/lib/editSysFloor.vue

@@ -0,0 +1,80 @@
+<template>
+  <el-dialog title="楼层贯通关系维护" :visible.sync="connectDialogVis" width="50%" id="messageDialog">
+    <el-row>
+      <div style="line-height:32px;">添加与{{floor.FloorLocalName}}层有贯通关系的楼层 : </div>
+      <div style="width:70%">
+        <bfCascader ref="bfCascader" :FloorID="floor.FloorID"></bfCascader>
+      </div>
+    </el-row>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="connectDialogVis=false">取消</el-button>
+      <el-button size="small" type="primary" @click="save">确认</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+import bfCascader from '@/components/ready/buildfloor/buildfloorCascader'
+import { createRelationInFloor } from "@/api/scan/request";
+export default {
+  data() {
+    return {
+      buildName: '',
+      connectDialogVis: false,
+      floor: {}
+    }
+  },
+  components: {
+    bfCascader
+  },
+  methods: {
+    showDialog() {
+      this.connectDialogVis = true
+      this.$nextTick(() => {
+        this.$refs.bfCascader.getCascader()
+        let arr = this.floor.FloorThroughList || [];
+        let value = []
+        if (arr.length) {
+          arr.map(t => {
+            value.push([t.BuildID, t.FloorID])
+          })
+        }
+        this.$refs.bfCascader.value = value
+      })
+    },
+    save() {
+      let arr = this.$refs.bfCascader.value;
+      let param = {
+        FloorId: this.floor.FloorID,
+        FloorOtherIdList: []
+      }
+      arr.map(t => {
+        param.FloorOtherIdList.push(t[1])
+      })
+      // createRelationInFloor(param, res => {
+        this.connectDialogVis = false;
+        this.$message.success('关联成功');
+        this.$emit('handleClickUpdate')
+      // })
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+#messageDialog {
+  .el-row{
+    height: 50px;
+    max-height: 200px;
+    overflow-y: auto;
+    overflow-x: hidden;
+  }
+  .el-row > div {
+    float: left;
+  }
+  .el-row > div + div {
+    margin-left: 10px;
+  }
+  /deep/ .el-input__inner {
+    vertical-align: baseline;
+  }
+}
+</style>

+ 64 - 0
src/components/ledger/lib/spaceSelect.vue

@@ -0,0 +1,64 @@
+<template>
+  <div id="spaceSelect">
+    <span class="buildFloor" style="padding-right:12px">业务空间</span>
+    <el-select v-model="value" placeholder="请选择" :props="props" filterable :style="isWidth ? '' : 'width:160px;'" size="small" @change="changeVal">
+      <el-option v-for="item in options" :key="item.Code" :label="item.Name" :value="item.Code"></el-option>
+    </el-select>
+  </div>
+</template>
+
+<script>
+import { queryDictionaryHead } from '@/api/scan/request';
+export default {
+  props: {
+    isWidth: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      value:null,
+      spaceVal: null,//值
+      options: [],
+      props: {
+        isWidth:false
+      }
+    }
+  },
+  methods: {
+    //获取下拉框数据
+    getOptionData() {
+      let pa = {
+        Filters: `parentId = 'Space'`
+      }
+      queryDictionaryHead(pa, res => {
+        this.options = res.Content.map(t => {
+          if (t.Name == "元空间") {
+            return undefined;
+          }
+          return t;
+        }).filter(item => item);
+      })
+    },
+    //改变空间
+    changeVal(value) {
+      this.$emit('change', value)
+    }
+  },
+  created() {
+    this.getOptionData();
+  }
+}
+</script>
+
+<style lang="less" scoped>
+#spaceSelect {
+  float: left;
+  margin-left: 10px;
+  .buildFloor {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 179 - 0
src/components/ledger/system/dialog/addCenoteDialog.vue

@@ -0,0 +1,179 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <el-row class="filters" :gutter="20">
+      <el-col :span="8">
+        <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="9">
+        <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.tableData = []
+      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>

+ 198 - 0
src/components/ledger/system/dialog/addEquipDialog.vue

@@ -0,0 +1,198 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <el-row class="filters">
+      <el-col :span="7.5" style="width:276px">
+        <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="8.5" style="padding:0 0;">
+        <floor-cascader @change="changeFloor"></floor-cascader>
+      </el-col>
+      <el-col :span="8.5" style="padding-right:0;">
+        <myCascader @change="changeDevice" :params="params"></myCascader>
+      </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="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 myCascader from "@/components/ledger/system/lib/equipType";
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    floorCascader,
+    myCascader
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      title: "添加系统内设备",
+      keycode: '', //输入查询条件
+      Buildfloor: ['all'], // 选中的建筑楼层
+      Equipcategory: null,// 选中的设备类型
+      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()
+    },
+    //修改设备类别
+    changeDevice(value) {
+      this.Equipcategory = value.code
+      this.getTableData()
+    },
+    // 显示弹窗
+    showDialog() {
+      this.dialogVisible = true
+      this.page.pageNumber = 1
+      this.tableData = []
+      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}'`
+      }
+      if (this.Equipcategory) {
+        params.data.Filters += `;category='${this.Equipcategory}'`
+      }
+      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;
+  }
+  .table-box {
+    height: 370px;
+    .fr {
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 179 - 0
src/components/ledger/system/dialog/addSpaceDialog.vue

@@ -0,0 +1,179 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
+    <el-row class="filters" :gutter="20">
+      <el-col :span="8">
+        <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="8.5" style="padding:0 0;">
+        <floor-cascader @change="changeFloor"></floor-cascader>
+      </el-col>
+       <el-col :span="8.5" style="padding:0 0;">
+         <space-select @change="changeSpace"></space-select>
+      </el-col>
+    </el-row>
+    <el-row class="filters" :gutter="20">
+      
+     
+    </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.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="" :label="`所属建筑楼层`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop="" :label="`空间类型`" 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 dictionaryCas from '@/components/config_point/dictionaryCascader'
+import spaceSelect from '@/components/ledger/lib/spaceSelect'
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    floorCascader,
+    dictionaryCas,
+    spaceSelect
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      title: "添加系统所在业务空间",
+      keycode: '', //输入查询条件
+      inSpaceType: '业务空间',
+      dialogVisible: false,
+      Buildfloor: ['all'], // 选中的建筑楼层
+      Spacecategory: null,// 选中的业务空间类型
+      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.tableData = []
+      this.getTableData()
+    },
+    //修改建筑楼层
+    changeFloor(value) {
+      this.Buildfloor = value
+      this.getTableData()
+    },
+    //修改空间类型
+    changeSpace(value) {
+      this.Spacecategory = value.code
+      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; 
+  }
+  .table-box {
+    height: 370px;
+    .fr{
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 140 - 0
src/components/ledger/system/lib/equipType.vue

@@ -0,0 +1,140 @@
+<template>
+  <div id="cascaderMap">
+    <span class="buildFloor" style="margin-right: 12px;">设备类别</span>
+    <el-select v-model="value" placeholder="请选择" :props="props" filterable :style="isWidth ? '' : 'width:160px;'" size="small" @change="changeVal">
+      <el-option v-for="item in options" :key="item.code" :label="item.facility" :value="item.code"></el-option>
+    </el-select>
+  </div>
+</template>
+<script>
+import { mapGetters } from 'vuex';
+import { queryPhysicsAllType, queryEquip } from "@/api/scan/request";
+export default {
+  name: "getCode",
+  props: {
+    isWidth: {
+      type: Boolean,
+      default: true
+    },
+    all: {
+      type: Boolean,
+      default: false,
+    },
+    //系统
+    params: Object
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      value: "",
+      options: [],
+      props: {
+        value: "code",
+        label: "facility"
+      },
+      falg: true,
+      content: []
+    };
+  },
+  created() {
+    this.getData();
+  },
+  watch: {
+    projectId() {
+      this.value = '';
+      this.getData();
+    }
+  },
+  methods: {
+    setValue(val) {
+      this.value = val
+    },
+    //修改val
+    changeVal(val) {
+      let value = {}
+      this.options.map(item => {
+        if (item.code == val) {
+          value = item
+        }
+      })
+      this.value = val
+      this.$emit("change", value)
+    },
+    //获取当前项目下的设备类型(只拿到编码-需要过滤)
+    getData() {
+      let param2 = {
+        Distinct: true,
+        PageNumber: 1,
+        PageSize: 500,
+        Projection: [
+          "Category"
+        ]
+      }
+      let param1 = 'Equipment'
+      let promise2 = new Promise((resolve, reject) => {
+        queryEquip(param2, res => {
+          resolve(res)
+        })
+      })
+      let promise1 = new Promise((resolve, reject) => {
+        queryPhysicsAllType(param1, res => {    
+          let tempArr = res.Content.filter(t => {
+            return t.ParentId == `${this.params.SysType}`
+          })
+          console.log(tempArr)
+          resolve(tempArr)
+        })
+      })
+      Promise.all([promise1, promise2]).then((res) => {
+        let allData = res[0], data = res[1]
+        console.log(allData)
+        this.options = this.formatOptions(allData)
+        console.log(this.options)
+        if (this.value) {
+          this.changeVal(this.value)
+        }
+        if (!this.all) {
+          this.content = data.Content.map(t => {
+            return t.Category
+          });
+          this.filterForOptions();
+          if (this.value) {
+            this.changeVal(this.value)
+          }
+        }
+      })
+    },
+    //格式化options数据
+    formatOptions(arr) {
+      let data = [];
+      arr.map(t => {
+        let temp = {};
+        temp.code = t.Code;
+        temp.facility = t.Name;
+        data.push(temp)
+      })
+      return data;
+    },
+    //过滤
+    filterForOptions() {
+      this.options = this.options.filter(item => {
+        if (this.content.indexOf(item.code) > -1) {
+          return item
+        }
+      })
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#cascaderMap {
+  float: left;
+  margin-left: 10px;
+  .buildFloor {
+    color: #999999;
+    font-size: 14px;
+  }
+}
+</style>

+ 156 - 0
src/components/ledger/system/table/cenoteTable.vue

@@ -0,0 +1,156 @@
+<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 { queryLinkSys, queryShaftType, shthroughshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addCenoteDialog from "@/components/ledger/system/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: `SysID='${this.params.SysID}'`,
+        Cascade: [
+          {
+            Name: 'shaftList',
+
+          }
+        ]
+      }
+      queryLinkSys(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/system/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 { queryLinkSys, eqinshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addEquipDialog from "@/components/ledger/system/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: `SysID='${this.params.SysID}'`,
+        Cascade: [
+          {
+            Name: 'equipmentList',
+            Cascade: [{ Name: 'equipCategory' }]
+          }
+        ]
+      }
+      queryLinkSys(params, res => {
+        this.tableData = res.Content[0].Equipment || []
+      })
+    },
+    // 删除关系
+    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>

+ 144 - 0
src/components/ledger/system/table/spaceTable.vue

@@ -0,0 +1,144 @@
+<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>
+    <!-- 添加空间弹窗 -->
+    <addSpaceDialog ref="addSpaceDialog" @refresh="getTableData" :type="type" :params="params"></addSpaceDialog>
+  </div>
+</template>
+
+<script>
+import { queryLinkSys, syinshUnlink } from "@/api/scan/request";
+import { mapGetters } from "vuex";
+import addSpaceDialog from "@/components/ledger/system/dialog/addSpaceDialog"
+export default {
+  components: {
+    addSpaceDialog
+  },
+  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: `SysID='${this.params.SysID}'`,
+        Cascade: [
+          {
+            Name: 'zoneSpaceBaseTableList'
+          }
+        ]
+      }
+      queryLinkSys(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.addSpaceDialog.showDialog()
+    }
+  },
+  watch: {
+    type() {
+      // this.getTableData()
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#eqInSp {
+  height: 100%;
+  .table-box {
+    margin-top: 10px;
+    height: calc(100% - 50px);
+  }
+}
+</style>

+ 1 - 1
src/components/point/dynamicdata/applyRulesDialog.vue

@@ -38,7 +38,7 @@
       </el-table-column>
       <el-table-column label="设备实例本地名(本地编码)" class-name="bgf5" align="center">
         <template slot-scope="scope">
-          {{scope.row.ObjectLocalName}}({{scope.row.ObjectID}})
+          {{scope.row.ObjectLocalName}}({{scope.row.ObjectLocalCode}})
         </template>
       </el-table-column>
       <el-table-column label="信息点" prop="InfomationPoint" align="center"></el-table-column>

+ 66 - 0
src/components/point/dynamicdata/autoGroupRelaDialog.vue

@@ -0,0 +1,66 @@
+<template>
+  <el-dialog title="提示" :visible.sync="autoDialog" width="30%" @close="autoRelateClose">
+    <div id="autoRelate">
+      <p>请选择使用哪个信息点对应原始点位的设备标识:</p>
+      <p>
+        <el-radio v-model="autoType" label="objectLocalName">{{TypeName}}实本地名称</el-radio>
+      </p>
+      <p>
+        <el-radio v-model="autoType" label="objectLocalCode">{{TypeName}}本地编码</el-radio>
+      </p>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="autoRelateClose">取消</el-button>
+      <el-button size="small" type="primary" @click="confirm">确认</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+import {
+  dynamicAutoRelate
+} from "@/api/scan/request"
+export default {
+  data() {
+    return {
+      autoDialog: false,
+      autoType: "objectLocalName",
+      TypeName: '',
+      TypeCode: ''
+    }
+  },
+  methods: {
+    showDialog(TypeName, TypeCode) {
+      this.TypeName = TypeName;
+      this.TypeCode = TypeCode;
+      this.autoDialog = true;
+    },
+    autoRelateClose() {
+      this.autoDialog = false;
+    },
+    confirm() {
+      let pa = {
+        MatchKey: this.autoType,
+        TypeName: this.TypeName
+      }
+      this.autoDialog = false;
+      this.$message('正在执行');
+      this.$emit('autoRelateSuc', this.TypeCode);
+      dynamicAutoRelate(pa, res => {
+        this.$message.success('匹配成功');
+      })
+    }
+  },
+}
+</script>
+<style lang="scss" scoped>
+#autoRelate {
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #000;
+  }
+  p {
+    font-size: 12px;
+    margin-bottom: 8px;
+    padding-left: 24px;
+  }
+}
+</style>

+ 4 - 4
src/components/point/dynamicdata/delRelationDialog.vue

@@ -91,24 +91,24 @@ export default {
       allHeaderData: {
         equip: [
           { label: '对象实例名称', prop: "ObjectLocalName" },
-          { label: '对象实例编码', prop: "ObjectID" },
+          { label: '对象本地编码', prop: "ObjectLocalCode" },
           { label: '所在建筑楼层', prop: "BuildLocalName" },
           { label: '所在业务空间', prop: "RoomLocalName" },
         ],
         parts: [
           { label: '对象实例名称', prop: "ObjectLocalName" },
-          { label: '对象实例编码', prop: "ObjectID" },
+          { label: '对象本地编码', prop: "ObjectLocalCode" },
           { label: '所在建筑楼层', prop: "BuildLocalName" },
           { label: '所在业务空间', prop: "RoomLocalName" },
           { label: '所属设备实例', prop: "CascadeEquipLocalName" },
         ],
         system: [
           { label: '对象实例名称', prop: "ObjectLocalName" },
-          { label: '对象实例编码', prop: "ObjectID" },
+          { label: '对象本地编码', prop: "ObjectLocalCode" },
         ],
         space: [
           { label: '对象实例名称', prop: "ObjectLocalName" },
-          { label: '对象实例编码', prop: "ObjectID" },
+          { label: '对象本地编码', prop: "ObjectLocalCode" },
           { label: '所在建筑楼层', prop: "BuildLocalName" },
         ]
       },

+ 21 - 8
src/components/point/dynamicdata/equipRules.vue

@@ -4,7 +4,7 @@
     <!-- 查询条件 -->
     <div class="query-area">
       <el-row>
-        <el-col :span="23">
+        <el-col :span="22">
           <el-form ref="form" :model="form" :inline="true">
             <el-row>
               <div class="query-item special">
@@ -26,9 +26,14 @@
             </el-row>
           </el-form>
         </el-col>
-        <el-col :span="1">
+        <el-col :span="2">
           <el-tooltip class="item" effect="dark" :content="`填充${typeName}标识与实例对应规则`" placement="left">
-            <el-button size="small" type="primary" @click="toAddRelation" icon="el-icon-edit-outline" style="float:right;" :disabled="isPending"></el-button>
+            <el-button size="small" type="primary" @click="toAddRelation" icon="el-icon-edit-outline" style="float:right;" :disabled="isPending">
+            </el-button>
+          </el-tooltip>
+          <el-tooltip class="item" effect="dark" :content="`根据${typeName}标识自动填充实例`" placement="left">
+            <el-button size="small" type="primary" @click="autoGroupRela" :icon="autoLoading?'iconfont icon-jiazai':'iconfont icon-zidong'"
+              style="float:right;padding:7px 14px;margin-right:10px;" :disabled="autoLoading"></el-button>
           </el-tooltip>
         </el-col>
       </el-row>
@@ -50,12 +55,15 @@
         </el-table-column>
         <el-table-column prop="Datasource" label="数据源" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop="SubTypeName" :label="`数字字典${typeName}类型`" show-overflow-tooltip min-width="100"></el-table-column>
-        <el-table-column prop="ObjectLocalName" :label="`对应的${typeName}实例`" show-overflow-tooltip min-width="100" class-name="td-bl"></el-table-column>
+        <el-table-column prop="ObjectLocalName" :label="`对应的${typeName}实例`" show-overflow-tooltip min-width="100" class-name="td-bl">
+        </el-table-column>
         <el-table-column label="实例所在建筑楼层" min-width="100">
           <template slot-scope="scope">
-            <el-tooltip :content="scope.row.BuildLocalName?scope.row.FloorLocalName?scope.row.BuildLocalName+'-'+scope.row.FloorLocalName:scope.row.BuildLocalName:''"
+            <el-tooltip
+              :content="scope.row.BuildLocalName?scope.row.FloorLocalName?scope.row.BuildLocalName+'-'+scope.row.FloorLocalName:scope.row.BuildLocalName:''"
               placement="top">
-              <div class="tool-tip">{{scope.row.BuildLocalName?scope.row.FloorLocalName?scope.row.BuildLocalName+'-'+scope.row.FloorLocalName:scope.row.BuildLocalName:''}}
+              <div class="tool-tip">
+                {{scope.row.BuildLocalName?scope.row.FloorLocalName?scope.row.BuildLocalName+'-'+scope.row.FloorLocalName:scope.row.BuildLocalName:''}}
               </div>
             </el-tooltip>
           </template>
@@ -64,8 +72,8 @@
         <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 :disabled="isPending||scope.row.Related=='False'"
-                icon="el-icon-delete"></el-button>
+              <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain
+                :disabled="isPending||scope.row.Related=='False'" icon="el-icon-delete"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>
@@ -123,6 +131,7 @@ export default {
         Datasource: [] //数据源
       }, //查询条件
       loading: false, //列表loading
+      autoLoading: false, //自动对应实例
     };
   },
   components: {
@@ -221,6 +230,10 @@ export default {
     queryTableData() {
       this.page.pageNumber = 1;
       this.getTableData();
+    },
+    //自动对应实例
+    autoGroupRela() {
+      this.$emit('autoGroupRela','equip');
     }
   },
   watch: {

+ 4 - 4
src/components/point/dynamicdata/historyDialog.vue

@@ -67,24 +67,24 @@ export default {
       tableHeader: {
         equip: [
           { label: '对象实例名称', prop: 'ObjectLocalName' },
-          { label: '对象实例编码', prop: 'ObjectID' },
+          { label: '对象本地编码', prop: 'ObjectLocalCode' },
           { label: '所在建筑楼层', prop: 'BuildLocalName' },
           { label: '所在业务空间', prop: 'RoomLocalName' },
         ],
         parts: [
           { label: '对象实例名称', prop: 'ObjectLocalName' },
-          { label: '对象实例编码', prop: 'ObjectID' },
+          { label: '对象本地编码', prop: 'ObjectLocalCode' },
           { label: '对象所属设备', prop: 'CascadeEquipLocalName' },
           { label: '所在建筑楼层', prop: 'BuildLocalName' },
           { label: '所在业务空间', prop: 'RoomLocalName' },
         ],
         system: [
           { label: '对象实例名称', prop: 'ObjectLocalName' },
-          { label: '对象实例编码', prop: 'ObjectID' }
+          { label: '对象本地编码', prop: 'ObjectLocalCode' }
         ],
         space:[
           { label: '对象实例名称', prop: "ObjectLocalName" },
-          { label: '对象实例编码', prop: "ObjectID" },
+          { label: '对象本地编码', prop: "ObjectLocalCode" },
           { label: '所在建筑楼层', prop: "BuildLocalName" },
         ]
       }, //所有类型列表头部

+ 11 - 2
src/components/point/dynamicdata/partsRules.vue

@@ -4,7 +4,7 @@
     <!-- 查询条件 -->
     <div class="query-area">
       <el-row>
-        <el-col :span="23">
+        <el-col :span="22">
           <el-form ref="form" :model="form" :inline="true">
             <el-row>
               <div class="query-item special">
@@ -26,10 +26,14 @@
             </el-row>
           </el-form>
         </el-col>
-        <el-col :span="1">
+        <el-col :span="2">
           <el-tooltip class="item" effect="dark" :content="`填充${typeName}标识与实例对应规则`" placement="left">
             <el-button size="small" type="primary" @click="toAddRelation" icon="el-icon-edit-outline" style="float:right;" :disabled="isPending"></el-button>
           </el-tooltip>
+          <el-tooltip class="item" effect="dark" :content="`根据${typeName}标识自动填充实例`" placement="left">
+            <el-button size="small" type="primary" @click="autoGroupRela" :icon="autoLoading?'iconfont icon-jiazai':'iconfont icon-zidong'"
+              style="float:right;padding:7px 14px;margin-right:10px;" :disabled="autoLoading"></el-button>
+          </el-tooltip>
         </el-col>
       </el-row>
     </div>
@@ -124,6 +128,7 @@ export default {
         Datasource: [] //数据源
       }, //查询条件
       loading: false, //列表loading
+      autoLoading: false, //自动对应实例
     };
   },
   components: {
@@ -222,6 +227,10 @@ export default {
     queryTableData() {
       this.page.pageNumber = 1;
       this.getTableData();
+    },
+    //自动对应实例
+    autoGroupRela() {
+      this.$emit('autoGroupRela','parts');
     }
   },
   watch: {

+ 11 - 2
src/components/point/dynamicdata/spaceRules.vue

@@ -4,7 +4,7 @@
     <!-- 查询条件 -->
     <div class="query-area">
       <el-row>
-        <el-col :span="23">
+        <el-col :span="22">
           <el-form ref="form" :model="form" :inline="true">
             <el-row>
               <div class="query-item special">
@@ -26,10 +26,14 @@
             </el-row>
           </el-form>
         </el-col>
-        <el-col :span="1">
+        <el-col :span="2">
           <el-tooltip class="item" effect="dark" :content="`填充${typeName}标识与实例对应规则`" placement="left">
             <el-button size="small" type="primary" @click="toAddRelation" icon="el-icon-edit-outline" style="float:right;" :disabled="isPending"></el-button>
           </el-tooltip>
+          <el-tooltip class="item" effect="dark" :content="`根据${typeName}标识自动填充实例`" placement="left">
+            <el-button size="small" type="primary" @click="autoGroupRela" :icon="autoLoading?'iconfont icon-jiazai':'iconfont icon-zidong'"
+              style="float:right;padding:7px 14px;margin-right:10px;" :disabled="autoLoading"></el-button>
+          </el-tooltip>
         </el-col>
       </el-row>
     </div>
@@ -124,6 +128,7 @@ export default {
         Datasource: [] //数据源
       }, //查询条件
       loading: false, //列表loading
+      autoLoading: false, //自动对应实例
     };
   },
   components: {
@@ -222,6 +227,10 @@ export default {
     queryTableData() {
       this.page.pageNumber = 1;
       this.getTableData();
+    },
+    //自动对应实例
+    autoGroupRela() {
+      this.$emit('autoGroupRela','space');
     }
   },
   watch: {

+ 11 - 2
src/components/point/dynamicdata/systemRules.vue

@@ -4,7 +4,7 @@
     <!-- 查询条件 -->
     <div class="query-area">
       <el-row>
-        <el-col :span="23">
+        <el-col :span="22">
           <el-form ref="form" :model="form" :inline="true">
             <el-row>
               <div class="query-item special">
@@ -26,10 +26,14 @@
             </el-row>
           </el-form>
         </el-col>
-        <el-col :span="1">
+        <el-col :span="2">
           <el-tooltip class="item" effect="dark" :content="`填充${typeName}标识与实例对应规则`" placement="left">
             <el-button size="small" type="primary" @click="toAddRelation" icon="el-icon-edit-outline" style="float:right;" :disabled="isPending"></el-button>
           </el-tooltip>
+          <el-tooltip class="item" effect="dark" :content="`根据${typeName}标识自动填充实例`" placement="left">
+            <el-button size="small" type="primary" @click="autoGroupRela" :icon="autoLoading?'iconfont icon-jiazai':'iconfont icon-zidong'"
+              style="float:right;padding:7px 14px;margin-right:10px;" :disabled="autoLoading"></el-button>
+          </el-tooltip>
         </el-col>
       </el-row>
     </div>
@@ -124,6 +128,7 @@ export default {
         Datasource: [] //数据源
       }, //查询条件
       loading: false, //列表loading
+      autoLoading: false, //自动对应实例
     };
   },
   components: {
@@ -222,6 +227,10 @@ export default {
     queryTableData() {
       this.page.pageNumber = 1;
       this.getTableData();
+    },
+    //自动对应实例
+    autoGroupRela() {
+      this.$emit('autoGroupRela','system');
     }
   },
   watch: {

+ 275 - 25
src/framework/components/messagesever/index.vue

@@ -2,13 +2,44 @@
  * @Author: zhangyu
  * @Date: 2019-08-26 15:22:13
  * @Info: 
- * @LastEditTime: 2019-09-26 20:16:41
+ * @LastEditTime: 2019-10-31 14:38:27
  -->
 <template>
-  <div class="notification-box" @click="handleClickRead">
+  <div class="notification-box" v-clickOutside="handleClose" @click="handleClickRead">
     <el-badge :value="unreadNum" :hidden="!unreadNum" :max="99">
       <i class="el-icon-message-solid"></i>
     </el-badge>
+    <transition name="el-fade-in-linear">
+      <div v-show="noticeListShow" @click.stop="" class="noticeBox">
+        <ul class="noticeTab">
+          <li class="noticeTab_item">消息通知<!-- <span class="unread_num">1</span> --></li>
+        </ul>
+        <div class="noticeList_scroll">
+          <el-scrollbar style="height:100%;">
+            <ul class="noticeList">
+              <li class="noticeList_item" v-for="item in messageList" :key="item.Id" :title="item.Content.Message?item.Content.Message:''">
+                <div class="noticeItem_box">
+                  <div class="noticeItem_text">
+                    <i :class="iconClassMap[item.Type]?iconClassMap[item.Type]:'msg-icon el-icon-info info-color'"></i>
+                    <p><span>{{`【${moduleMap[item.Module]?moduleMap[item.Module]:item.Module}】 `}}</span>{{item.Title?item.Title:""}}</p>
+                  </div>
+                  <div class="noticeItem_time">{{item.CreateTime}}
+                    <el-link v-for="(btn, index) in item.Content.ButtonList?item.Content.ButtonList:[]" style="float:right;font-size:12px;margin-left:5px;" type="primary"
+                    :key="index"
+                    :href="`/image-service/common/file_get?systemId=revit&key=${btn.Url}`"
+                    :download="btn.FileName?btn.FileName:''">{{btn.Name?btn.Name:""}}</el-link>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </el-scrollbar>
+        </div>
+        <div class="notice_operate">
+          <!-- <div class="readAll">全部标为已读</div> -->
+          <div class="seeAll">查看全部<i class="iconfont icon-right"></i></div>
+        </div>
+      </div>
+    </transition>
     <!-- <el-button type="primary" @click="handleClickConnectMQ">连接MQ</el-button>
     <el-button type="primary" @click="handleClickDisconnectMQ">断开MQ</el-button>
     <el-button type="primary" @click="handleClickUnsubscribe">停止接收消息</el-button><br><br>
@@ -30,39 +61,79 @@
 import { mapGetters } from 'vuex'
 import Stomp from 'stompjs'
 import Msmq from './msmq'
+import Bus from '@/utils/bus.js'
 import { MQTT_SERVICE, MQTT_USERNAME, MQTT_PASSWORD } from './mqSetting'
+import { messgeCount, messgeQuery, messgeUpdateState } from '@/api/msgsever'
 
 export default {
   data() {
     return {
       client: Stomp.client(MQTT_SERVICE),
       unreadNum: 0,
+      noticeListShow: false,//是否显示消息列表
       sendMessage: '',
       messageList: [], // 历史消息
       subList: [], // 订阅的消息实例
-      topics: ["/topic/model.manage"] // 订阅的消息名称
+      topics: ["/topic/message.manage"], // 订阅的消息名称
+      messageList: [],
+      moduleMap: {//消息模块映射
+        "Model": "模型文件管理"
+      },
+      iconClassMap: { //消息类型图标映射
+        "Success": "msg-icon el-icon-success success-color",
+        "Error": "msg-icon el-icon-error error-color",
+        "Warning": "msg-icon el-icon-warning warning-color",
+        "Info": "msg-icon el-icon-info info-color",
+      }
     }
   },
   created () {
     this.connect()
-    // let url = "ws://192.168.20.225:61614/stomp";
-    // let login = "admin";
-    // let passcode = "admin";
-    // let destination = "/topic/datacenter.broadcast";
-    // let client = Stomp.client(url)
-    // console.log('钩子:',client)
-    // var onconnect = function(frame) {
-    //   client.subscribe(destination, function(message) {
-    //     console.log(message.body);
-    //     alert(message.body);        
-    //   });
-    // };
-    // client.connect(login, passcode, onconnect)
+  },
+  mounted() {
+    this.getUnreadCount()
+    this.getMessageList()//获取消息列表
+    Bus.$on('messageListUpdate', message => {
+      this.getMessageList()
+    })
   },
   computed: {
-    ...mapGetters('layout', ['userInfo', 'projectId', 'projects'])
+    ...mapGetters('layout', ['userInfo', 'projectId', 'projects', 'userId'])
   },
   methods:{
+    getMessageList(){//获取消息列表(最新10条)
+      let params = {
+        Filters: `UserId='${this.userId}'`,
+        Orders: "CreateTime desc, Id asc",
+        PageNumber: 1,
+        PageSize: 10
+      }
+      messgeQuery(params, res => {
+        this.messageList = res.Content
+      })
+    },
+    getUnreadCount(){//获取未读消息的数量
+      let params = {
+        Filters: `Read=false;UserId='${this.userId}'`
+      }
+      messgeCount(params, res => {
+        this.unreadNum = res.Count
+      })
+    },
+    setAllRead(){//将当前角色消息全部置为已读
+      if(this.userId){
+        messgeUpdateState({Read:true,UserId:this.userId}, res => {this.unreadNum = 0})
+      }
+    },
+    handleClose(e){//关闭消息列表
+      this.noticeListShow = false
+    },
+    handleClickRead() {//点击消息铃铛
+      this.noticeListShow?this.noticeListShow=false:this.noticeListShow=true
+      if(this.noticeListShow){
+        this.setAllRead()//将当前角色消息全部置为已读
+      }
+    },
     connect() {
       this.client = Stomp.client(MQTT_SERVICE)
       this.client.reconnect_delay = 5000
@@ -85,7 +156,7 @@ export default {
     },
     //接收到消息的回调
     onmessage(message) {
-      this.unreadNum = Msmq.handleMsg(message, this.projects, this.unreadNum);
+      this.unreadNum = Msmq.handleMsg(message, this.projects, this.userId, this.unreadNum);
     },
     // 接收消息失败回调
     onFailed(frame) {
@@ -108,20 +179,17 @@ export default {
       this.client.send(destination, headers, JSON.stringify(message))
     },
     
-    handleClickConnectMQ() {
+    handleClickConnectMQ() {//连接MQ
       this.connect()
     },
-    handleClickDisconnectMQ() {
+    handleClickDisconnectMQ() {//断开MQ
       this.disconnect()
     },
-    handleClickUnsubscribe() {
+    handleClickUnsubscribe() {//停止接收消息
       this.unsubscribe()
     },
-    handleClickSendMessage() {
+    handleClickSendMessage() {//发送消息
       this.send('/topic/datacenter.broadcast',this.sendMessage)
-    }, 
-    handleClickRead() {
-      this.unreadNum = 0;
     }
   }
 }
@@ -131,10 +199,180 @@ export default {
   .notification-box{
     width: 100%;
     height: 100%;
+    position: relative;
     padding: 16px 10px 10px;
     box-sizing: border-box;
     color: #79869a;
     cursor: pointer;
+    .noticeBox{
+      position: absolute;
+      top: 50px;
+      left: 50%;
+      margin-left: -220px;
+      cursor: auto;
+      z-index: 1000;
+      text-align: left;
+      width: 272px;
+      height: 362px;
+      box-shadow: 0 1px 6px 0 #ccc;
+      color: #333;
+      background: #fff;
+      overflow: visible!important;
+    }
+    .noticeBox::before {
+      content: '';
+      border: solid 7px transparent;
+      border-bottom-color: #fff;
+      display: block;
+      position: absolute;
+      width: 2px;
+      top: -14px;
+      left: 50%;
+      margin-left: 77px;
+      z-index: 0;
+    }
+    .noticeTab {
+      padding: 8px 16px 0;
+      z-index: 10;
+      height: 32px;
+      zoom: 1;
+      box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
+      .noticeTab_item {
+        float: left;
+        position: relative;
+        width: 240px;
+        height: 32px;
+        line-height: 32px;
+        padding: 0;
+        margin-right: 0;
+        font-weight: 700;
+        text-align: left;
+        cursor: pointer;
+        -webkit-transition: all 0.2s ease-in-out;
+        -o-transition: all 0.2s ease-in-out;
+        transition: all 0.2s ease-in-out;
+        .unread_num {
+          display: inline-block;
+          color: #fff;
+          background-color: #5182E4;
+          height: 14px;
+          padding: 0 2px;
+          line-height: 14px;
+          text-align: center;
+          border-radius: 2px;
+          font-size: 12px;
+          padding: 0 3px;
+          font-family: Arial;
+          -webkit-transform: scale(0.85);
+          -ms-transform: scale(0.85);
+          -o-transform: scale(0.85);
+          transform: scale(0.85);
+        }
+      }
+      .active {
+        box-shadow: 0 -2px 0 0 #5182E4 inset;
+      }
+    }
+    .noticeList_scroll {
+      height: 282px;
+      /deep/ .el-scrollbar__wrap {
+        overflow-x: hidden;
+      }
+      .noticeList_item {
+        width: 100%;
+        height: auto;
+        position: relative;
+        cursor: pointer;
+        box-sizing: border-box;
+        padding: 12px 16px;
+        -webkit-transition: all 0.2s ease-in-out;
+        -o-transition: all 0.2s ease-in-out;
+        transition: all 0.2s ease-in-out;
+        zoom: 1;
+        .noticeItem_box {
+          float: left;
+          position: relative;
+          width: 100%;
+          .noticeItem_text {
+            color: rgba(10, 18, 32, 0.87);
+            font-weight: 700;
+            padding-left: 18px;
+            text-indent: -6px;
+            position: relative;
+            font-size: 12px;
+            line-height: 17px;
+            -webkit-transition: all 0.2s ease-in-out;
+            -o-transition: all 0.2s ease-in-out;
+            transition: all 0.2s ease-in-out;
+            .msg-icon{
+              position: absolute;
+              top: 2.5px;
+              left: 6px;
+            }
+            p {
+              word-break: break-all;
+            }
+          }
+          .noticeItem_time {
+            font-size: 12px;
+            height: 19px;
+            line-height: 19px;
+            color: rgba(10, 18, 32, 0.46);
+            margin-top: 4px;
+            padding-left: 18px;
+          }
+        }
+      }
+      .noticeList_item:hover {
+        background-color: #F5F7F7;
+      }
+      .noticeList_item:after {
+        content: "";
+        display: block;
+        height: 0;
+        clear:both;
+        visibility: hidden;
+      }
+      .noticeList_item:before {
+        position: absolute;
+        right: 0;
+        bottom: 0;
+        left: 0;
+        height: 1px;
+        padding: 0 16px;
+        background-color: #ebebeb;
+        content: "";
+        background-clip: content-box;
+      }
+    }
+    .notice_operate {
+      height: 40px;
+      line-height: 20px;
+      padding: 10px 16px;
+      box-sizing: border-box;
+      background-color: rgba(242, 243, 245, 0.48);
+      box-shadow: inset 0 1px 0 0 rgba(10, 18, 32, 0.06);
+      zoom: 1;
+      .readAll {
+        float: left;
+        cursor: pointer;
+        -webkit-transition: all 0.2s ease-in-out;
+        -o-transition: all 0.2s ease-in-out;
+        transition: all 0.2s ease-in-out;
+      }
+      .readAll:hover {
+        text-decoration: underline;
+      }
+      .seeAll {
+        float: right;
+        color: #5182e4;
+        cursor: pointer;
+        font-weight: 700;
+      }
+      .seeAll:hover {
+        text-decoration: underline;
+      }
+    }
     .el-icon-message-solid{
       font-size: 22px;
     }
@@ -148,4 +386,16 @@ export default {
     color: #d3d8e2;
     background-color: #3f4f62;
   }
+  .success-color{
+    color: #67C23A;
+  }
+  .error-color{
+    color: #F56C6C;
+  }
+  .warning-color{
+    color: #E6A23C;
+  }
+  .info-color{
+    color: #909399;
+  }
 </style>

+ 29 - 10
src/framework/components/messagesever/msmq.js

@@ -2,20 +2,39 @@ import { Notification } from 'element-ui';
 import Bus from '@/utils/bus.js'
 
 const MSMQ = {
-  handleMsg (message, projects, unreadNum ) {
+  msgTypeMap: {
+    "Success": "success",
+    "Error": "error",
+    "Warning": "warning",
+    "Info": "info",
+  },
+  moduleMap: {//消息模块映射
+    "Model": "模型文件管理"
+  },
+  handleMsg (message, projects, userId, unreadNum ) {
     let data
     try {
       data = JSON.parse(message.body)
-    } catch (err) {}
-    // if(projects.some((item) => {return item.id == data.projectId})) { //判断消息是否是当前用户拥有的项目
-      unreadNum++
-      if(message.headers.destination == '/topic/model.manage'){ //模型文件的消息触发模型文件列表刷新事件
-        Bus.$emit('modelStatusChange', data)
+    } catch (err) {
+      return false
+    }
+    if(data.ProjectId && projects.some((item) => {return item.id == data.ProjectId})) { //判断消息是否是当前用户拥有的项目
+      if(!data.UserList || (userId && data.UserList && data.UserList.includes(userId))){//判断消息接收人是否是当前用户
+        if(data.Module && data.Module == 'Model'){ //模型文件的消息触发模型文件列表刷新事件
+          Bus.$emit('modelStatusChange', data)
+        }
+        Notification({ 
+          title: `${data.Title?data.Title:''}`, 
+          dangerouslyUseHTMLString: true, 
+          message: `【${this.moduleMap[data.Module]?this.moduleMap[data.Module]:data.Module}】${data.Content?data.Content.Message?data.Content.Message:'':''}`,
+          type: this.msgTypeMap[data.Type]?this.msgTypeMap[data.Type]:'info'
+        })
+        // Notification.info({ title: '消息',dangerouslyUseHTMLString: true, message: `项目编号:${data.projectId}<br>消息类型:${data.type}<br>描述信息:${data.description}<br>` })
+        unreadNum++
+        Bus.$emit('messageListUpdate', data)//消息驱动消息列表刷新
+        return unreadNum
       }
-      // Notification.info({ title: '消息',dangerouslyUseHTMLString: true, message: `项目编号:${data.projectId}<br>消息类型:${data.type}<br>描述信息:${data.description}<br>` })
-      Notification.info({ title: '消息', dangerouslyUseHTMLString: true, message: `${JSON.stringify(data)}` })
-      return unreadNum
-    // }
+    }
   }
 }
 

+ 11 - 4
src/router/system.js

@@ -47,6 +47,7 @@ import buildGraphy from '@/views/data_admin/buildGraphy'
 /**  台账管理 */
 import systemLedger from '@/views/ledger/system'
 import systemadd from '@/views/ledger/system/addsystem'
+import systemDetail from '@/views/ledger/system/systemDetail'
 import facilityLedger from '@/views/ledger/facility'
 import partsLedger from '@/views/ledger/facility/parts'
 import partsmanageLedger from '@/views/ledger/facility/partsmanage'
@@ -105,8 +106,8 @@ export default [
         name: 'LayoutMain',
         component: LayoutMain,
         children: [
-            // { path: 'buildfloor', name: 'buildFloor', component: buildFloor, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理' }] } },
-            { path: 'buildfloor', name: 'buildFloor', component: Dasboard, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理' }] } },
+            { path: 'buildfloor', name: 'buildFloor', component: buildFloor, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理' }] } },
+            // { path: 'buildfloor', name: 'buildFloor', component: Dasboard, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理' }] } },
             { path: 'collectsetting', name: 'collectsetting', component: collectsetting, meta: { keepAlive: false, breadcrumbs: [{ label: '需采集的信息点' }] } },
             { path: 'appuser', name: 'buildUser', component: buildUser, meta: { keepAlive: false, breadcrumbs: [{ label: '扫楼App用户管理' }] } },
             { path: 'repetitionGraphy', name: 'repetitionGraphy', component: repetitionGraphy, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理', path: '/ready/buildfloor' }, { label:'平面图维护' }] }}
@@ -122,8 +123,8 @@ export default [
             {
                 path: 'file',
                 name: 'modelFile',
-                component: Dasboard,
-                // component: modelFile,
+                // component: Dasboard,
+                component: modelFile,
                 meta: { keepAlive: false, breadcrumbs: [{ label: '模型管理', path: '/model/file' }, { label: '模型文件管理' }] }
             },
             {
@@ -318,6 +319,12 @@ export default [
                 meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '系统台账' }] }
             },
             {
+                path: 'systemDetail',
+                name: 'systemDetail',
+                component: systemDetail,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '系统台账', path: '/ledger/facility' }, { label: '系统详情'}] }
+            },
+            {
                 path: 'systemadd',
                 name: 'systemadd',
                 component: systemadd,

+ 33 - 1
src/utils/handsontable/mainText.js

@@ -95,7 +95,39 @@ const text = {
         td.style.cursor = "pointer";
         td.innerHTML = "查看二维码"
         return td
-    }
+    },
+
+    //系统所属建筑楼层
+    sysInBuildFloor: (instance, td, row, col, prop, value, cellProperties) => {
+        td.style.color = "#409EFF";
+        td.style.cursor = "pointer";
+        if (value instanceof Array && value.length > 0) {
+            if (value.length == 1) {
+                td.innerHTML = !!value[0].infos ? (value[0].infos.SysLocalName || value[0].infos.SysName) : (value[0].SysLocalName || value[0].SysName)
+            } else {
+                let text = ""
+                for (let i = 0; i < value.length; i++) {
+                    if (!!value[i].SysLocalName || !!value[i].SysName) {
+                        if (i == value.length) {
+                            text += value[i].SysLocalName || value[i].SysName
+                        } else {
+                            text = value[i].SysLocalName || value[i].SysName + "、" + text
+                        }
+                    } else {
+                        if (i == value.length) {
+                            text += value[i].infos.SysLocalName || value[i].infos.SysName
+                        } else {
+                            text = value[i].infos.SysLocalName || value[i].infos.SysName + "、" + text
+                        }
+                    }
+                }
+                td.innerHTML = text.substring(0, 40) + "..."
+            }
+        } else {
+            td.innerHTML = "无所属建筑楼层"
+        }
+        return td;
+    },
 }
 
 export default text

+ 26 - 0
src/utils/scan/directive.js

@@ -62,4 +62,30 @@ Vue.directive('load', function(el, binding) {
         // }
         el.src = imgDom.src
     }
+})
+//点击空白处隐藏div指令
+Vue.directive('clickOutside', {
+    // 初始化指令
+    bind(el, binding, vnode) {
+        function documentHandler(e) {
+            // 这里判断点击的元素是否是本身,是本身,则返回
+            if (el.contains(e.target)) {
+                return false;
+            }
+            // 判断指令中是否绑定了函数
+            if (binding.expression) {
+                // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
+                binding.value(e);
+            }
+        }
+        // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
+        el.__vueClickOutside__ = documentHandler;
+        document.addEventListener('click', documentHandler);
+    },
+    update() {},
+    unbind(el, binding) {
+        // 解除事件监听
+        document.removeEventListener('click', el.__vueClickOutside__);
+        delete el.__vueClickOutside__;
+    },
 })

+ 53 - 9
src/views/business_space/dataUtil/index.vue

@@ -4,7 +4,7 @@
       <span style="padding-right:12px;color:#999999;">建筑楼层</span>
       <el-cascader :options="options" v-model="buildFloorSelectd" :props="props" @change="changeCascader"></el-cascader>
       <el-button @click="updateSpOutline">导入业务空间Outline</el-button>
-      <el-button @click="updateSiOutline">更新元空间Outline</el-button>
+      <el-button @click="updateSiOutline" v-show="0">更新元空间Outline,Height</el-button>
     </div>
   </div>
 </template>
@@ -52,17 +52,54 @@ export default {
           "Code": "LightingZone"
         },
         {
+          "Name": "网络分区",
+          "Rel_type": "3",
+          "Code": "NetworkZone"
+        },
+        {
+          "Code": "AirConditioningZone",
           "Name": "空调分区",
-          "Rel_type": "4",
-          "Code": "AirConditioningZone"
-        }, {
-          "Name": '租赁分区',
-          'Rel_type': '10',
-          "Code": 'TenantZone'
+          "Rel_type": "4"
+        },
+        {
+          "Name": "采暖分区",
+          "Rel_type": "5",
+          "Code": "HeatingZone"
+        },
+        {
+          "Name": "洁净分区",
+          "Rel_type": "6",
+          "Code": "CleanZone"
+        },
+        {
+          "Name": "生活给水分区",
+          "Rel_type": "7",
+          "Code": "DomesticWaterSupplyZone"
+        },
+        {
+          "Code": "FireZone",
+          "Name": "防火分区",
+          "Rel_type": "8"
+        },
+        {
+          "Name": "安防分区",
+          "Rel_type": "9",
+          "Code": "SecurityZone"
+        },
+        {
+          "Name": "租户分区",
+          "Rel_type": "10",
+          "Code": "TenantZone"
+        },
+        {
+          "Name": '功能分区',
+          'Rel_type': '11',
+          "Code": 'FunctionZone'
         }
       ],
       allSiListMap: {}, //Si id ->sourceid
       sourceIdToOutline: {}, //sourceid -> outline
+      sourceIdToHeight: {}, //sourceid -> height
       graphyId: '',
       allABC: [
         'Fl11010500011b85b9eeff8211e8b8b087ac5144d0ef20191010145313bim.jsonz',
@@ -372,6 +409,7 @@ export default {
           this.allSiListMap[t.RoomID] = arr[1];
         })
         console.log(this.allSiListMap)
+        this.updateSiOutline();
       })
     },
     // 获取业务空间与元空间的关系
@@ -452,18 +490,22 @@ export default {
       let pa = {
         data: {
           Content: [],
-          Projection: ['Outline']
+          Projection: ['Outline', 'Height']
         },
         zone: Code
       }
       relList.map(t => {
         let obj = {
           RoomID: t.id,
+          Height: 0,
           Outline: []
         }
         t.children.map(item => {
           if (this.sourceIdToOutline[this.allSiListMap[item]]) {
             obj.Outline.push(this.sourceIdToOutline[this.allSiListMap[item]]);
+            if (this.sourceIdToHeight[this.allSiListMap[item]] && (obj.Height == 0 || this.sourceIdToHeight[this.allSiListMap[item]] < obj.Height)) {
+              obj.Height = this.sourceIdToHeight[this.allSiListMap[item]] / 1000;
+            }
           }
         })
         pa.data.Content.push(obj);
@@ -525,6 +567,7 @@ export default {
           if (data.Spaces && data.Spaces.length) {
             data.Spaces.map(t => {
               _this.sourceIdToOutline[t.SourceId] = t.OutLine;
+              _this.sourceIdToHeight[t.SourceId] = t.Height;
             })
             // }
             // if (data.SpaceList && data.SpaceList.length) {
@@ -546,7 +589,7 @@ export default {
       let pa = {
         data: {
           Content: [],
-          Projection: ['Outline']
+          Projection: ['Outline', 'Height']
         },
         zone: 'Ispace'
       }
@@ -557,6 +600,7 @@ export default {
         }
         if (this.sourceIdToOutline[this.allSiListMap[key]]) {
           obj.Outline = this.sourceIdToOutline[this.allSiListMap[key]];
+          obj.Height = this.sourceIdToHeight[this.allSiListMap[key]] / 1000 || 0;
           pa.data.Content.push(obj);
         }
       }

+ 47 - 64
src/views/data_admin/buildTask/addTask/addAssetsTask.vue

@@ -15,12 +15,17 @@
         <el-table ref="multipleTable" :data="tableData" v-loading='loading' stripe height="100%" @selection-change="handleSelectionChange" :header-cell-style="headerStyle">
           <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column label="所属建筑楼层" width="200">
-            <template slot-scope="scope">{{ scope.row.build }}-{{ scope.row.floor }}</template>
+            <template slot-scope="scope">
+              <div>
+                {{scope.row.Building?scope.row.Building.BuildLocalName?scope.row.Building.BuildLocalName:'':''}} -
+                {{scope.row.Floor?scope.row.Floor.FloorLocalName?scope.row.Floor.FloorLocalName:'':''}}
+              </div>
+            </template>
           </el-table-column>
           <el-table-column prop="EquipLocalName" label="资产本地名称" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="EquipLocalId" label="资产本地编码" show-overflow-tooltip width="200"></el-table-column>
-          <el-table-column prop="EquipName" label="设备族"></el-table-column>
-          <el-table-column prop="installation" label="安装位置"></el-table-column>
+          <el-table-column prop="EquipLocalID" label="资产本地编码" show-overflow-tooltip width="200"></el-table-column>
+          <el-table-column prop="FamilyName.Name" label="设备族"></el-table-column>
+          <el-table-column prop="LedgerParam.Siteinstall.InstallLocation" label="安装位置"></el-table-column>
           <template slot="empty">
           <div style="height: 60%;transform: translateY(50%);">
             <i class="icon-wushuju iconfont"></i>
@@ -52,51 +57,21 @@ import { mapGetters } from "vuex"
 import floorCascader from "@/components/ledger/lib/floorCascader"
 import myCascader from "@/components/ledger/lib/assets"
 //api
-import { queryPartsDie, createPropertys } from "@/api/scan/request";
+import { queryProperty } from "@/api/scan/request"
+import { createAssetsTask } from "@/api/data_admin/buildTaskApi"
 export default {
   data() {
     return {
       params: {},
       loading: false,
+      keycode: '',
       page: {
         pageSize: 50,
         pageSizes: [10, 20, 50, 100],
         pageNumber: 1,
         total: 0
       },
-      tableData: [{
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }],
+      tableData: [],
       multipleSelection:[],
       headerStyle: {
         backgroundColor: '#e1e4e5',
@@ -116,17 +91,21 @@ export default {
     this.params = this.$route.query
   },
   mounted() {
-    
+    this.getTableData()
   },
   watch: {
-    projectId() {}
+    projectId() {
+      this.page.pageNumber = 1
+      this.multipleSelection = []
+      this.getTableData()
+    }
   },
   methods: {
     //返回
     goBack() {
       this.$router.push({ name: "buildTask" })
     },
-    //选择设备或部件
+    //选择设备
     changeDevice(val) {
       if(val.code) {
         this.params.category = val.code
@@ -153,7 +132,7 @@ export default {
     getTableData() {
       this.loading = true
       let param = this.formatFilter()
-      queryPartsDie(param, res => {
+      queryProperty(param, res => {
         this.tableData = res.Content
         this.page.total = res.Total
         this.loading = false
@@ -161,11 +140,10 @@ export default {
     },
     //格式化条件
     formatFilter() {
-      let param = {
+      let params = {
         Cascade: [
           {
-            Name: "equipCategory",
-            Projection: ["EquipCode", "EquipName"]
+            Name: "familyName"
           },
           {
             Name: "building",
@@ -176,25 +154,37 @@ export default {
             Projection: [ "FloorLocalName", "FloorName", "FloorID" ]
           }
         ],
-        Filters: `category='${this.params.category}';PropertyId isNull`,
-        Orders: "createTime desc, EquipID asc",
+        Filters: `ProjectId='${this.projectId}'`,
+        Orders: "CreateTime desc, EquipID asc",
         PageNumber: this.page.pageNumber,
         PageSize: this.page.pageSize
       }
 
+      if(this.params.isVerification){
+        params.Filters += `;TaskState isNull`
+      }
+
+      if(this.keycode){
+        params.Filters += `;LedgerParam.Siteinstall.InstallLocation contain '${this.keycode}'`
+      }
+
+      if(this.params.category){
+        params.Filters += `;Family='${this.params.category}'`
+      }
+
       if (this.params.buildId == "noKnow") {
-        param.Filters += `;buildingId isNull`
+        params.Filters += `;BuildingId isNull`
       } else if (this.params.buildId && this.params.buildId != "all") {
-        param.Filters += `;buildingId='${this.params.buildId}'`
+        params.Filters += `;BuildingId='${this.params.buildId}'`
       }
 
       if (this.params.floorId == "noKnow") {
-        param.Filters += `;floorId isNull`
+        params.Filters += `;FloorId isNull`
       } else if (this.params.floorId && this.params.floorId != "all") {
-        param.Filters += `;floorId='${this.params.floorId}'`
+        params.Filters += `;FloorId='${this.params.floorId}'`
       }
 
-      return param
+      return params
     },
     //选择的设备或部件
     handleSelectionChange(val) {
@@ -207,28 +197,21 @@ export default {
     },
     //切换页数
     handleCurrentChange(val) {
+      this.page.pageNumber = 1
       this.page.pageNumber = val
       this.getTableData()
     },
-    //查看详情
-    handleOpenDetail(row) {
-      // window.open(`http://adm.sagacloud.cn:8058/spread?id=${row.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
-      this.$message("开发中...")
-    },
     //创建已选
     handleClickCreate() {
       let list = this.multipleSelection.map((item) => {
-        return item.EquipID
+        return {EquipId: item.EquipID}
       })
       let param = {
-        Filters: `EquipID in ${JSON.stringify(list)}`
+        Content: list
       }
-      createPropertys(param, res => {
+      createAssetsTask(param, res => {
         this.$message.success("创建成功!")
-        this.$router.push({
-          name: "propertyLedger",
-          params: { Family: this.params.Family }
-        })
+        this.$router.push({ name: "buildTask" })
       })
     }
   }

+ 79 - 82
src/views/data_admin/buildTask/addTask/addDeviceTask.vue

@@ -15,24 +15,31 @@
           <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column type="expand">
             <template slot-scope="props">
-              <p v-if="props.row.partsList && props.row.partsList.length" style="color:#99a9bf;line-height:32px;font-size:14px;">包含的部件:</p>
-              <el-form label-position="left" inline class="demo-table-expand" v-if="props.row.partsList && props.row.partsList.length">
-                <el-form-item v-for="item in props.row.partsList" :key="item.name" :label="`${item.name}:`">
-                  <span>{{ item.number }}</span>
+              <p v-if="props.row.ComponentCount && props.row.ComponentCount.length" style="color:#99a9bf;line-height:32px;font-size:14px;">包含的部件:</p>
+              <el-form label-position="left" label-width="auto" inline class="demo-table-expand" v-if="props.row.ComponentCount && props.row.ComponentCount.length">
+                <el-form-item v-for="item in props.row.ComponentCount?props.row.ComponentCount:[]" :key="item.code" :label="`${item.name}:`">
+                  <span>{{ item.count }}</span>
                 </el-form-item>
               </el-form>
             </template>
           </el-table-column>
           <el-table-column label="所属建筑楼层" width="200">
-            <template slot-scope="scope">{{ scope.row.build }}-{{ scope.row.floor }}</template>
+            <template slot-scope="scope">
+              <div>
+                {{scope.row.Building?scope.row.Building.BuildLocalName?scope.row.Building.BuildLocalName:'':''}} -
+                {{scope.row.Floor?scope.row.Floor.FloorLocalName?scope.row.Floor.FloorLocalName:'':''}}
+              </div>
+          </template>
           </el-table-column>
           <el-table-column prop="EquipLocalName" label="设备本地名称" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="EquipLocalId" label="设备本地编码" show-overflow-tooltip width="200"></el-table-column>
-          <el-table-column prop="EquipName" label="设备类"></el-table-column>
-          <el-table-column prop="installation" label="安装位置"></el-table-column>
+          <el-table-column prop="EquipLocalID" label="设备本地编码" show-overflow-tooltip width="200"></el-table-column>
+          <el-table-column prop="EquipCategory.EquipName" label="设备类"></el-table-column>
+          <el-table-column prop="LedgerParam.Siteinstall.InstallLocation" label="安装位置"></el-table-column>
           <el-table-column prop="type" label="现场验证操作规定" width="200">
             <template slot-scope="scope">
-              <el-button @click.native.prevent="handleOpenDetail(scope.row, tableData)" type="text" size="small">详情</el-button>
+              <el-select style="width:100px;" v-model="scope.row.SchemeId" placeholder="请选择">
+                <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+              </el-select>
             </template>
           </el-table-column>
           <template slot="empty">
@@ -66,7 +73,8 @@ import { mapGetters } from "vuex"
 import floorCascader from "@/components/ledger/lib/floorCascader"
 import myCascader from "@/components/ledger/lib/cascader"
 //api
-import { queryPartsDie, createPropertys } from "@/api/scan/request";
+import { queryEquip } from "@/api/scan/request"
+import { createDeviceTask } from "@/api/data_admin/buildTaskApi"
 export default {
   data() {
     return {
@@ -79,55 +87,11 @@ export default {
         pageNumber: 1,
         total: 0
       },
-      tableData: [{
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1',
-        partsList: [{
-          name: '部件1',
-          number: 6
-        }, {
-          name: '部件2',
-          number: 23
-        }, {
-          name: '部件3',
-          number: 5
-        }, {
-          name: '部件4',
-          number: 9
-        }, {
-          name: '部件5',
-          number: 1
-        }]
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
-      }, {
-        build: 'A栋',
-        floor: '12F',
-        EquipLocalName: 'XXXXXXXXXXX',
-        EquipLocalId: '5484161891',
-        EquipName: '低压开关柜',
-        installation: '王小虎夫妻店',
-        type: '1'
+      options: [{//方案
+        value: '1',
+        label: '标准'
       }],
+      tableData: [],
       multipleSelection:[],
       headerStyle: {
         backgroundColor: '#e1e4e5',
@@ -147,10 +111,14 @@ export default {
     this.params = this.$route.query
   },
   mounted() {
-    
+    this.getTableData()
   },
   watch: {
-    projectId() {}
+    projectId() {
+      this.page.pageNumber = 1
+      this.multipleSelection = []
+      this.getTableData()
+    }
   },
   methods: {
     //返回
@@ -184,21 +152,45 @@ export default {
     getTableData() {
       this.loading = true
       let param = this.formatFilter()
-      queryPartsDie(param, res => {
-        this.tableData = res.Content
+      queryEquip(param, res => {
+        this.tableData = res.Content.map(item => {
+          if(item.Component && item.Component.length){
+            item.ComponentCount = []
+            item.Component.map(parts => {
+              if(parts.EquipCategory && parts.EquipCategory.EquipCode && parts.EquipCategory.EquipName){
+                let index = item.ComponentCount.findIndex(c => {return c.code == parts.EquipCategory.EquipCode})
+                if(index != -1){
+                  item.ComponentCount[index].count++
+                } else {
+                  item.ComponentCount.push({
+                    name: parts.EquipCategory.EquipName,
+                    code: parts.EquipCategory.EquipCode,
+                    count: 1
+                  })
+                }
+              }
+            })
+          }
+          item.SchemeId = "1"
+          return item
+        })
         this.page.total = res.Total
         this.loading = false
       })
     },
     //格式化条件
     formatFilter() {
-      let param = {
+      let params = {
         Cascade: [
           {
             Name: "equipCategory",
             Projection: ["EquipCode", "EquipName"]
           },
           {
+            Name: "component",
+            Cascade: [{Name: "equipCategory"}]
+          },
+          {
             Name: "building",
             Projection: [ "BuildLocalName", "BuildName", "BuildID" ]
           },
@@ -207,25 +199,37 @@ export default {
             Projection: [ "FloorLocalName", "FloorName", "FloorID" ]
           }
         ],
-        Filters: `category='${this.params.category}';PropertyId isNull`,
-        Orders: "createTime desc, EquipID asc",
+        Filters: `ProjectId='${this.projectId}'`,
+        Orders: "CreateTime desc, EquipID asc",
         PageNumber: this.page.pageNumber,
         PageSize: this.page.pageSize
       }
+      
+      if(this.params.isVerification){
+        params.Filters += `;TaskState isNull`
+      }
+
+      if(this.keycode){
+        params.Filters += `;LedgerParam.Siteinstall.InstallLocation contain '${this.keycode}'`
+      }
+
+      if(this.params.category){
+        params.Filters += `;Category='${this.params.category}'`
+      }
 
       if (this.params.buildId == "noKnow") {
-        param.Filters += `;buildingId isNull`
+        params.Filters += `;BuildingId isNull`
       } else if (this.params.buildId && this.params.buildId != "all") {
-        param.Filters += `;buildingId='${this.params.buildId}'`
+        params.Filters += `;BuildingId='${this.params.buildId}'`
       }
 
       if (this.params.floorId == "noKnow") {
-        param.Filters += `;floorId isNull`
+        params.Filters += `;FloorId isNull`
       } else if (this.params.floorId && this.params.floorId != "all") {
-        param.Filters += `;floorId='${this.params.floorId}'`
+        params.Filters += `;FloorId='${this.params.floorId}'`
       }
 
-      return param
+      return params
     },
     //选择的设备或部件
     handleSelectionChange(val) {
@@ -238,28 +242,21 @@ export default {
     },
     //切换页数
     handleCurrentChange(val) {
+      this.page.pageNumber = 1
       this.page.pageNumber = val
       this.getTableData()
     },
-    //查看详情
-    handleOpenDetail(row) {
-      // window.open(`http://adm.sagacloud.cn:8058/spread?id=${row.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
-      this.$message("开发中...")
-    },
     //创建已选
     handleClickCreate() {
       let list = this.multipleSelection.map((item) => {
-        return item.EquipID
+        return {EquipId: item.EquipID}
       })
       let param = {
-        Filters: `EquipID in ${JSON.stringify(list)}`
+        Content: list
       }
-      createPropertys(param, res => {
+      createDeviceTask(param, res => {
         this.$message.success("创建成功!")
-        this.$router.push({
-          name: "propertyLedger",
-          params: { Family: this.params.Family }
-        })
+        this.$router.push({ name: "buildTask" })
       })
     }
   }

+ 16 - 5
src/views/data_admin/buildTask/addTask/addModelTask.vue

@@ -42,11 +42,13 @@ export default {
   },
   data() {
     return {
+      query: {},//query信息
       dialogVisible: false,//是否显示弹窗
       modelFolderName: '',//模型文件夹名字
+      modelFolderId: '',//模型文件夹的id
       modelFileName: '',//模型文件名字
       modelFileList: [],
-      CurrentModelId: '',
+      CurrentModelId: '',//模型文件id
       device: '',//设备类别
       spaceList: []//选中的空间
     };
@@ -56,15 +58,16 @@ export default {
     params(){
       return {
         device: this.device,
+        CurrentModelId: this.CurrentModelId,
         modelFolderName: this.modelFolderName,
         modelFileName: this.modelFileName,
-        spaceList: this.spaceList
+        spaceList: this.spaceList,
+        isVerification: this.query.isVerification
       }
     }
   },
-  mounted() { },
-  created() {
-    
+  created() { 
+    this.query = this.$route.query
   },
   methods: {
     goBack(){//返回
@@ -95,7 +98,10 @@ export default {
       this.modelFileList = []
       this.CurrentModelId = ''
       this.modelFolderName = ''
+      this.modelFolderId = ''
+      this.modelFileName = ''
       this.spaceList = []
+      this.dialogVisible = false
       this.$refs.drawModel.clearGraphy()
     },
     handleChangeModelFile(file){//切换模型文件
@@ -104,12 +110,17 @@ export default {
         return item
       })
       this.CurrentModelId = file.CurrentModelId
+      this.modelFolderId = file.FolderId
       this.modelFileName = file.FloorName
     },
     changeDevice(val){//切换设备类别
       this.device = val.code
     },
     handleClickCreate(){//创建已选
+      if(!this.CurrentModelId){
+        this.$message('请选择模型文件!')
+        return false
+      }
       this.spaceList = this.$refs.drawModel.getSelectedSpaces().map(item => {
         return item.data.SourceId
       })

+ 25 - 27
src/views/data_admin/buildTask/index.vue

@@ -6,21 +6,17 @@
 			<el-divider direction="vertical"></el-divider>
 			<div class="condition-list">
 				<floor-cascader  v-show="taskType == 'device' || taskType == 'assets'" :isWidth="false" @change="changeFloor"></floor-cascader>
-				<div class="task-state" v-show="taskType == 'model' || taskType == 'device' || taskType == 'assets'">
-					<span class="task-stete-title" style="margin-right: 12px;">任务执行情况</span>
-					<el-select v-model="taskState" placeholder="请选择" filterable style="width:120px;" size="small" @change="changeState">
-						<el-option  v-for="item in taskStateList" :key="item.code" :label="item.label" :value="item.value"></el-option>
-					</el-select>
-				</div>
+				<task-state v-show="taskType == 'model' || taskType == 'device' || taskType == 'assets'" ref="taskState" @change="changeState"></task-state>
 				<model-file  v-show="taskType == 'model'" ref="modelFile" @change="handleChangeModel"></model-file>
-				<my-cascader  v-show="taskType == 'model' || taskType == 'device'" :isWidth="false" ref="cascader" @change="changeDevice"></my-cascader>
-				<assets-cascader  v-show="taskType == 'assets'" :isWidth="false" ref="assets" @change="changeAssets"></assets-cascader>
+				<model-cascader  v-show="taskType == 'model'" :isWidth="false" ref="modelCascader" @change="changeModelCascader"></model-cascader>
+				<device-cascader  v-show="taskType == 'device'" :isWidth="false" ref="deviceCascader" @change="changeDeviceCascader"></device-cascader>
+				<assets-cascader  v-show="taskType == 'assets'" :isWidth="false" ref="assets" @change="changeAssetsCascader"></assets-cascader>
 			</div>
 			<el-button class="add-task" @click="addTaskDialog = true">添加验证任务</el-button>
 		</div>
 		<div class="tabel-box">
-			<model-table :paramsData="{taskState, modelFile, category}" v-if="taskType == 'model'"></model-table>
-			<device-table :paramsData="{buildfloor, taskState, category}" v-else-if="taskType == 'device'"></device-table>
+			<model-table :paramsData="{taskState, modelFile, modelCategory}" v-if="taskType == 'model'"></model-table>
+			<device-table :paramsData="{buildfloor, taskState, deviceCategory}" v-else-if="taskType == 'device'"></device-table>
 			<assets-table :paramsData="{buildfloor, taskState, family}" v-else-if="taskType == 'assets'"></assets-table>
 			<tear-table v-else-if="taskType == 'tear'"></tear-table>
 			<replace-table v-else-if="taskType == 'replace'"></replace-table>
@@ -33,9 +29,13 @@
 import { mapGetters } from "vuex"
 import taskStatistics from '@/components/data_admin/buildTask/taskStatistics'
 import floorCascader from "@/components/ledger/lib/floorCascader"
-import assetsCascader from "@/components/ledger/lib/assets"
-import myCascader from "@/components/ledger/lib/cascader"
-import modelFile from "@/components/ready/buildfloor/modelFile"
+
+import taskState from "@/components/data_admin/buildTask/lib/taskState"
+import modelFile from "@/components/data_admin/buildTask/lib/modelFile"
+import modelCascader from "@/components/data_admin/buildTask/lib/modelCascader"
+import deviceCascader from "@/components/data_admin/buildTask/lib/deviceCascader"
+import assetsCascader from "@/components/data_admin/buildTask/lib/assetsCascader"
+
 import modelTable from "@/components/data_admin/buildTask/table/modelTable"
 import deviceTable from "@/components/data_admin/buildTask/table/deviceTable"
 import assetsTable from "@/components/data_admin/buildTask/table/assetsTable"
@@ -44,10 +44,12 @@ import replaceTable from "@/components/data_admin/buildTask/table/replaceTable"
 import addTask from "@/components/data_admin/buildTask/dialog/addTaskDialog"
 export default {
   components: {
+		taskState,
+		modelCascader,
 		taskStatistics,
 		floorCascader,
 		modelFile,
-		myCascader,
+		deviceCascader,
 		assetsCascader,
 		modelTable,
 		deviceTable,
@@ -88,7 +90,8 @@ export default {
 			}],
 			taskState: '',//任务执行情况
 			modelFile: '',//模型文件
-			category: '',//设备类型
+			modelCategory: '',//模型-设备类型
+			deviceCategory: '',//设备-设备类型
 			family: '',//设备族
 			buildfloor: ['all'],//建筑楼层
 			taskTypes: ['verification','model'],
@@ -113,11 +116,14 @@ export default {
 		changeFloor(val){//修改建筑楼层
 			this.buildfloor = val
 		},
-		changeDevice(val){//修改设备类型
-			this.category = val.code
+		changeModelCascader(val){//修改模型-设备类型
+			this.modelCategory = val.Code
+		},
+		changeDeviceCascader(val){//修改设备-设备类型
+			this.deviceCategory = val.Code
 		},
-		changeAssets(val){//修改设备族
-			this.family = val.code
+		changeAssetsCascader(val){//修改设备族
+			this.family = val.Code
 		}
   }
 }
@@ -135,14 +141,6 @@ export default {
 			display: inline-block;
 			vertical-align: middle;
 			line-height: 32px;
-			.task-state{
-				float: left;
-  			margin-left: 10px;
-				.task-stete-title{
-					color: #999999;
-    			font-size: 14px;
-				}
-			}
 		}
 		.add-task{
 			position: absolute;

+ 19 - 17
src/views/ledger/spacelist/index.vue

@@ -12,8 +12,9 @@
     <!--------- 页面头部   -------------->
     <div class="saga-title">
       <div class="saga-build-mess">
-        <span style="padding-right:12px;color:#999999;">建筑楼层</span>
-        <el-cascader :options="options" v-model="buildFloorSelectd" :props="props" @change="changeCascader"></el-cascader>
+        <!-- <span style="padding-right:12px;color:#999999;">建筑楼层</span> -->
+        <floorCascader @change="changeCascader"></floorCascader>
+        <!-- <el-cascader :options="options" v-model="buildFloorSelectd" :props="props" @change="changeCascader"></el-cascader> -->
       </div>
       <div class="saga-build-tab">
         <el-radio-group v-model="isMyTab" @change="changeRadio" style="width: 136px;">
@@ -31,9 +32,6 @@
             </template>
           </el-tabs>
         </div>
-        <div class="groupAdd">
-          <el-button size="small" @click="groupCreateBSpace">批量创建业务空间</el-button>
-        </div>
       </el-row>
       <div v-show="isMyTab == 1" style="width:100%;height:100%">
         <graphy @getSp="checkSpace" @dimension="checkSpace" @businessDetails="getBuinessDetails" ref="graphy"></graphy>
@@ -61,6 +59,7 @@ import {
   queryDictionaryHead, //数据中心-字典头部信息查询接口
 } from "@/api/scan/request";
 import tools from '@/utils/scan/tools'
+import floorCascader from "@/components/ledger/lib/floorCascader";
 import { mapGetters, mapActions } from "vuex";
 export default {
   components: {
@@ -70,7 +69,8 @@ export default {
     notRelated,
     graphy,
     handsontableMain,
-    facilityDialog
+    facilityDialog,
+    floorCascader,
   },
   computed: {
     ...mapGetters('layout', ['projectId', 'userId', 'secret'])
@@ -113,7 +113,7 @@ export default {
       },
       floorToMap: {}, //楼层及其对应的模型图
       FloorMap: "", //当前选中的楼层对象
-      buildFloorSelectd: [], //当前所选的建筑楼层
+      buildFloorSelectd: ['all'], //当前所选的建筑楼层
       childBackParam: {}
     };
   },
@@ -171,7 +171,7 @@ export default {
         }).filter(item => item);
         if (this.childBackParam.zone) {
           this.activeName = this.childBackParam.zone;
-          this.buildFloorSelectd = [this.childBackParam.BuildingId, this.childBackParam.FloorId];
+          // this.buildFloorSelectd = [this.childBackParam.BuildingId, this.childBackParam.FloorId];
           this.isMyTab = this.childBackParam.isMyTab;
         } else {
           this.activeName = 'GeneralZone';
@@ -195,19 +195,21 @@ export default {
     },
     //修改所选建筑楼层
     changeCascader(val) {
-      // val[0]->建筑 val[1]->楼层
-      if (!this.floorToMap[val[1]].StructureInfo || !this.floorToMap[val[1]].StructureInfo.FloorMap) {
+      this.buildFloorSelectd = val;
+      // 如果选择的是全部或者未明确
+      if (val.indexOf('noKnow') > -1 || val.indexOf('all') > -1) {
         this.isMyTab = 2;
+      } else {
+        // 选择的是具体某个楼层
+        if (!this.floorToMap[val[1]].StructureInfo || !this.floorToMap[val[1]].StructureInfo.FloorMap) {
+          this.isMyTab = 2;
+        }
+        this.FloorMap = this.floorToMap[val[1]];
       }
-      this.FloorMap = this.floorToMap[val[1]];
       this.changeGraphyOrTable(this.isMyTab)
     },
     // 判断切换至图还是表
     changeGraphyOrTable(num) {
-      if (!this.buildFloorSelectd.length) {
-        this.$message("请选择楼层")
-        return false
-      }
       this.activeTabType = this.getItemForType()
       if (num == 2) {
         this.initMessage();
@@ -306,8 +308,8 @@ export default {
     margin-bottom: 10px;
     border: 1px solid #dfe6ec;
     .saga-build-mess {
-      position: absolute;
-      left: 10px;
+      // position: absolute;
+      // left: 10px;
       width: 500px;
       margin-left: 10px;
       i {

+ 5 - 4
src/views/ledger/spacelist/spaceDetail/index.vue

@@ -83,14 +83,15 @@ export default {
       }
       queryZone(pa, res => {
         this.spaceDetails = res.Content[0];
-        this.params.BuildingId = this.spaceDetails.BuildingId;
-        this.params.FloorId = this.spaceDetails.FloorId;
+        // this.params.BuildingId = this.spaceDetails.BuildingId;
+        // this.params.FloorId = this.spaceDetails.FloorId;
       })
     },
     // 设置iframe
     setFrame() {
-      this.iframeSrc =
-        `${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.params.RoomID}&type=0&code=${this.params.zone}`;
+      this.iframeSrc = this.params.isMyTab == 2 ?
+        `${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.params.RoomID}&type=0&code=${this.params.zone}`
+        : `${process.env.BASE_URL}:8889/#/changeMess?perjectId=${this.projectId}&secret=${this.secret}&id=${this.params.RoomID}&type=${this.params.zone}`;
     },
     // 删除业务空间
     deleteSpace() {

+ 5 - 11
src/views/ledger/system/index.vue

@@ -20,14 +20,9 @@ import floorCascader from "@/components/ledger/lib/floorCascader";
 import myCascader from "@/components/ledger/lib/system";
 import hansonTable from "@/components/ledger/handsontables/system";
 import tableTransfers from "@/components/ledger/tableTransfers";
-import {
-  mapGetters,
-  mapActions
-} from "vuex";
+import { mapGetters } from "vuex";
 import { countGeneralSys } from "@/api/scan/request"
-import Handsontable from "handsontable-pro"
 import 'handsontable-pro/dist/handsontable.full.css'
-import zhCN from 'handsontable-pro/languages/zh-CN';
 
 export default {
   components: {
@@ -64,11 +59,10 @@ export default {
     this.param.ProjId = this.projectId
     this.param.secret = this.secret
     this.countGeneralSys()
-
-    let deviceId = this.$route.params.deviceId;
-    if (deviceId) {
+    let SysType = this.$route.params.SysType;
+    if (SysType) {
       this.$nextTick(() => {
-        this.$refs.cascader.changeVal(deviceId)
+        this.$refs.cascader.changeVal(SysType)
       })
     }
   },
@@ -89,7 +83,7 @@ export default {
       this.$refs.cascader.getData()
     },
     //获取系统统计信息
-    countGeneralSys(){
+    countGeneralSys() {
       let param = {}
       countGeneralSys(param, res => {
         this.mess.name[0].num = res.Count

+ 164 - 0
src/views/ledger/system/systemDetail/index.vue

@@ -0,0 +1,164 @@
+<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="deleteSystem">删除系统</el-button>
+        </div>
+      </el-row>
+      <div v-if="activeTab=='detail'" style="height:calc(100% - 110px)">
+        <div>开发中...</div>
+      </div>
+      <!-- 系统内设备 -->
+      <deviceTable v-if="activeTab=='Equipment'" :params="params" :type="activeTab"></deviceTable>
+      <!-- 系统所在竖井 -->
+      <cenoteTable v-else-if="activeTab=='cenote'" :params="params" :type="activeTab"></cenoteTable>
+      <!-- 系统所在业务空间 -->
+      <spaceTable v-else-if="activeTab=='space'" :params="params" :type="activeTab"></spaceTable>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex"
+import { queryLinkSys, deleteGeneralSys } from '@/api/scan/request'
+import cenoteTable from '@/components/ledger/system/table/cenoteTable'
+import deviceTable from '@/components/ledger/system/table/deviceTable'
+import spaceTable from '@/components/ledger/system/table/spaceTable'
+export default {
+  data() {
+    return {
+      params: {}, //参数-包含系统id 分区类型
+      tabsList: [
+        { Code: 'detail', Name: '系统详情' },
+        { Code: 'Equipment', Name: '系统内设备' },
+        { Code: 'cenote', Name: '系统所在竖井' },
+        { Code: 'space', Name: '系统所在业务空间' },
+      ], //tab页
+      activeTab: 'detail', //当前选中的tab
+      systemDetails: {}, //系统信息
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId", "userId", "secret"])
+  },
+  components: {
+    cenoteTable,
+    deviceTable,
+    spaceTable
+  },
+  created() {
+    this.params = this.$route.query;
+    this.getSystemDetails();
+  },
+  mounted() { },
+  watch: {
+    projectId() { }
+  },
+  methods: {
+    // 返回
+    goBack() {
+      this.$router.push({
+        name: "systemlist",
+        params: this.params
+      })
+    },
+    // 查询系统详情
+    getSystemDetails() {
+      let pa = {
+        Filters: `SysID="${this.params.SysID}"`
+      }
+      queryLinkSys(pa, res => {
+        this.systemDetails = res.Content[0];
+      })
+    },
+    // 删除系统
+    deleteSystem() {
+      this.$confirm("此操作将删除系统,是否继续?", "提示", {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let pa = [{
+          SysID: this.systemDetails.SysID
+        }]
+        this.removeSys(pa)
+      }).catch(() => {
+        this.$message("取消删除")
+      })
+    },
+    async removeSys(param) {
+      await deleteGeneralSys(param, res => {
+        this.$message.success("删除成功")
+        this.goBack()
+      })
+    },
+  }
+};
+</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>
+

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

@@ -102,7 +102,7 @@
               <el-table-column :label="`${typeName}实例名称`" width="200" class-name="bgf5" show-overflow-tooltip>
                 <template slot-scope="scope">{{ scope.row.ObjectLocalName }}</template>
               </el-table-column>
-              <el-table-column prop="ObjectID" :label="`${typeName}实例编码`" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="ObjectLocalCode" :label="`${typeName}本地编码`" show-overflow-tooltip></el-table-column>
               <el-table-column prop="SubTypeName" :label="`${typeName}类型`" show-overflow-tooltip></el-table-column>
               <el-table-column label="所在建筑楼层">
                 <template slot-scope="scope">

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

@@ -102,7 +102,7 @@
               <el-table-column :label="`${typeName}实例名称`" width="200" class-name="bgf5" show-overflow-tooltip>
                 <template slot-scope="scope">{{ scope.row.ObjectLocalName }}</template>
               </el-table-column>
-              <el-table-column prop="ObjectID" :label="`${typeName}实例编码`" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="ObjectLocalCode" :label="`${typeName}本地编码`" show-overflow-tooltip></el-table-column>
               <el-table-column prop="SubTypeName" :label="`${typeName}类型`" show-overflow-tooltip></el-table-column>
               <el-table-column prop="CascadeEquipLocalName" label="所属设备实例" show-overflow-tooltip></el-table-column>
               <el-table-column label="所在建筑楼层">

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

@@ -102,7 +102,7 @@
               <el-table-column :label="`${typeName}实例名称`" width="200" class-name="bgf5" show-overflow-tooltip>
                 <template slot-scope="scope">{{ scope.row.ObjectLocalName }}</template>
               </el-table-column>
-              <el-table-column prop="ObjectID" :label="`${typeName}实例编码`" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="ObjectLocalCode" :label="`${typeName}本地编码`" show-overflow-tooltip></el-table-column>
               <el-table-column prop="SubTypeName" :label="`${typeName}类型`" show-overflow-tooltip></el-table-column>
               <!-- <el-table-column prop="CascadeEquipLocalName" label="所属设备实例" show-overflow-tooltip></el-table-column> -->
               <el-table-column label="所在建筑楼层">

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

@@ -102,7 +102,7 @@
               <el-table-column :label="`${typeName}实例名称`" width="200" class-name="bgf5" show-overflow-tooltip>
                 <template slot-scope="scope">{{ scope.row.ObjectLocalName }}</template>
               </el-table-column>
-              <el-table-column prop="ObjectID" :label="`${typeName}实例编码`" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="ObjectLocalCode" :label="`${typeName}本地编码`" show-overflow-tooltip></el-table-column>
               <!-- <el-table-column prop="SubTypeName" :label="`${typeName}类型`" show-overflow-tooltip></el-table-column>
               <el-table-column prop="CascadeEquipLocalName" label="所属设备实例" show-overflow-tooltip></el-table-column>
               <el-table-column label="所在建筑楼层">

+ 22 - 5
src/views/point/dynamicdata/index.vue

@@ -28,13 +28,17 @@
     </el-row>
     <div v-show="typeList.length" style="height: calc(100% - 54px);">
       <!-- 设备 -->
-      <equipRules v-if="curType=='设备'" ref="equip" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"></equipRules>
+      <equipRules v-if="curType=='设备'" ref="equip" :typeName="curType" @refresh="refreshTabs" :isPending="isPending" @autoGroupRela="autoGroupRela">
+      </equipRules>
       <!-- 部件 -->
-      <partsRules v-else-if="curType=='部件'" ref="parts" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"></partsRules>
+      <partsRules v-else-if="curType=='部件'" ref="parts" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"
+        @autoGroupRela="autoGroupRela"></partsRules>
       <!-- 系统 -->
-      <systemRules v-else-if="curType=='系统'" ref="system" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"></systemRules>
+      <systemRules v-else-if="curType=='系统'" ref="system" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"
+        @autoGroupRela="autoGroupRela"></systemRules>
       <!-- 空间 -->
-      <spaceRules v-else-if="curType=='空间'" ref="space" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"></spaceRules>
+      <spaceRules v-else-if="curType=='空间'" ref="space" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"
+        @autoGroupRela="autoGroupRela"></spaceRules>
       <!-- 开发中 -->
       <div v-else>开发中</div>
     </div>
@@ -70,6 +74,8 @@
         <el-button size="small" type="primary" @click="apply">确认</el-button>
       </span>
     </el-dialog>
+    <!-- 自动对应实例 -->
+    <autoGroupRelaDialog ref="autoGroupRelaDialog" @autoRelateSuc="autoRelateSuc"></autoGroupRelaDialog>
     <div v-if="!typeList.length" class="center" style="margin-top: 260px;">
       <i class="icon-wushuju iconfont"></i>
       暂无数据
@@ -86,6 +92,7 @@ import equipRules from "@/components/point/dynamicdata/equipRules";
 import partsRules from "@/components/point/dynamicdata/partsRules";
 import systemRules from "@/components/point/dynamicdata/systemRules";
 import spaceRules from "@/components/point/dynamicdata/spaceRules";
+import autoGroupRelaDialog from "@/components/point/dynamicdata/autoGroupRelaDialog";
 import {
   dynamicClashConfirm,
   dynamicPromptmessage,
@@ -118,7 +125,8 @@ export default {
     equipRules,
     partsRules,
     systemRules,
-    spaceRules
+    spaceRules,
+    autoGroupRelaDialog
   },
   created() {
     let typeName = this.$route.query.typeName;
@@ -271,6 +279,15 @@ export default {
     //接收是否有冲突
     getClash(length) {
       this.hasClash = !!length
+    },
+    //自动对应实例
+    autoGroupRela(typeCode) {
+      this.$refs.autoGroupRelaDialog.showDialog(this.curType, typeCode)
+    },
+    //自动对应成功
+    autoRelateSuc(type) {
+      this.$refs[type].autoLoading = true;
+
     }
   },
   watch: {

+ 8 - 14
src/views/ready/buildfloor/drawGraphy/drawFloor.vue

@@ -2,15 +2,15 @@
   <div :id="`drawFloor${id}`" class="drawFloor" v-loading="canvasLoading">
     <canvas :id="`floorCanvas${id}`" :width="cadWidth" :height="cadHeight" ref="canvas" tabindex="0"></canvas>
     <div class="operate" v-if="showTools">
-      <canvasFun @move="moveCanvas" @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @divide="divide" @clearDivide="clearDivide" @undo="undo"
-        @redo="redo" @scale="scale" :isEdit="isEdit" ref="canvasFun"></canvasFun>
+      <canvasFun @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @divide="divide" @clearDivide="clearDivide" @undo="undo" @redo="redo" @scale="scale"
+        @changeAbsorb="changeAbsorb" :isEdit="isEdit" ref="canvasFun"></canvasFun>
     </div>
   </div>
 </template>
 
 <script>
 import { SGraphyView } from "@saga-web/graphy/lib";
-import { DivideFloorScene } from "@saga-web/cad-engine/lib"
+import { DivideFloorScene, FloorView } from "@saga-web/cad-engine/lib"
 import { SColor, SPoint } from "@saga-web/draw/lib";
 import canvasFun from "@/components/business_space/newGraphy/canvasFun"
 import { floorQuery } from "@/api/scan/request";
@@ -123,23 +123,13 @@ export default {
         return
       }
       let id = `floorCanvas${this.id}`;
-      this.view = new SGraphyView(id)
+      this.view = new FloorView(id)
     },
     // canvas 获取焦点
     focus() {
       document.getElementById(`floorCanvas${this.id}`).focus()
     },
     // 工具栏操作
-    // 移动底图
-    moveCanvas(move) {
-      // todo
-      let canvas = document.getElementById(`floorCanvas${this.id}`);
-      if (move) {
-        canvas.style.cursor = 'move';
-      } else {
-        canvas.style.cursor = 'default';
-      }
-    },
     // 适配底图到窗口
     fit() {
       this.view.fitSceneToView()
@@ -160,6 +150,10 @@ export default {
     clearDivide() {
       this.drawMainScene.clearSceneMark()
     },
+    // 吸附
+    changeAbsorb(isAbsorbing) {
+      this.drawMainScene.isAbsorbing = isAbsorbing;
+    },
     // 撤销
     undo() {