Przeglądaj źródła

Merge branch 'screen' of git.sagacloud.cn:web/ibms into screen

zhangyu 5 lat temu
rodzic
commit
ec2ca2a386
52 zmienionych plików z 2179 dodań i 786 usunięć
  1. 1 1
      package.json
  2. 41 36
      src/api/data_admin/buildTaskApi.js
  3. 12 12
      src/api/msgsever.js
  4. 25 0
      src/api/scan/request.js
  5. 6 0
      src/components/business_space/business/handsontable.vue
  6. 1 1
      src/components/business_space/dialogs/list/firm.vue
  7. 22 8
      src/components/business_space/newGraphy/canvasFun.vue
  8. 143 74
      src/components/business_space/newGraphy/graphy.vue
  9. 2 2
      src/components/business_space/newGraphy/unRelateBSP.vue
  10. 1 0
      src/components/common/handsontable.vue
  11. 42 30
      src/components/data_admin/buildTask/dialog/addTaskDialog.vue
  12. 75 64
      src/components/data_admin/buildTask/dialog/modelTaskDialog.vue
  13. 144 33
      src/components/data_admin/buildTask/draw/drawModel.vue
  14. 9 2
      src/components/data_admin/buildTask/table/assetsTable.vue
  15. 9 2
      src/components/data_admin/buildTask/table/deviceTable.vue
  16. 10 3
      src/components/data_admin/buildTask/table/modelTable.vue
  17. 9 2
      src/components/data_admin/buildTask/table/replaceTable.vue
  18. 9 2
      src/components/data_admin/buildTask/table/tearTable.vue
  19. 5 0
      src/components/data_admin/buildTask/taskStatistics.vue
  20. 1 1
      src/components/dialogs/list/firm.vue
  21. 225 0
      src/components/ledger/cenote/dialog/addSpaceDialog.vue
  22. 9 4
      src/components/ledger/handsontables/assets.vue
  23. 9 4
      src/components/ledger/handsontables/device.vue
  24. 56 23
      src/components/ledger/handsontables/system.vue
  25. 94 0
      src/components/ledger/lib/buildfloorCascader.vue
  26. 46 22
      src/components/ledger/lib/editSysFloor.vue
  27. 6 5
      src/components/ledger/lib/floorCascader.vue
  28. 4 4
      src/components/ledger/system/dialog/addCenoteDialog.vue
  29. 65 48
      src/components/ledger/system/dialog/addEquipDialog.vue
  30. 19 50
      src/components/ledger/system/dialog/addSpaceDialog.vue
  31. 7 4
      src/components/ledger/system/lib/equipType.vue
  32. 12 36
      src/components/ledger/system/table/spaceTable.vue
  33. 232 205
      src/framework/components/messagesever/index.vue
  34. 209 0
      src/framework/components/messagesever/msgAllDetails.vue
  35. 15 11
      src/framework/layout/layout-store.js
  36. 28 14
      src/router/system.js
  37. 11 19
      src/utils/handsontable/mainText.js
  38. 27 0
      src/utils/tools.js
  39. 1 1
      src/views/data_admin/buildTask/addTask/addAssetsTask.vue
  40. 10 9
      src/views/data_admin/buildTask/addTask/addDeviceTask.vue
  41. 12 4
      src/views/data_admin/buildTask/addTask/addModelTask.vue
  42. 9 5
      src/views/data_admin/buildTask/index.vue
  43. 4 27
      src/views/ledger/cenotelist/index.vue
  44. 260 0
      src/views/ledger/cenotelist/relatedSpace.vue
  45. 82 0
      src/views/ledger/cenotelist/relatedSpaceList.vue
  46. 2 1
      src/views/ledger/spacelist/index.vue
  47. 1 1
      src/views/ledger/system/index.vue
  48. 8 1
      src/views/model/file/index.vue
  49. 1 1
      src/views/ready/buildfloor/drawGraphy/checkGraphy.vue
  50. 25 2
      src/views/ready/buildfloor/drawGraphy/drawFloor.vue
  51. 1 1
      src/views/ready/buildfloor/repetitionGraphy.vue
  52. 122 11
      src/views/screen/splitscreen/spaceledger/index.vue

+ 1 - 1
package.json

@@ -28,7 +28,7 @@
         "@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"
+        "@saga-web/cad-engine": "2.0.385"
     },
     "devDependencies": {
         "ajv": "^6.9.1",

+ 41 - 36
src/api/data_admin/buildTaskApi.js

@@ -8,97 +8,102 @@ const baseUrl = '/api';
  * 
  */
 export function queryTaskCount(param, success) {
-  let url = `${baseUrl}/datacenter/scan-task-base/count`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/scan-task-base/count`;
+    http.postJson(url, param, success)
 }
 
 /*************************模型任务接口****************************/
 //创建模型任务
 export function createModelTask(param, success) {
-  let url = `${baseUrl}/datacenter/model-scan-task/create`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/model-scan-task/create`;
+    http.postJson(url, param, success)
 }
 //根据id删除模型任务
 export function deleteModelTask(param, success) {
-  let url = `${baseUrl}/datacenter/model-scan-task/delete`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/model-scan-task/delete`;
+    http.postJson(url, param, success)
+}
+//查询:根据模型空间ID查询设备信息
+export function queryModelDiglog(param, success) {
+    let url = `${baseUrl}/datacenter/model-scan-task/equip-query`;
+    http.postJson(url, param, success)
 }
 //查询模型任务
 export function queryModelTask(param, success) {
-  let url = `${baseUrl}/datacenter/model-scan-task/page-query`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/model-scan-task/page-query`;
+    http.postJson(url, param, success)
 }
 //更新模型任务
 export function updateModelTask(param, success) {
-  let url = `${baseUrl}/datacenter/model-scan-task/update`;
-  http.postJson(url, 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)
+    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)
+    let url = `${baseUrl}/datacenter/model-scan-task/model-file-query`;
+    http.postJson(url, param, success)
 }
 
 /*************************设备台账任务接口****************************/
 //创建设备台账任务
 export function createDeviceTask(param, success) {
-  let url = `${baseUrl}/datacenter/equip-scan-task/create`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/equip-scan-task/create`;
+    http.postJson(url, param, success)
 }
 //根据id删除设备台账任务
 export function deleteDeviceTask(param, success) {
-  let url = `${baseUrl}/datacenter/equip-scan-task/delete`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/equip-scan-task/delete`;
+    http.postJson(url, param, success)
 }
 //查询设备台账任务
 export function queryDeviceTask(param, success) {
-  let url = `${baseUrl}/datacenter/equip-scan-task/page-query`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/equip-scan-task/page-query`;
+    http.postJson(url, param, success)
 }
 //更新设备台账任务
 export function updateDeviceTask(param, success) {
-  let url = `${baseUrl}/datacenter/equip-scan-task/update`;
-  http.postJson(url, 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)
+    let url = `${baseUrl}/datacenter/equip-scan-task/equip-category-query`;
+    http.postJson(url, param, success)
 }
 
 /*************************资产台账任务接口****************************/
 //统计数量
 export function countAssetsTask(param, success) {
-  let url = `${baseUrl}/datacenter/property-scan-task/count`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/property-scan-task/count`;
+    http.postJson(url, param, success)
 }
 //创建设备台账任务
 export function createAssetsTask(param, success) {
-  let url = `${baseUrl}/datacenter/property-scan-task/create`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/property-scan-task/create`;
+    http.postJson(url, param, success)
 }
 //根据id删除设备台账任务
 export function deleteAssetsTask(param, success) {
-  let url = `${baseUrl}/datacenter/property-scan-task/delete`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/property-scan-task/delete`;
+    http.postJson(url, param, success)
 }
 //查询设备台账任务
 export function queryAssetsTask(param, success) {
-  let url = `${baseUrl}/datacenter/property-scan-task/page-query`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/datacenter/property-scan-task/page-query`;
+    http.postJson(url, param, success)
 }
 //更新设备台账任务
 export function updateAssetsTask(param, success) {
-  let url = `${baseUrl}/datacenter/property-scan-task/update`;
-  http.postJson(url, 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)
+    let url = `${baseUrl}/datacenter/property-scan-task/property-category-query`;
+    http.postJson(url, param, success)
 }

+ 12 - 12
src/api/msgsever.js

@@ -8,8 +8,8 @@ const baseUrl = '/api';
  * info: 查询总数量不传参数,查询 已读Read = true,未读 Read = false
  */
 export function messgeCount(param, success) {
-  let url = `${baseUrl}/message-center/message/count`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/message-center/message/count`;
+    http.postJson(url, param, success)
 }
 
 /**
@@ -17,24 +17,24 @@ export function messgeCount(param, success) {
  * info: 消息类型:提示(Info)、警告(Warning)、错误(Error)、成功(Success)
  */
 export function messgeCreate(param, success) {
-  let url = `${baseUrl}/message-center/message/create`;
-  http.postJson(url, 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)
+    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)
+    let url = `${baseUrl}/message-center/message/page-query`;
+    http.postJson(url, param, success)
 }
 
 /**
@@ -42,8 +42,8 @@ export function messgeQuery(param, success) {
  * info: 是否读过:未读(f)、已读(t)
  */
 export function messgeUpdate(param, success) {
-  let url = `${baseUrl}/message-center/message/update`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/message-center/message/update`;
+    http.postJson(url, param, success)
 }
 
 /**
@@ -51,6 +51,6 @@ export function messgeUpdate(param, success) {
  * info: 已读Read = true,*UserId
  */
 export function messgeUpdateState(param, success) {
-  let url = `${baseUrl}/message-center/message/update-state`;
-  http.postJson(url, param, success)
+    let url = `${baseUrl}/message-center/message/update-state`;
+    http.postJson(url, param, success)
 }

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

@@ -919,6 +919,19 @@ export function queryLinkSys(param, success) {
     http.postJson(url, param, success)
 }
 
+//查询系统信息 - 建筑楼层 - 系统一对多
+export function querySysLinkBuild(param, success) {
+    let url = `${baseUrl}/datacenter/general—system/query-new`;
+    if(param.buildingId){
+        url += `?buildingId=${param.buildingId}`
+    }
+    if(param.floorId){
+        url += `&floorId=${param.floorId}`
+    }
+    http.postJson(url, param.data, success)
+}
+
+
 //设备清单 - 设备关联系统 设备1-n
 export function equipLinkSys(param, success) {
     let url = `${baseUrl}/datacenter/sy-in-eq/link-sy`;
@@ -1053,6 +1066,18 @@ export function getEquipNotInSys(param, success) {
     http.postJson(url, param.data, success)
 }
 
+//创建系统所在建筑关系,系统一对多,覆盖
+export function sysRelateBuild(param, success) {
+    let url = `${baseUrl}/datacenter/sy-in-bd/link-bd`;
+    http.postJson(url, param, success)
+}
+
+//创建系统所在楼层关系,系统一对多,覆盖
+export function sysRelateFloor(param, success) {
+    let url = `${baseUrl}/datacenter/sy-in-fl/link-fl`;
+    http.postJson(url, param, success)
+}
+
 //查询当前系统下的设备
 export function getEquipInSys(param, success) {
     let url = `${baseUrl}/equip-component/equip-query/sys-equip`;

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

@@ -163,6 +163,9 @@ export default {
         });
         if (this.main && this.main.length && this.main[0].RoomID) {
           this.copyMain = tools.deepCopy(this.main);
+          if (this.onlyRead) {
+            this.getBatch(this.main)
+          }
         }
         this.isLoading = false
         this.getMain()
@@ -483,6 +486,9 @@ export default {
       });
       if (param.data.criterias.length) {
         BeatchQueryParam(param, res => {
+          if (!this.onlyRead) {
+            return false
+          }
           this.main = data.map(item => {
             res.Content.map(child => {
               if (item.RoomID == child.id) {

+ 1 - 1
src/components/business_space/dialogs/list/firm.vue

@@ -22,7 +22,7 @@
                 <el-radio v-model="radio" :label="scope.row">{{scope.row.venderName || "--"}}</el-radio>
               </template>
             </el-table-column>
-            <el-table-column header-align='center' prop="brand" label="品牌"></el-table-column>
+            <el-table-column header-align='center' prop="brandName" label="品牌"></el-table-column>
             <el-table-column header-align='center' prop="name" label="型号"></el-table-column>
             <el-table-column header-align='center' label="技术参数">
               <template slot-scope="scope">

+ 22 - 8
src/components/business_space/newGraphy/canvasFun.vue

@@ -1,21 +1,25 @@
 <template>
-  <el-row id="canvas-actions-box" :class="{'isEdit':isEdit}">
+  <el-row id="canvas-actions-box" :class="{'isEdit':config.isEdit}">
     <!-- <div :class="{'active':active=='move'}">
       <i class="iconfont icon-move" @click="moveCanvas"></i>
     </div> -->
+    <div v-if="config.isEdit&&config.groupSelect" :class="{'active':active=='groupSelect'}">
+      <i class="iconfont icon-shuxingxuanze" @click="groupSelect"></i>
+    </div>
     <div>
       <i class="iconfont icon-maximize" @click="fitToWindow"></i>
     </div>
-    <div>
+    <div v-if="!config.isEdit">
       <el-dropdown size="mini" placement="top-start" @command="handleCommand">
         <i class="el-icon-download" style="font-size:20px;color:#fff;"></i>
         <el-dropdown-menu slot='dropdown'>
           <el-dropdown-item command="savePng">保存为png</el-dropdown-item>
           <el-dropdown-item command="saveSvg">保存为svg</el-dropdown-item>
+          <el-dropdown-item command="saveJson">保存为Json</el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
     </div>
-    <div v-if="isEdit" :class="{'active':active=='divide'}">
+    <div v-if="config.isEdit&&config.divide" :class="{'active':active=='divide'}">
       <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'>
@@ -25,13 +29,13 @@
         </el-dropdown-menu>
       </el-dropdown>
     </div>
-    <div v-if="isEdit">
+    <div v-if="config.isEdit&&config.divide">
       <i class="iconfont icon-Erase" @click="clearDivide"></i>
     </div>
-    <div v-if="isEdit">
+    <div v-if="config.isEdit">
       <i class="iconfont icon-Cancel" @click="undo"></i>
     </div>
-    <div v-if="isEdit">
+    <div v-if="config.isEdit">
       <i class="iconfont icon-Anti-cancel" @click="redo"></i>
     </div>
     <div>
@@ -57,8 +61,13 @@ export default {
     }
   },
   props: {
-    isEdit: {
-      default: false
+    config: {
+      type: Object,
+      default: {
+        isEdit: false,
+        divide: true,
+        groupSelect: false
+      }
     }
   },
   computed: {
@@ -70,6 +79,11 @@ export default {
     //   this.active = this.active != "move" ? "move" : '';
     //   this.$emit('move', this.active == 'move');
     // },
+    //
+    groupSelect() {
+      this.active = 'groupSelect';
+      this.$emit('groupSelect');
+    },
     // 适配大小
     fitToWindow() {
       this.$emit('fit');

+ 143 - 74
src/components/business_space/newGraphy/graphy.vue

@@ -49,6 +49,11 @@
             <el-button plain @click="cancelGraphy">取 消</el-button>
             <el-button type="primary" @click="saveRefactorBSP">保存</el-button>
           </div>
+          <!-- 批量创建所选业务空间 -->
+          <div v-show="type==5">
+            <el-button type="primary" @click="groupCreateZone">批量创建所选业务空间</el-button>
+            <el-button plain @click="cancelGraphy">取 消</el-button>
+          </div>
         </div>
         <div style="position: absolute;right: 0;">
           <el-button type="text" @click="lookUnrelatBSpace(false)">未关联平面图的业务空间 {{num}} 条</el-button>
@@ -56,8 +61,8 @@
       </el-row>
       <!-- 底部操作按钮 -->
       <el-row class="canvas-actions-box">
-        <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"
+          @changeAbsorb="changeAbsorb" @scale="scale" @groupSelect="groupSelect" :config="config" ref="canvasFun" @saveJson="saveJson"></canvasFun>
       </el-row>
     </div>
     <!--  -->
@@ -130,7 +135,11 @@ export default {
       FloorObj: {}, //楼层对象
       FloorMap: '', //楼层底图
       tab: {},
-      isEdit: false,
+      config: {
+        isEdit: false,
+        divide: true,
+        groupSelect: true
+      },
       canvasLoading: false,
       view: null,
       scene: null,
@@ -178,6 +187,11 @@ export default {
         // 业务空间
         this.getBusinessSpace();
       }
+      this.config = {
+        isEdit: false,
+        divide: true,
+        groupSelect: true
+      }
       // 获取当前楼层的元空间
       this.getFloorISpace();
       // 查询未关联业务空间的元空间
@@ -223,6 +237,7 @@ export default {
       this.scene.clearZoneSelection();
       // 选中当前
       zone.selected = true;
+      this.curZoneItem = zone;
       this.type = 2;
       this.view.fitSelectedToView();
     },
@@ -333,18 +348,26 @@ export default {
     },
     // canvas点击事件
     canvasClick(item, event) {
-      if (this.type == 4) {
+      console.log(item)
+      console.log(event)
+      if (this.type == 4) {//重新划分
+
+      } else if (this.type == 5) {//批量
 
       } else {
         if (item instanceof SpaceItem && item.selectable) {
+          if (this.type == 2) {
+            this.scene.clearZoneSelection();
+          }
           this.type = 3;
           this.curZoneItem = {};
-          this.scene.isZoneSelectable = false;
         }
         if (item instanceof ZoneItem && item.selectable) {
+          if (this.type == 3) {
+            this.scene.clearSpaceSelection();
+          }
           this.type = 2;
           this.curZoneItem = item;
-          this.scene.isSpaceSelectable = false;
           this.scene.clearZoneSelection();
           item.selected = true;
         }
@@ -353,6 +376,11 @@ export default {
     // 编辑平面图
     editGraphy() {
       this.type = 3;
+      this.config.isEdit = true;
+      this.config.groupSelect = false;
+      this.config.divide = true;
+      // 设置业务空间不可选
+      this.scene.isZoneSelectable = false
     },
     // 查看未关联的业务空间--flag--查看-or-选择
     lookUnrelatBSpace(flag) {
@@ -377,7 +405,17 @@ export default {
       if (this.groupCreateType == 1) {
         this.groupCreateBSpace()
       } else if (this.groupCreateType == 2) {
-
+        this.type = 5;
+        this.config.isEdit = true;
+        this.config.groupSelect = true;
+        this.config.divide = false;
+        this.groupCreateDialogVis = false;
+        // 清空选中空间
+        this.scene.clearSpaceSelection();
+        // 设置空间可选
+        this.scene.isSpaceSelectable = true;
+        // 设置业务空间不可选
+        this.scene.isZoneSelectable = false;
       }
     },
     // 批量创建业务空间
@@ -412,34 +450,9 @@ export default {
           type: "warning"
         }
         ).then(() => {
-          let pa = {
-            zone: this.tab.code,
-            data: {
-              Content: Spaces
-            }
-          }
+          this.groupCreateDialogVis = false;
           this.canvasLoading = true;
-          createZone(pa, res => {
-            res.EntityList.map(t => {
-              Spaces = Spaces.map(item => {
-                if (t.RoomLocalName == item.RoomLocalName) {
-                  item.SpaceId = t.RoomID
-                }
-                return item;
-              })
-            })
-            let param = {
-              data: {
-                Content: Spaces
-              },
-              type: this.tab.code
-            }
-            groupCreRelaZoneAndISp(param, res => {
-              this.$message.success('创建成功')
-              this.canvasLoading = false;
-              this.init(2)
-            })
-          })
+          this.groupCreateBSP(Spaces)
         }).catch(() => {
           this.$message({
             type: "info",
@@ -478,38 +491,21 @@ export default {
       zoneObj.RoomLocalName = val;
       zoneObj.BuildingId = this.buildFloor[0];
       zoneObj.FloorId = this.buildFloor[1];
-      let pa = {
-        zone: this.tab.code,
-        data: {
-          Content: [zoneObj]
-        }
-      }
-      createZone(pa, res => {
-        this.relationInBSPandISP(res.EntityList[0].RoomID, IspaceIdList)
-      })
+      this.createSingleBSP(zoneObj, IspaceIdList)
     },
     // 从未关联平面图的业务空间中选择--按钮返回关联信号
     createFromUnrelated(BSP) {
       BSP.Outline = [];
       BSP.Height = 0;
-      let arr = this.scene.getSelectedSpaces();
+      let arr = this.scene.getSelectedSpaces(), IspaceIdList = [];
       arr.map(t => {
         BSP.Outline.push(t.data.OutLine);
+        IspaceIdList.push(this.BIMIDToSID[t.data.SourceId]);
         if (t.Height && (BSP.Height == 0 || t.Height < BSP.Height)) {
           BSP.Height = t.Height;
         }
       })
-      let pa = {
-        zone: BSP.ObjectType,
-        data: {
-          Content: [BSP],
-          Projection: ['Outline']
-        }
-      }
-      updateZone(pa, res => {
-        this.$message.success('更新成功');
-        this.init(2);
-      })
+      this.updateBSPOutline(BSP, IspaceIdList)
     },
     // 编辑空间详情
     editeSpaceDetail() {
@@ -527,7 +523,8 @@ export default {
       // 设置空间可选
       this.scene.isSpaceSelectable = true;
       // 将已关联的设置不可选,并将当前选的隐藏
-      this.scene.changeSelectZone(this.curZoneItem);
+      this.scene.isZoneSelectable = false;
+      this.curZoneItem.visible = false;
     },
     // 重新划分--保存
     saveRefactorBSP() {
@@ -545,16 +542,27 @@ export default {
       if (!zoneObj.Outline.length) {
         zoneObj.Outline = null;
       }
-      let pa = {
-        zone: this.tab.code,
-        data: {
-          Content: [zoneObj],
-          Projection: ['Outline']
-        },
-      }
-      updateZone(pa, res => {
-        this.relationInBSPandISP(zoneObj.RoomID, IspaceIdList)
+      this.updateBSPOutline(zoneObj, IspaceIdList)
+    },
+    // 批量创建所选业务空间
+    groupCreateZone() {
+      let arr = this.scene.getSelectedSpaces();
+      let spaces = arr.map(t => {
+        return {
+          IspaceId: this.BIMIDToSID[t.data.SourceId],
+          RoomLocalName: t.data.Name,
+          Outline: [t.data.OutLine],
+          BuildingId: this.buildFloor[0],
+          FloorId: this.buildFloor[1],
+          Height: t.data.Height || 0
+        }
       })
+      if (spaces.length) {
+        this.canvasLoading = true;
+        this.groupCreateBSP(spaces)
+      } else {
+        this.$message.warning('未选择空间');
+      }
     },
     // 更新业务空间和元空间的关系
     relationInBSPandISP(SpaceId, IspaceIdList) {
@@ -567,6 +575,65 @@ export default {
         this.init(2);
       })
     },
+    // 批量更新业务空间和元空间的关系
+    groupCreRelaZoneAndISp(Spaces) {
+      let param = {
+        data: {
+          Content: Spaces
+        },
+        type: this.tab.code
+      }
+      groupCreRelaZoneAndISp(param, res => {
+        this.$message.success('创建成功')
+        this.canvasLoading = false;
+        this.init(2)
+      })
+    },
+    // 批量创建
+    groupCreateBSP(spaces) {
+      let pa = {
+        zone: this.tab.code,
+        data: {
+          Content: spaces
+        }
+      }
+      createZone(pa, res => {
+        res.EntityList.map(t => {
+          spaces = spaces.map(item => {
+            if (t.RoomLocalName == item.RoomLocalName) {
+              item.SpaceId = t.RoomID
+            }
+            return item;
+          })
+        })
+        this.groupCreRelaZoneAndISp(spaces)
+      })
+    },
+    // 单个创建
+    createSingleBSP(space, IspaceIdList) {
+      let pa = {
+        zone: this.tab.code,
+        data: {
+          Content: [space]
+        }
+      }
+      createZone(pa, res => {
+        this.relationInBSPandISP(res.EntityList[0].RoomID, IspaceIdList)
+      })
+    },
+    // 更新业务空间区域
+    updateBSPOutline(zoneObj, IspaceIdList) {
+      let pa = {
+        zone: this.tab.code,
+        data: {
+          Content: [zoneObj],
+          Projection: ['Outline']
+        },
+      }
+      updateZone(pa, res => {
+        this.relationInBSPandISP(zoneObj.RoomID, IspaceIdList)
+      })
+    },
     // 查询未关联平面图的业务空间(项目下+当前分区)
     getBSPunrelaISP() {
       let pa = {
@@ -592,15 +659,13 @@ export default {
       this.view = new FloorView('floorCanvas')
     },
     // 工具栏操作
-    // 移动底图
-    moveCanvas(move) {
-      // todo
-      let canvas = document.getElementById(`floorCanvas`);
-      if (move) {
-        canvas.style.cursor = 'move';
-      } else {
-        canvas.style.cursor = 'default';
-      }
+    // 吸附
+    changeAbsorb(isAbsorbing) {
+      this.scene.isAbsorbing = isAbsorbing;
+    },
+    // 框选
+    groupSelect() {
+      this.scene.isRectSelection = true;
     },
     // 适配底图到窗口
     fit() {
@@ -614,6 +679,10 @@ export default {
     saveSvg() {
       this.view.saveSceneSvg(`${this.buildFloor[1]}.svg`, 6400, 4800);
     },
+    // 保存json
+    saveJson() {
+      this.view.saveFloorJson(`${this.buildFloor[1]}.json`)
+    },
     // 切割划分
     divide() {
       this.scene.isMarking = true;

+ 2 - 2
src/components/business_space/newGraphy/unRelateBSP.vue

@@ -138,9 +138,9 @@ export default {
         }
       }
       if (this.floor[0] == 'isNull') {
-        pa.data.Filters += `BuildingId isNull`
+        pa.data.Filters += `;BuildingId isNull`
       } else if (this.floor[0] && this.floor[0] != 'all') {
-        pa.data.Filters += `BuildingId='${this.floor[0]}'`
+        pa.data.Filters += `;BuildingId='${this.floor[0]}'`
       }
       if (this.floor[1] == 'isNull') {
         pa.data.Filters += `;FloorId isNull`

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

@@ -166,6 +166,7 @@
                     sortIndicator: true, //添加排序
                     renderAllRows: true,
                     autoColumnSize: true,
+                    observeChanges: false, //启用observeChanges插件
                     language: "zh-CN",
                     manualColumnResize: true,
                     manualColumnMove: true,

+ 42 - 30
src/components/data_admin/buildTask/dialog/addTaskDialog.vue

@@ -5,9 +5,15 @@
         <el-switch v-model="ruleForm.isVerification"></el-switch>
       </el-form-item>
       <el-form-item label="任务类型" prop="taskType">
-        <div><el-radio v-model="ruleForm.taskType" label="model">现场验证模型</el-radio></div>
-        <div><el-radio v-model="ruleForm.taskType" label="device">现场验证设备台账</el-radio></div>
-        <div><el-radio v-model="ruleForm.taskType" label="assets">现场验证资产台账</el-radio></div>
+        <div>
+          <el-radio v-model="ruleForm.taskType" label="model">现场验证模型</el-radio>
+        </div>
+        <div>
+          <el-radio v-model="ruleForm.taskType" label="device">现场验证设备台账</el-radio>
+        </div>
+        <div>
+          <el-radio v-model="ruleForm.taskType" label="assets">现场验证资产台账</el-radio>
+        </div>
       </el-form-item>
     </el-form>
     <!-- <el-row>
@@ -18,21 +24,19 @@
       <div><el-radio v-model="ruleForm.taskType" label="model">现场验证模型</el-radio></div>
       <div><el-radio v-model="ruleForm.taskType" label="device">现场验证设备台账</el-radio></div>
       <div><el-radio v-model="ruleForm.taskType" label="assets">现场验证资产台账</el-radio></div>
-    </el-row> -->
+    </el-row>-->
     <span slot="footer" class="dialog-footer">
-				<el-button type="primary" @click="$emit('update:addTaskDialog',false)">取  消</el-button>
-				<el-button type="primary" @click="toAddTask()">确  认</el-button>
-			</span>
+      <el-button type="primary" @click="$emit('update:addTaskDialog',false)">取 消</el-button>
+      <el-button type="primary" @click="toAddTask()">确 认</el-button>
+    </span>
   </el-dialog>
 </template>
 
 <script>
-import {  } from "@/api/scan/request";
+import {} from "@/api/scan/request";
 import { mapGetters } from "vuex";
 export default {
-  components: {
-    
-  },
+  components: {},
   computed: {
     ...mapGetters("layout", ["projectId"])
   },
@@ -41,45 +45,53 @@ export default {
       title: "添加验证任务",
       dialogVisible: false,
       ruleForm: {
-        isVerification: false,
-        taskType: ''
+        isVerification: true,
+        taskType: ""
       },
       rules: {
         taskType: [
-          { required: true, message: '请选择任务类型', trigger: 'change' }
+          { required: true, message: "请选择任务类型", trigger: "change" }
         ]
       }
     };
   },
+  created() {},
   props: {
-    addTaskDialog: Boolean //是否显示弹窗
-  },
-  created() { 
-    
+    addTaskDialog: Boolean, //是否显示弹窗
+    newTaskTypes: Array
   },
   methods: {
     toAddTask() {
-      this.$refs.ruleForm.validate((valid) => {
+      this.$refs.ruleForm.validate(valid => {
         if (valid) {
-          if (this.ruleForm.taskType == 'model') {
-            this.$router.push({ path: '/floor/addModelTask', query: this.ruleForm });
-          } else if (this.ruleForm.taskType == 'device') {
-            this.$router.push({ path: '/floor/addDeviceTask', query: this.ruleForm });
-          } else if (this.ruleForm.taskType == 'assets') {
-            this.$router.push({ path: '/floor/addAssetsTask', query: this.ruleForm });
+          this.ruleForm.newTaskTypes = this.newTaskTypes;
+          if (this.ruleForm.taskType == "model") {
+            this.$router.push({
+              path: "/floor/addModelTask",
+              query: this.ruleForm
+            });
+          } else if (this.ruleForm.taskType == "device") {
+            this.$router.push({
+              path: "/floor/addDeviceTask",
+              query: this.ruleForm
+            });
+          } else if (this.ruleForm.taskType == "assets") {
+            this.$router.push({
+              path: "/floor/addAssetsTask",
+              query: this.ruleForm
+            });
           }
         } else {
-          console.log('error submit!!');
+          console.log("error submit!!");
           return false;
         }
-      })
+      });
     },
     handleClose() {
-      this.$emit('update:addTaskDialog',this.dialogVisible)
-    },
+      this.$emit("update:addTaskDialog", this.dialogVisible);
+    }
   }
 };
 </script>
 <style lang="less" scoped>
-
 </style>

+ 75 - 64
src/components/data_admin/buildTask/dialog/modelTaskDialog.vue

@@ -7,7 +7,8 @@
         <el-table-column type="expand">
           <template slot-scope="props">
             <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 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>
@@ -48,11 +49,10 @@
 
 <script>
 import { queryEquip } from "@/api/scan/request"
-import { createModelTask } from "@/api/data_admin/buildTaskApi"
+import { createModelTask, queryModelDiglog } from "@/api/data_admin/buildTaskApi"
 import { mapGetters } from "vuex"
 export default {
   components: {
-    
   },
   computed: {
     ...mapGetters("layout", ["projectId"])
@@ -82,9 +82,12 @@ export default {
   },
   props: {
     dialogVisible: Boolean,//是否显示弹窗
-    params: Object //模型和设备的信息
+    params: Object, //模型和设备的信息
+    newTaskTypes: Array
+  },
+  created() {
+
   },
-  created() { },
   methods: {
     getTableData() {
       let params = {
@@ -95,15 +98,15 @@ export default {
           },
           {
             Name: "component",
-            Cascade: [{Name: "equipCategory"}]
+            Cascade: [{ Name: "equipCategory" }]
           },
           {
             Name: "building",
-            Projection: [ "BuildLocalName", "BuildName", "BuildID" ]
+            Projection: ["BuildLocalName", "BuildName", "BuildID"]
           },
           {
             Name: "floor",
-            Projection: [ "FloorLocalName", "FloorName", "FloorID" ]
+            Projection: ["FloorLocalName", "FloorName", "FloorID"]
           }
         ],
         Filters: `ProjectId='${this.projectId}'`,
@@ -112,55 +115,63 @@ export default {
         PageSize: this.page.pageSize
       }
 
-      if(this.params.spaceList && this.params.spaceList.length){
-        //通过平面图区域查询(接口未支持)
-      } else {
-        params.Filters += `;ModelId='${this.params.CurrentModelId}'`
-      }
-
-      if(this.params.isVerification){
+      if (this.params.isVerification) {
         params.Filters += `;TaskState isNull`
       }
 
-      if(this.params.device){
+      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
+      if (this.params.spaceList && this.params.spaceList.length) {
+        //通过平面图区域查询
+        params.IdList = this.params.spaceList
+        queryModelDiglog(params, res => {
+          this.dataFormatter(res)
+        })
+      } else {
+        params.Filters += `;ModelId='${this.params.CurrentModelId}'`
+        queryEquip(params, res => {
+          this.dataFormatter(res)
         })
-        this.page.total = res.Total
+      }
+
+    },
+    // 表格数据格式化
+    dataFormatter(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) {
       this.selections = val;
     },
     savaRelation() {
-      if(this.selections.length){
+      if (this.selections.length) {
         let list = this.selections.map((item) => {
           return {
             EquipId: item.EquipID,
@@ -174,11 +185,11 @@ export default {
           Content: list
         }
         createModelTask(params, res => {
-          this.$emit('update:dialogVisible',false)
+          this.$emit('update:dialogVisible', false)
           this.$message.success('创建成功!')
-          this.$router.push({name:'buildTask'})//跳转回首页
+          this.$router.push({ name: 'buildTask', query: { newTaskTypes: this.newTaskTypes } })//跳转回首页
         })
-      }else {
+      } else {
         this.$message('请选择要创建的任务!')
       }
     },
@@ -193,13 +204,13 @@ export default {
       this.page.pageNumber = pageNo;
       this.getTableData();
     },
-    handleClose(){//关闭弹窗
-      this.$emit('update:dialogVisible',false);
+    handleClose() {//关闭弹窗
+      this.$emit('update:dialogVisible', false);
     }
   },
   watch: {
-    dialogVisible(newData,oldData){
-      if(newData){
+    dialogVisible(newData, oldData) {
+      if (newData) {
         this.tableData = []
         this.page.pageNumber = 1
         this.getTableData()
@@ -218,7 +229,7 @@ export default {
   }
   .table-box {
     height: 370px;
-    .fr{
+    .fr {
       margin-top: 10px;
     }
   }
@@ -226,17 +237,17 @@ export default {
 </style>
 
 <style>
-  .demo-table-expand {
-    font-size: 0;
-  }
-  .demo-table-expand label {
-    width: 90px;
-    color: #99a9bf;
-  }
-  .demo-table-expand .el-form-item {
-    margin-right: 0;
-    margin-bottom: 0;
-    margin-left: 120px;
-    width: 100%;
-  }
+.demo-table-expand {
+  font-size: 0;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  margin-left: 120px;
+  width: 100%;
+}
 </style>

+ 144 - 33
src/components/data_admin/buildTask/draw/drawModel.vue

@@ -1,18 +1,20 @@
 <template>
   <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-show="showTools">
+      <canvasFun @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @scale="scale" @saveJson="saveJson" :config="config" ref="canvasFun"></canvasFun>
+    </div>
   </div>
 </template>
 
 <script>
-import { SGraphyView } from "@sybotan-web/graphy/lib";
-import { DivideFloorScene } from "cad-engine"
+import { DivideFloorScene, FloorView } from "@saga-web/cad-engine/lib"
 import { SColor, SPoint } from "@sybotan-web/draw/lib";
 import canvasFun from "@/components/business_space/newGraphy/canvasFun"
-import { floorQuery } from "@/api/scan/request";
+import { floorQuery, queryEquip } from "@/api/scan/request";
 export default {
   components: {
-    
+    canvasFun
   },
   data() {
     return {
@@ -25,15 +27,31 @@ export default {
       modelId: '',
       FloorID: '',
       Outline: [],
+      deviceList: [],
+      buttonContent: "",
+      showTools: false,
+      config: {
+        isEdit: false
+      }
     };
   },
   props: {
+    isEdit: {
+      default: false
+    },
     id: {
       default: 0
     },
+    dialog: {
+      default: false
+    },
+    isLight:{
+      type: Boolean,
+      default: false
+    },
     CurrentModelId: String
   },
-  created() {},
+  created() { },
   mounted() {
     this.cadWidth = document.getElementById(`drawFloor${this.id}`).offsetWidth;
     this.cadHeight = document.getElementById(`drawFloor${this.id}`).offsetHeight;
@@ -42,26 +60,11 @@ export default {
     initGraphy(ModelId) {
       this.modelId = ModelId;
       this.clearGraphy()
-      this.scene = new DivideFloorScene();
+      this.drawMainScene = new DivideFloorScene();
       this.canvasLoading = true;
-      this.scene.getFloorData('/modelapi/base-graph/query', { ModelId: ModelId }).then(res => {
-        let Elements = res.EntityList[0].Elements;
-        let flag = false;
-        for (let key in Elements) {
-          if (Elements[key].length > 0) {
-            flag = true;
-          }
-        }
-        if (flag) {
-          this.view.scene = this.scene
-          this.view.fitSceneToView();
-          this.canvasLoading = false;
-          this.view.maxScale = this.view.scale * 10;
-          this.view.minScale = this.view.scale;
-          this.scene.click(this, this.canvasClick);
-        } else {
-          this.canvasLoading = false;
-        }
+      this.drawMainScene.getFloorData('/modelapi/base-graph/query', { ModelId: ModelId }).then(res => {
+        // console.log(this)
+        this.getGraphtSuc(res);
       })
     },
     getFloorData() {
@@ -75,10 +78,10 @@ export default {
         this.drawMainScene.addSceneMark(newArr)
       })
     },
-    getSelectedSpaces(){//获取选中区域
-      if(this.view && this.view.scene){
-        let list =  this.view.scene.getSelectedSpaces();
-        if(list.length){
+    getSelectedSpaces() {//获取选中区域
+      if (this.view && this.view.scene) {
+        let list = this.view.scene.getSelectedSpaces();
+        if (list.length) {
           return list
         } else {
           return []
@@ -94,20 +97,128 @@ export default {
         return
       }
       let id = `floorCanvas${this.id}`;
-      this.view = new SGraphyView(id)
+      this.view = new FloorView(id)
+    },
+    canvasClick(item, eventObj) {//点击平面图事件 
+      this.$emit("changeButtonContent",this.drawMainScene.getSelectedSpaces().length?"通过模型空间创建":"通过模型创建") 
+    },
+    getGraphtSuc(res) {
+      this.showTools = true;
+      this.canvasLoading = false;
+      if (res.Result == 'failure') {
+        this.showTools = false;
+        this.$message.warning(res.Message);
+        return;
+      }
+      this.view.scene = this.drawMainScene;
+      if(this.isLight){//高亮显示未验证的区块
+        this.deviceList = []
+        this.highLightPoint()
+      }
+      this.view.fitSceneToView();
+      this.drawMainScene.click(this, this.canvasClick);
+      if (this.$refs.canvasFun) {
+        this.view.maxScale = this.view.scale * 10;
+        this.view.minScale = this.view.scale;
+        this.$refs.canvasFun.everyScale = this.view.scale;
+      }
+    },
+    //高亮未完成验证的区块
+    async highLightPoint() {
+      await this.getUnverificationDevice()
+      this.view.scene.spaceList.forEach(item => {
+        for(let deviceItem of this.deviceList) {
+          if(deviceItem.LocationJson && item.contains(deviceItem.LocationJson.X, -deviceItem.LocationJson.Y)){//注:坐标体系不同,Y坐标取反
+            item.highLightFlag = true
+            break
+          }
+        }
+      })
     },
-    canvasClick(item,eventObj){//点击平面图事件
-      
+    //获取模型下未验证的设备
+    getUnverificationDevice(pageNum) {
+      return new Promise((resolve) => {
+        pageNum = pageNum ? pageNum : 1
+        let params = {
+          Filters: `TaskState isNull;ModelId='${this.CurrentModelId}'`,
+          Orders: "CreateTime desc, EquipID asc",
+          Projection: ["EquipID", "BIMID", "BIMLocation", "LocationJson"],
+          PageNumber: pageNum,
+          PageSize: 1000
+        }
+        queryEquip(params, res => {
+          this.deviceList = res.Content
+          resolve();
+        });
+      });
+      // queryEquip(params, res => {
+      //   this.deviceList = this.deviceList.concat(res.Content)
+      //   if (res.Total / (res.PageSize * res.PageNumber) > 1) {
+      //     this.getUnverificationDevice(res.PageNumber + 1)
+      //   } else { }
+      // });
+    },
+    // canvas 获取焦点
+    focus() {
+      document.getElementById(`floorCanvas${this.id}`).focus()
+    },
+    // 工具栏操作
+    // 适配底图到窗口
+    fit() {
+      this.view.fitSceneToView()
+    },
+    // 保存为png
+    savePng() {
+      this.view.saveImage(`${this.floor}.png`, 'png');
+    },
+    // 保存为svg
+    saveSvg() {
+      this.view.saveSceneSvg(`${this.floor}.svg`, 6400, 4800);
+    },
+    saveJson() {
+      this.view.saveFloorJson(`${this.floor}.json`)
+    },
+    // 缩放
+    scale(val) {
+      if (!this.view) {
+        return;
+      }
+      let scale = this.view.scale;
+      this.view.scaleByPoint(val / scale, this.cadWidth / 2, this.cadHeight / 2);
     }
   },
   watch: {
+    isLight: {
+      handler(newValue, oldValue) {
+        if(newValue){//高亮显示未验证的区块
+          this.deviceList = []
+          this.highLightPoint()
+        } else {
+          this.view.scene.spaceList.forEach(item => {
+            item.highLightFlag = false
+          })
+        }
+      }
+    },
     CurrentModelId: {
-      handler(newName, oldName){
-        if(newName){
+      handler(newName, oldName) {
+        if (newName) {
           this.initGraphy(newName)
         }
       },
       immediate: true,
+    },
+    "view.scale": {
+      handler(n) {
+        if (this.$refs.canvasFun) {
+          this.$refs.canvasFun.sliderVal = n * 10 / this.view.minScale;
+        }
+      }
+    },
+    "isEdit": {
+      handler(n) {
+        this.config.isEdit = n;
+      }
     }
   }
 };

+ 9 - 2
src/components/data_admin/buildTask/table/assetsTable.vue

@@ -42,6 +42,7 @@
 
 <script>
 import { queryAssetsTask, deleteAssetsTask, createAssetsTask, updateAssetsTask } from "@/api/data_admin/buildTaskApi"
+import tools from "@/utils/tools"
 import { mapGetters } from "vuex"
 import assetsDetail from '../detail/assetsDetail'
 export default {
@@ -180,13 +181,19 @@ export default {
     handleCurrentChange(pageNo) {
       this.page.pageNumber = pageNo;
       this.getTableData()
+    },
+    projectId() {
+      this.page.pageNumber = 1
+      this.getTableData()
     }
   },
   watch: {
     paramsData: {
       handler(newName, oldName) {
-        this.page.pageNumber = 1
-        this.getTableData()
+        if(!tools.isSimilarly(newName, oldName)){
+          this.page.pageNumber = 1
+          this.getTableData()
+        }
       },
       immediate: true,
       deep: true

+ 9 - 2
src/components/data_admin/buildTask/table/deviceTable.vue

@@ -51,6 +51,7 @@
 
 <script>
 import { queryDeviceTask, deleteDeviceTask, createDeviceTask, updateDeviceTask } from "@/api/data_admin/buildTaskApi"
+import tools from "@/utils/tools"
 import { mapGetters } from "vuex"
 import deviceDetail from '../detail/deviceDetail'
 export default {
@@ -213,11 +214,17 @@ export default {
   watch: {
     paramsData: {
       handler(newName, oldName) {
-        this.page.pageNumber = 1
-        this.getTableData()
+        if(!tools.isSimilarly(newName, oldName)){
+          this.page.pageNumber = 1
+          this.getTableData()
+        }
       },
       immediate: true,
       deep: true
+    },
+    projectId() {
+      this.page.pageNumber = 1
+      this.getTableData()
     }
   }
 };

+ 10 - 3
src/components/data_admin/buildTask/table/modelTable.vue

@@ -16,7 +16,7 @@
         </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="BIMID" label="BIM ID" show-overflow-tooltip min-width="220"></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">
           <template slot-scope="scope">
@@ -45,6 +45,7 @@
 
 <script>
 import { queryModelTask, deleteModelTask, updateModelTask, createModelTask } from "@/api/data_admin/buildTaskApi"
+import tools from "@/utils/tools"
 import { mapGetters } from "vuex"
 import deviceDetail from '../detail/deviceDetail'
 export default {
@@ -203,11 +204,17 @@ export default {
   watch: {
     paramsData: {
       handler(newName, oldName) {
-        this.page.pageNumber = 1
-        this.getTableData()
+        if(!tools.isSimilarly(newName, oldName)){
+          this.page.pageNumber = 1
+          this.getTableData()
+        }
       },
       immediate: true,
       deep: true
+    },
+    projectId() {
+      this.page.pageNumber = 1
+      this.getTableData()
     }
   }
 };

+ 9 - 2
src/components/data_admin/buildTask/table/replaceTable.vue

@@ -42,6 +42,7 @@
 
 <script>
 import { queryAssetsTask, deleteAssetsTask } from "@/api/data_admin/buildTaskApi"
+import tools from "@/utils/tools"
 import { mapGetters } from "vuex"
 import assetsDetail from '../detail/assetsDetail'
 export default {
@@ -167,11 +168,17 @@ export default {
   watch: {
     paramsData: {
       handler(newName, oldName) {
-        this.page.pageNumber = 1
-        this.getTableData()
+        if(!tools.isSimilarly(newName, oldName)){
+          this.page.pageNumber = 1
+          this.getTableData()
+        }
       },
       immediate: true,
       deep: true
+    },
+    projectId() {
+      this.page.pageNumber = 1
+      this.getTableData()
     }
   }
 };

+ 9 - 2
src/components/data_admin/buildTask/table/tearTable.vue

@@ -42,6 +42,7 @@
 
 <script>
 import { queryAssetsTask, deleteAssetsTask } from "@/api/data_admin/buildTaskApi"
+import tools from "@/utils/tools"
 import { mapGetters } from "vuex"
 import assetsDetail from '../detail/assetsDetail'
 export default {
@@ -167,11 +168,17 @@ export default {
   watch: {
     paramsData: {
       handler(newName, oldName) {
-        this.page.pageNumber = 1
-        this.getTableData()
+        if(!tools.isSimilarly(newName, oldName)){
+          this.page.pageNumber = 1
+          this.getTableData()
+        }
       },
       immediate: true,
       deep: true
+    },
+    projectId() {
+      this.page.pageNumber = 1
+      this.getTableData()
     }
   }
 };

+ 5 - 0
src/components/data_admin/buildTask/taskStatistics.vue

@@ -83,6 +83,11 @@ export default {
         this.waitReplaceCount = res.Count
       })
     }
+  },
+  watch: {
+    projectId() {
+      this.getTaskCount();
+    }
   }
 }
 </script>

+ 1 - 1
src/components/dialogs/list/firm.vue

@@ -22,7 +22,7 @@
                 <el-radio v-model="radio" :label="scope.row">{{scope.row.venderName || "--"}}</el-radio>
               </template>
             </el-table-column>
-            <el-table-column prop="brand" label="品牌" header-align='center'></el-table-column>
+            <el-table-column prop="brandName" label="品牌" header-align='center'></el-table-column>
             <el-table-column prop="name" label="型号" header-align='center'></el-table-column>
             <el-table-column label="技术参数" header-align='center'>
               <template slot-scope="scope">

+ 225 - 0
src/components/ledger/cenote/dialog/addSpaceDialog.vue

@@ -0,0 +1,225 @@
+
+<template>
+  <el-dialog :title="title" :visible.sync="dialog" :before-close="handleClose" width="900px" id="addEqDialog">
+    <el-row class="filters">
+      <el-col :span="7" style="width:268px;padding:0px;">
+        <el-input style 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;margin-left:-2px">
+        <floor-cascader ref="floorcas" @change="changeFloor"></floor-cascader>
+      </el-col>
+      <el-col :span="7.5" style="padding:0 0;">
+        <space-select ref="spacesel" @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">
+            {{scope.row.RoomLocalName||scope.row.RoomName||''}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="RoomLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
+        <el-table-column prop :label="`所属建筑楼层`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            {{ scope.row.BuildingId && floorType[scope.row.BuildingId]? ((floorType[scope.row.BuildingId] || '') + (scope.row.FloorId && floorType[scope.row.FloorId] ? (' - ' + floorType[scope.row.FloorId] || '') : '')) : ''}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="ObjectType" :label="`空间类型`" show-overflow-tooltip min-width="100">
+          <template slot-scope="scope">
+            {{spaceType[scope.row.ObjectType] || ''}}
+          </template>
+        </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="handleClose">取 消</el-button>
+      <el-button size="small" type="primary" @click="savaRelation">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import {
+  unSysZoneSpace,
+  linkSysSp,
+  queryDictionaryHead
+} 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"]),
+    dialog() {
+      return this.dialogVisible;
+    }
+  },
+  data() {
+    return {
+      title: "添加系统所在业务空间",
+      keycode: "", //输入查询条件
+      inSpaceType: "业务空间",
+      Buildfloor: ["all"], // 选中的建筑楼层
+      Spacecategory: null, // 选中的业务空间类型
+      tableData: [],
+      floorData: {}, //楼层
+      spaceData: {}, //业务空间分区
+      loading: false,
+      selections: [], // 选中项
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      headerStyle: {
+        backgroundColor: "#e1e4e5",
+        color: "#2b2b2b",
+        lineHeight: "30px"
+      } // 列表样式
+    };
+  },
+  props: {
+    params: Object, //查看的竖井关系信息
+    spaceType: Object,
+    dialogVisible: Boolean,
+    floorType: Object
+  },
+  mounted() { },
+  methods: {
+    // 显示弹窗
+    showDialog() {
+      this.dialogVisible = true;
+    },
+    //修改建筑楼层
+    changeFloor(value) {
+      this.Buildfloor = value;
+      this.getTableData();
+    },
+    //修改空间类型
+    changeSpace(value) {
+      this.Spacecategory = value;
+      this.getTableData();
+    },
+    getTableData() {
+      let params = {
+        data: {
+          Filters: "not RoomID isNull",
+          Orders: "RoomLocalName desc",
+          PageNumber: this.page.pageNumber,
+          PageSize: this.page.pageSize
+        },
+        shaftId: this.params.ShaftID,
+        sysId: this.$route.query.SysID
+      };
+      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.Spacecategory) {
+        params.data.Filters += `;ObjectType='${this.Spacecategory}'`;
+      }
+      if (this.keycode != "") {
+        params.data.Filters += `;RoomName contain '${this.keycode}' or RoomLocalName contain '${this.keycode}'`;
+      }
+
+      unSysZoneSpace(params, res => {
+        this.tableData = res.Content;
+        this.page.total = res.Total;
+      });
+    },
+    handleClose() {
+      this.$emit("update:dialogVisible", false);
+    },
+    //选中项修改
+    handleSelectionChange(val) {
+      this.selections = val;
+    },
+    savaRelation() {
+      if (this.selections.length) {
+        let params = {
+          Content: this.selections.map(item => {
+            return {
+              SpaceID: item.RoomID,
+              SysID: this.$route.query.SysID,
+              ObjectType: item.ObjectType
+            };
+          })
+        };
+        linkSysSp(params, res => {
+          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("开发中");
+    }
+  },
+  watch: {
+    dialogVisible: {
+      handler() {
+        if (this.dialogVisible) {
+          this.page.pageNumber = 1;
+          this.tableData = [];
+          this.getTableData();
+        }
+      },
+      immediate: true
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#addEqDialog {
+  .filters {
+    margin: 0 0 10px 0;
+  }
+  .table-box {
+    height: 370px;
+    .fr {
+      margin-top: 10px;
+    }
+  }
+}
+</style>

+ 9 - 4
src/components/ledger/handsontables/assets.vue

@@ -525,6 +525,7 @@ export default {
         columnSorting: true, //添加排序
         sortIndicator: true, //添加排序
         renderAllRows: true,
+        // observeChanges: false, //启用observeChanges插件
         // colWidths: 200,
         autoColumnSize: true,
         language: "zh-CN",
@@ -584,7 +585,7 @@ export default {
     },
     // 更新
     handleUpdataTable(changeData, source) {
-      if (!this.onlyRead) {
+      if (!this.onlyRead && source != 'ObserveChanges.change') {
         if (changeData) {
           let trimmedArr = this.trimmedRows();
           let param = handsonUtils.getParam(changeData, source, this.hot, trimmedArr);
@@ -903,13 +904,17 @@ export default {
     },
     //选择型号修改
     firmChange(data) {
-      tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)
-      tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brand)
+      tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)//生产商ID
+      tools.setDataForKey(this.tableData[this.row], "DPBrandID", data.brandId)//品牌ID
+      tools.setDataForKey(this.tableData[this.row], "DPSpecificationID", data.specificationId)//型号ID
+      tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brandName)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Specification", data.name)
       this.handleUpdataTable(
         [
           [this.row, "DPManufacturerID", null, data.venderId],
-          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand],
+          [this.row, "DPBrandID", null, data.brandId],
+          [this.row, "DPSpecificationID", null, data.specificationId],
+          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brandName],
           [this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]
         ],
         "edit"

+ 9 - 4
src/components/ledger/handsontables/device.vue

@@ -482,6 +482,7 @@ export default {
         columnSorting: true, //添加排序
         sortIndicator: true, //添加排序
         renderAllRows: true,
+        // observeChanges: false, //启用observeChanges插件
         // colWidths: 200,
         autoColumnSize: true,
         language: "zh-CN",
@@ -541,7 +542,7 @@ export default {
     },
     // 更新
     handleUpdataTable(changeData, source) {
-      if (!this.onlyRead) {
+      if (!this.onlyRead && source != 'ObserveChanges.change') {
         if (changeData) {
           let trimmedArr = this.trimmedRows();
           let param = handsonUtils.getParam(changeData, source, this.hot, trimmedArr);
@@ -860,13 +861,17 @@ export default {
     },
     //选择型号修改
     firmChange(data) {
-      tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)
-      tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brand)
+      tools.setDataForKey(this.tableData[this.row], "DPManufacturerID", data.venderId)//生产商ID
+      tools.setDataForKey(this.tableData[this.row], "DPBrandID", data.brandId)//品牌ID
+      tools.setDataForKey(this.tableData[this.row], "DPSpecificationID", data.specificationId)//型号ID
+      tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Brand", data.brandName)
       tools.setDataForKey(this.tableData[this.row], "LedgerParam.EquipManufactor.Specification", data.name)
       this.handleUpdataTable(
         [
           [this.row, "DPManufacturerID", null, data.venderId],
-          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brand],
+          [this.row, "DPBrandID", null, data.brandId],
+          [this.row, "DPSpecificationID", null, data.specificationId],
+          [this.row, "LedgerParam.EquipManufactor.Brand", null, data.brandName],
           [this.row, "LedgerParam.EquipManufactor.Specification", null, data.name]
         ],
         "edit"

+ 56 - 23
src/components/ledger/handsontables/system.vue

@@ -32,7 +32,20 @@
     <details-dialog :iframeSrc="iframeSrc" v-if="myDialog.details" :dialog="myDialog"></details-dialog>
     <system-relevance @close="reset" :id="systemId" :dialog="myDialog"></system-relevance>
     <!-- 不支持的输入方式 -->
-    <editSysfloor ref="editFloor" @handleClickUpdate="handleClickUpdate"></editSysfloor>
+    <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" @relateSuccess="relateSuccess"></editSysfloor>
     <!-- 新增系统 -->
     <el-dialog title="确定新增系统的类型" :visible.sync="myDialog.addDevice" width="30%">
       <el-row>
@@ -48,7 +61,7 @@
 import {
   BeatchQueryParam,
   getDataDictionary,
-  queryLinkSys,
+  querySysLinkBuild,
   updateGeneralSys,
   deleteGeneralSys
 } from "@/api/scan/request"
@@ -189,17 +202,24 @@ export default {
       this.loading = true
       if (!!this.mess.deviceId) {
         let param = {
-          PageSize: this.page.size,
-          Orders: "createTime desc, SysID desc",
-          PageNumber: this.page.currentPage,
-          Filters: `category='${this.mess.deviceId}'`
+          data: {
+            PageSize: this.page.size,
+            Orders: "createTime desc, SysID desc",
+            PageNumber: this.page.currentPage,
+            Filters: `category='${this.mess.deviceId}'`
+          }
         }
         if (this.mess.buildId == "noKnow") {
-          param.Filters += `;buildingId isNull`
+          param.buildingId = 1;
         } else if (this.mess.buildId && this.mess.buildId != "all") {
-          param.Filters += `;buildingId='${this.mess.buildId}'`
+          param.buildingId = this.mess.buildId;
+        }
+        if (this.mess.floorId == "noKnow") {
+          param.floorId = 1;
+        } else if (this.mess.floorId && this.mess.floorId != "all") {
+          param.floorId = this.mess.floorId;
         }
-        queryLinkSys(param, res => {
+        querySysLinkBuild(param, res => {
           this.loading = false;
           _this.tableData = res.Content;
           _this.copyMain = tools.deepCopy(res.Content);
@@ -284,7 +304,7 @@ export default {
       }
       if (this.showType == "all") {
         data.splice(3, 0, {
-          data: "sysInBuildFloor",
+          data: "BuildingFloorInfoList",
           renderer: text.sysInBuildFloor,
           readOnly: this.onlyRead
         })
@@ -341,7 +361,7 @@ export default {
                         item,
                         head.Path,
                         // child.error ? "表号功能号格式错误" : "表号功能号不存在"
-                        child.error ? child.value? "表号功能号格式错误" : "表号功能号不存在" : "暂未采集到实时数据"
+                        child.error ? child.value ? "表号功能号格式错误" : "表号功能号不存在" : "暂未采集到实时数据"
                       );
                     }
                   });
@@ -373,6 +393,7 @@ export default {
         columnSorting: true, //添加排序
         sortIndicator: true, //添加排序
         renderAllRows: true,
+        observeChanges: false,
         // colWidths: 200,
         autoColumnSize: true,
         language: "zh-CN",
@@ -431,7 +452,7 @@ export default {
       }
     },
     handleUpdataTable(changeData, source) {
-      if (!this.onlyRead) {
+      if (!this.onlyRead && source != 'ObserveChanges.change') {
         if (changeData) {
           let trimmedArr = this.trimmedRows();
           let param = handsonUtils.getParam(changeData, source, this.hot, trimmedArr);
@@ -517,7 +538,7 @@ export default {
           // this.$message("开发中...")
           this.$router.push({
             path: "/ledger/systemDetail",
-            query: { SysID: infos.SysID, Name: infos.SysLocalName || infos.SysName, SysType:infos.Category }
+            query: { SysID: infos.SysID, Name: infos.SysLocalName || infos.SysName, SysType: infos.Category }
           })
           return false
         //设备二维码图片
@@ -535,25 +556,37 @@ export default {
             this.myDialog.relevance = true
           }
           return false
+        case 'BuildingFloorInfoList':
+          this.$refs.editFloor.showDialog(this.tableData[row.row]);
+          return false
         default:
           break;
       }
       if (!this.onlyRead && showTools.InputModeArr.indexOf(inputMode) == '-1') {
-        // this.updateInfoPoint = val
-        // this.updateInput = tools.dataForKey(this.tableData[row.row], val)
-        // console.log("this is ",this.tableData[row.row])
-        // let floor = tools.dataForKey(this.tableData[row.row], val);
-        this.$refs.editFloor.showDialog(this.tableData[row.row]);
+        this.updateInfoPoint = val
+        this.updateInput = tools.dataForKey(this.tableData[row.row], val)
+        this.myDialog.update = true
       }
     },
+    //关闭临时维护弹窗回调
+    handleCloseUpdate() {
+      this.updateInputShow = false
+      this.updateInfoPoint = ''
+      this.updateInput = ''
+    },
     //更新临时维护信息点
     handleClickUpdate() {
       // 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 = ''
+      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 = ''
+    },
+    //关联建筑楼层成功
+    relateSuccess(data) {
+      this.getTableData()
+      // tools.setDataForKey(this.tableData[this.row], "BuildingFloorInfoList", data)
     },
     //获取被筛选掉的行号
     trimmedRows() {

+ 94 - 0
src/components/ledger/lib/buildfloorCascader.vue

@@ -0,0 +1,94 @@
+<template>
+  <el-cascader v-model="value" :options="options" :props="props" clearable ref="elCascader" @remove-tag="removeTag"></el-cascader>
+</template>
+<script>
+import { buildingQuery } from "@/api/scan/request";
+export default {
+  data() {
+    return {
+      value: [],
+      props: {
+        multiple: true,
+        checkStrictly: true,
+        value: 'BuildID',
+        label: 'BuildLocalName',
+        children: 'Floor'
+      },
+      options: []
+    }
+  },
+  props: {
+    SysID: {
+      default: ''
+    }
+  },
+  methods: {
+    getCascader() {
+      let param = {
+        Cascade: [
+          { Name: "floor", Orders: "FloorSequenceID desc" }
+        ],
+        Orders: "BuildLocalName asc",
+        PageNumber: 1,
+        PageSize: 50
+      }
+      buildingQuery(param, res => {
+        res.Content.map(t => {
+          if (t.Floor && t.Floor.length) {
+            t.Floor = t.Floor.map(item => {
+              if (item.FloorID == this.FloorID) return
+              item.BuildID = item.FloorID
+              item.BuildLocalName = item.FloorLocalName || item.FloorName
+              return item
+            }).filter(it => it)
+          }
+        })
+        this.options = res.Content
+      })
+    },
+    getSelectedNodes() {
+      let nodes = this.$refs.elCascader.getCheckedNodes();
+      let arr = [], flag = false, brr = [];
+      if (nodes.length) {
+        nodes.map(t => {
+          let obj = {
+            BuildName: t.pathLabels[0],
+            BuildID: t.path[0]
+          }
+          if (t.path.length > 1) {
+            obj.FloorName = t.pathLabels[1]
+            obj.FloorID = t.path[1]
+          } else {
+            flag = true;
+          }
+          arr.push(obj);
+        })
+        if (flag) {
+          for (let i = 0; i < arr.length; i++) {
+            for (let j = 0; j < arr.length; j++) {
+              if (!arr[i].FloorID && arr[j].FloorID && arr[i].BuildID == arr[j].BuildID) {
+                brr.push(i)
+              }
+            }
+          }
+          arr = arr.map((t, i) => {
+            if (brr.indexOf(i) > -1) {
+              return undefined;
+            }
+            return t;
+          }).filter(item => item);
+        }
+      }
+      return arr;
+    },
+    removeTag(){
+      console.log(arguments)
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+.el-cascader {
+  width: 100%;
+}
+</style>

+ 46 - 22
src/components/ledger/lib/editSysFloor.vue

@@ -1,9 +1,9 @@
 <template>
   <el-dialog title="所属建筑楼层" :visible.sync="connectDialogVis" width="50%" id="messageDialog">
     <el-row>
-      <div style="line-height:32px;">添加{{floor.SysLocalName}}所属建筑楼层 : </div>
+      <div style="line-height:32px;">添加{{system.SysLocalName}}所属建筑楼层 : </div>
       <div style="width:70%">
-        <bfCascader ref="bfCascader" :FloorID="floor.FloorID"></bfCascader>
+        <bfCascader ref="bfCascader" :SysID="system.SysID"></bfCascader>
       </div>
     </el-row>
     <span slot="footer" class="dialog-footer">
@@ -13,32 +13,35 @@
   </el-dialog>
 </template>
 <script>
-import bfCascader from '@/components/ready/buildfloor/buildfloorCascader'
-import { createRelationInFloor } from "@/api/scan/request";
+import bfCascader from './buildfloorCascader'
+import { sysRelateBuild, sysRelateFloor } from "@/api/scan/request";
+import { resolve } from 'q';
 export default {
   data() {
     return {
       buildName: '',
       connectDialogVis: false,
-      floor: {}
+      system: {}
     }
   },
   components: {
     bfCascader
   },
   methods: {
-    showDialog(floor=null) {
-      if(floor){
-        this.floor = floor
-      }
-      this.connectDialogVis = true
+    showDialog(system) {
+      this.system = system;
+      this.connectDialogVis = true;
       this.$nextTick(() => {
         this.$refs.bfCascader.getCascader()
-        let arr = this.floor.FloorThroughList || [];
+        let arr = this.system.BuildingFloorInfoList || [];
         let value = []
         if (arr.length) {
           arr.map(t => {
-            value.push([t.BuildID, t.FloorID])
+            if (t.FloorID) {
+              value.push([t.BuildID, t.FloorID]);
+            } else {
+              value.push([t.BuildID])
+            }
           })
         }
         this.$refs.bfCascader.value = value
@@ -46,25 +49,46 @@ export default {
     },
     save() {
       let arr = this.$refs.bfCascader.value;
-      let param = {
-        FloorId: this.floor.FloorID,
-        FloorOtherIdList: []
-      }
+      let buildIds = [], floorIds = [];
       arr.map(t => {
-        param.FloorOtherIdList.push(t[1])
+        if (buildIds.indexOf(t[0]) < 0) {
+          buildIds.push(t[0]);
+        }
+        if (t.length > 1 && floorIds.indexOf(t[1]) < 0) {
+          floorIds.push(t[1]);
+        }
       })
-      // createRelationInFloor(param, res => {
+      let buildPa = {
+        SysId: this.system.SysID,
+        BuildingIdList: buildIds
+      }
+      let floorPa = {
+        SysId: this.system.SysID,
+        FloorIdList: floorIds
+      }
+      let promise1 = new Promise((resolve, reject) => {
+        sysRelateBuild(buildPa, res => {
+          resolve(res);
+        })
+      })
+      let primise2 = new Promise((resolve, reject) => {
+        sysRelateFloor(floorPa, res => {
+          resolve(res);
+        })
+      })
+      let buildFloor = this.$refs.bfCascader.getSelectedNodes();
+      Promise.all([promise1, primise2]).then(res => {
         this.connectDialogVis = false;
-        this.$message.success('关联成功');
-        this.$emit('handleClickUpdate')
-      // })
+        this.$message.success("关联成功");
+        this.$emit('relateSuccess', buildFloor);
+      })
     }
   }
 }
 </script>
 <style lang="less" scoped>
 #messageDialog {
-  .el-row{
+  .el-row {
     height: 50px;
     max-height: 200px;
     overflow-y: auto;

+ 6 - 5
src/components/ledger/lib/floorCascader.vue

@@ -1,6 +1,6 @@
 <template>
     <div id="buildFloor">
-        <span class="buildFloor" style="margin-right: 12px;">建筑楼层</span>
+        <span class="buildFloor">建筑楼层</span>
         <el-cascader placeholder="请选择建筑楼层" :options="options" v-model="value" filterable size="small" :style="isWidth ? '' : 'width:160px;'" @change="changeCascader"></el-cascader>
     </div>
 </template>
@@ -149,9 +149,10 @@
     #buildFloor {
         margin-left: 10px;
         float: left;
-        .buildFloor {
-            color: #999999;
-            font-size: 14px;
-        }
+    }
+    .buildFloor {
+        color: #999999;
+        font-size: 14px;
+        margin-right: 12px;
     }
 </style>

+ 4 - 4
src/components/ledger/system/dialog/addCenoteDialog.vue

@@ -1,12 +1,12 @@
 <template>
   <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
-    <el-row class="filters" :gutter="20">
-      <el-col :span="8">
+    <el-row class="filters">
+      <el-col :span="7" style="width:268px">
         <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">
+      <el-col :span="7.5">
         <cenote-type @change="changeCenote"></cenote-type>
       </el-col>
     </el-row>
@@ -109,7 +109,7 @@ export default {
           PageSize: this.page.pageSize,
         },
         shaftId: this.params.ShaftID,
-        sysId:this.$route.query.SysID
+        sysId: this.$route.query.SysID
       }
       if (this.keycode != '') {
         params.data.Filters += `;ShaftName contain '${this.keycode}' or ShaftLocalName contain '${this.keycode}' or ShaftLocalID contain '${this.keycode}'`

+ 65 - 48
src/components/ledger/system/dialog/addEquipDialog.vue

@@ -1,14 +1,17 @@
 <template>
   <el-dialog :title="title" :visible.sync="dialogVisible" width="900px" id="addEqDialog">
     <el-row class="filters">
-      <el-col :span="8">
+      <el-col :span="7" style="width:268px">
         <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" style="padding:0 0;">
+      <el-col :span="8.5" style="padding:0 0;">
         <floor-cascader @change="changeFloor" style="margin-left:5px;"></floor-cascader>
       </el-col>
+      <el-col :span="8.5" style="padding-right:0;">
+        <myCascader @change="changeDevice" :all="true" :params="childParams"></myCascader>
+      </el-col>
     </el-row>
 
     <div class="table-box">
@@ -17,9 +20,7 @@
         <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>
+            <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>
@@ -43,7 +44,7 @@
 </template>
 
 <script>
-import { sysLinkEquip, unSysEq} from "@/api/scan/request";
+import { sysLinkEquip, unSysEq } from "@/api/scan/request";
 import floorCascader from "@/components/ledger/lib/floorCascader";
 import myCascader from "@/components/ledger/system/lib/equipType";
 import { mapGetters } from "vuex";
@@ -58,10 +59,10 @@ export default {
   data() {
     return {
       title: "添加系统内设备",
-      keycode: '', //输入查询条件
-      Buildfloor: ['all'], // 选中的建筑楼层
-      Equipcategory: null,// 选中的设备类型
-      inSpaceType: '设备',
+      keycode: "", //输入查询条件
+      Buildfloor: ["all"], // 选中的建筑楼层
+      Equipcategory: null, // 选中的设备类型
+      inSpaceType: "设备",
       dialogVisible: false,
       tableData: [],
       loading: false,
@@ -73,12 +74,19 @@ export default {
         total: 0
       },
       headerStyle: {
-        backgroundColor: '#e1e4e5',
-        color: '#2b2b2b',
-        lineHeight: '30px'
-      } // 列表样式
+        backgroundColor: "#e1e4e5",
+        color: "#2b2b2b",
+        lineHeight: "30px"
+      } // 列表样式,
     };
   },
+  computed: {
+    childParams() {
+      let temp = JSON.parse(JSON.stringify(this.params));
+      temp.SysType = null;
+      return temp;
+    }
+  },
   props: {
     type: String, //选中的tab页
     params: Object //查看的竖井关系信息
@@ -87,57 +95,58 @@ export default {
   methods: {
     //修改建筑楼层
     changeFloor(value) {
-      this.Buildfloor = value
-      this.getTableData()
+      this.Buildfloor = value;
+      this.getTableData();
     },
     // 显示弹窗
     showDialog() {
-      this.dialogVisible = true
-      this.page.pageNumber = 1
-      this.tableData = []
-      this.getTableData()
+      this.dialogVisible = true;
+      this.page.pageNumber = 1;
+      this.tableData = [];
+      this.getTableData();
     },
     getTableData() {
-      
       let params = {
         data: {
           Filters: `not EquipID isNull`,
-          Cascade: [{ Name: 'equipCategory' }],
+          Cascade: [{ Name: "equipCategory" }],
           Orders: "createTime desc, EquipID desc",
           PageNumber: this.page.pageNumber,
-          PageSize: this.page.pageSize,
+          PageSize: this.page.pageSize
         },
         shaftId: this.params.ShaftID,
-        sysId:this.$route.query.SysID
-      }
+        sysId: this.$route.query.SysID
+      };
       if (this.Buildfloor[0] == "noKnow") {
-        params.data.Filters += `;buildingId isNull`
+        params.data.Filters += `;buildingId isNull`;
       } else if (this.Buildfloor[0] && this.Buildfloor[0] != "all") {
-        params.data.Filters += `;buildingId='${this.Buildfloor[0]}'`
+        params.data.Filters += `;buildingId='${this.Buildfloor[0]}'`;
       }
       if (this.Buildfloor[1] == "noKnow") {
-        params.data.Filters += `;floorId isNull`
+        params.data.Filters += `;floorId isNull`;
       } else if (this.Buildfloor[1] && this.Buildfloor[1] != "all") {
-        params.data.Filters += `;floorId='${this.Buildfloor[1]}'`
+        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.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}'`
+        params.data.Filters += `;category='${this.Equipcategory}'`;
       }
       unSysEq(params, res => {
         res.Content.forEach(item => {
-          item.ShaftListName = ""
+          item.ShaftListName = "";
           if (item.ShaftList && item.ShaftList.length) {
             item.ShaftListName = item.ShaftList.map(shaft => {
-              return shaft.ShaftLocalName ? shaft.ShaftLocalName : shaft.ShaftName
-            }).join("、")
+              return shaft.ShaftLocalName
+                ? shaft.ShaftLocalName
+                : shaft.ShaftName;
+            }).join("、");
           }
-        })
-        this.tableData = res.Content
-        this.page.total = res.Total
-      })
+        });
+        this.tableData = res.Content;
+        this.page.total = res.Total;
+      });
     },
     //选中项修改
     handleSelectionChange(val) {
@@ -148,18 +157,23 @@ export default {
         let params = {
           SysId: this.$route.query.SysID,
           EquipIdList: this.selections.map(item => {
-            return item.EquipID
+            return item.EquipID;
           })
-        }
+        };
         sysLinkEquip(params, res => {
-          this.dialogVisible = false
-          this.$message.success('关联成功!')
-          this.$emit('refresh')
-        })
+          this.dialogVisible = false;
+          this.$message.success("关联成功!");
+          this.$emit("refresh");
+        });
       } else {
-        this.$message('请选择要关联的设备')
+        this.$message("请选择要关联的设备");
       }
     },
+    //修改设备类别
+    changeDevice(value) {
+      this.Equipcategory = value.code;
+      this.getTableData();
+    },
     //改变pagesize
     handleSizeChange(pageSize) {
       this.page.pageSize = pageSize;
@@ -172,9 +186,9 @@ export default {
     },
     // 查看详情
     toDetail() {
-      this.$message('开发中')
+      this.$message("开发中");
     }
-  },
+  }
 };
 </script>
 <style lang="less" scoped>
@@ -189,4 +203,7 @@ export default {
     }
   }
 }
+/deep/ #buildFloor .buildFloor {
+  margin: 0 5px 0 5px;
+}
 </style>

+ 19 - 50
src/components/ledger/system/dialog/addSpaceDialog.vue

@@ -1,24 +1,12 @@
 <template>
-  <el-dialog
-    :title="title"
-    :visible.sync="dialogVisible"
-    :before-close="handleClose"
-    width="900px"
-    id="addEqDialog"
-  >
-    <el-row class="filters" :gutter="20">
+  <el-dialog :title="title" :visible.sync="dialog" :before-close="handleClose" width="900px" id="addEqDialog">
+    <el-row class="filters">
       <el-col :span="7" style="width:268px;padding:0px;">
-        <el-input
-          style
-          placeholder="输入业务空间名称、本地编码进行查询"
-          v-model="keycode"
-          clearable
-          @keyup.enter.native="getTableData"
-        >
+        <el-input style 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;margin-left:5px">
+      <el-col :span="8.5" style="padding:0 0;margin-left:-2px">
         <floor-cascader ref="floorcas" @change="changeFloor"></floor-cascader>
       </el-col>
       <el-col :span="7.5" style="padding:0 0;">
@@ -27,35 +15,23 @@
     </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 :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.RoomLocalName||scope.row.RoomName||''}}</div>
+            {{scope.row.RoomLocalName||scope.row.RoomName||''}}
           </template>
         </el-table-column>
-        <el-table-column
-          prop="RoomLocalID"
-          :label="`${inSpaceType}本地编码`"
-          show-overflow-tooltip
-          min-width="100"
-        ></el-table-column>
+        <el-table-column prop="RoomLocalID" :label="`${inSpaceType}本地编码`" show-overflow-tooltip min-width="100"></el-table-column>
         <el-table-column prop :label="`所属建筑楼层`" show-overflow-tooltip min-width="100">
           <template slot-scope="scope">
-            <div>{{(floorType[scope.row.BuildingId] || '') + (floorType[scope.row.FloorID] || '') || ''}}</div>
+            {{ scope.row.BuildingId && floorType[scope.row.BuildingId]? ((floorType[scope.row.BuildingId] || '') + (scope.row.FloorId && floorType[scope.row.FloorId] ? (' - ' + floorType[scope.row.FloorId] || '') : '')) : ''}}
           </template>
         </el-table-column>
         <el-table-column prop="ObjectType" :label="`空间类型`" show-overflow-tooltip min-width="100">
           <template slot-scope="scope">
-            <div>{{spaceType[scope.row.ObjectType] || ''}}</div>
+            {{spaceType[scope.row.ObjectType] || ''}}
           </template>
         </el-table-column>
         <el-table-column prop="action" label="操作" min-width="100">
@@ -65,17 +41,9 @@
         </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>
+      <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="handleClose">取 消</el-button>
@@ -101,7 +69,10 @@ export default {
     spaceSelect
   },
   computed: {
-    ...mapGetters("layout", ["projectId"])
+    ...mapGetters("layout", ["projectId"]),
+    dialog() {
+      return this.dialogVisible;
+    }
   },
   data() {
     return {
@@ -135,7 +106,7 @@ export default {
     dialogVisible: Boolean,
     floorType: Object
   },
-  mounted() {},
+  mounted() { },
   methods: {
     // 显示弹窗
     showDialog() {
@@ -203,9 +174,7 @@ export default {
           })
         };
         linkSysSp(params, res => {
-          this.dialogVisible = false;
           this.$message.success("关联成功!");
-          this.$emit("update:dialogVisible", false);
           this.$emit("refresh");
         });
       } else {
@@ -244,7 +213,7 @@ export default {
 <style lang="less" scoped>
 #addEqDialog {
   .filters {
-    margin-bottom: 10px;
+    margin: 0 0 10px 0;
   }
   .table-box {
     height: 370px;

+ 7 - 4
src/components/ledger/system/lib/equipType.vue

@@ -79,10 +79,13 @@ export default {
         })
       })
       let promise1 = new Promise((resolve, reject) => {
-        queryPhysicsAllType(param1, res => {    
-          let tempArr = res.Content.filter(t => {
-            return t.ParentId == `${this.params.SysType}`
-          })
+        queryPhysicsAllType(param1, res => {
+          let tempArr = res.Content;
+          if (this.params.SysType) {
+            tempArr = res.Content.filter(t => {
+              return t.ParentId == `${this.params.SysType}`
+            })
+          }
           resolve(tempArr)
         })
       })

+ 12 - 36
src/components/ledger/system/table/spaceTable.vue

@@ -2,34 +2,18 @@
   <div id="eqInSp">
     <el-row>
       <el-button type="primary" @click="add">添加{{inSpaceType}}</el-button>
-      <el-tooltip
-        class="item"
-        effect="dark"
-        content="可前往“全部关系总览”中,按系统内包含的设备与空间关系计算"
-        placement="right"
-      >
+      <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 :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.RoomLocalName || scope.row.RoomName||''}}</div>
           </template>
         </el-table-column>
-        <el-table-column
-          prop="RoomLocalID"
-          :label="`${inSpaceType}本地编码`"
-          show-overflow-tooltip
-          min-width="100"
-        ></el-table-column>
+        <el-table-column prop="RoomLocalID" :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>{{ spaceType[scope.row.ObjectType]}}</div>
@@ -38,13 +22,7 @@
         <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-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain icon="el-icon-delete"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>
@@ -57,15 +35,8 @@
       </el-table>
     </div>
     <!-- 添加空间弹窗 -->
-    <addSpaceDialog
-      :dialogVisible.sync="dialogVisible"
-      ref="addSpaceDialog"
-      @refresh="getTableData"
-      :type="type"
-      :params="params"
-      :spaceType="spaceType"
-      :floorType="floorType"
-    ></addSpaceDialog>
+    <addSpaceDialog :dialogVisible.sync="dialogVisible" ref="addSpaceDialog" @refresh="refresh" :params="params" :spaceType="spaceType"
+      :floorType="floorType"></addSpaceDialog>
   </div>
 </template>
 
@@ -132,7 +103,7 @@ export default {
                 SpaceId: row.RoomID
               }
             ],
-            type:row.ObjectType
+            type: row.ObjectType
           };
           this.deleteSyInSh(params);
         })
@@ -160,6 +131,11 @@ export default {
     // 添加设备
     add() {
       this.dialogVisible = true;
+    },
+    //刷新
+    refresh() {
+      this.dialogVisible = false;
+      this.getTableData()
     }
   },
   watch: {

+ 232 - 205
src/framework/components/messagesever/index.vue

@@ -2,7 +2,7 @@
  * @Author: zhangyu
  * @Date: 2019-08-26 15:22:13
  * @Info: 
- * @LastEditTime: 2019-10-31 14:38:27
+ * @LastEditTime: 2019-11-13 15:46:29
  -->
 <template>
   <div class="notification-box" v-clickOutside="handleClose" @click="handleClickRead">
@@ -12,7 +12,9 @@
     <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>
+          <li class="noticeTab_item">消息通知
+            <!-- <span class="unread_num">1</span> -->
+          </li>
         </ul>
         <div class="noticeList_scroll">
           <el-scrollbar style="height:100%;">
@@ -20,14 +22,16 @@
               <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>
+                    <i :class="iconClassMap[item.Type]?iconClassMap[item.Type]:'msg-icon el-icon-warning warning-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 class="noticeItem_time">
+                    <span class="proname">{{item.Project[0].ProjLocalName || ''}}</span>
+                    {{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>
@@ -36,7 +40,7 @@
         </div>
         <div class="notice_operate">
           <!-- <div class="readAll">全部标为已读</div> -->
-          <div class="seeAll">查看全部<i class="iconfont icon-right"></i></div>
+          <div class="seeAll" @click="allDetails">查看全部<i class="iconfont icon-right"></i></div>
         </div>
       </div>
     </transition>
@@ -66,6 +70,9 @@ import { MQTT_SERVICE, MQTT_USERNAME, MQTT_PASSWORD } from './mqSetting'
 import { messgeCount, messgeQuery, messgeUpdateState } from '@/api/msgsever'
 
 export default {
+  components: {
+
+  },
   data() {
     return {
       client: Stomp.client(MQTT_SERVICE),
@@ -84,10 +91,10 @@ export default {
         "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 () {
+  created() {
     this.connect()
   },
   mounted() {
@@ -96,13 +103,21 @@ export default {
     Bus.$on('messageListUpdate', message => {
       this.getMessageList()
     })
+    Bus.$on('getUnreadCountUpdate', message => {
+      this.getUnreadCount()
+    })
   },
   computed: {
     ...mapGetters('layout', ['userInfo', 'projectId', 'projects', 'userId'])
   },
-  methods:{
-    getMessageList(){//获取消息列表(最新10条)
+  methods: {
+    getMessageList() {//获取消息列表(最新10条)
       let params = {
+        Cascade: [
+          {
+            Name: "project"
+          }
+        ],
         Filters: `UserId='${this.userId}'`,
         Orders: "CreateTime desc, Id asc",
         PageNumber: 1,
@@ -112,7 +127,7 @@ export default {
         this.messageList = res.Content
       })
     },
-    getUnreadCount(){//获取未读消息的数量
+    getUnreadCount() {//获取未读消息的数量
       let params = {
         Filters: `Read=false;UserId='${this.userId}'`
       }
@@ -120,17 +135,17 @@ export default {
         this.unreadNum = res.Count
       })
     },
-    setAllRead(){//将当前角色消息全部置为已读
-      if(this.userId){
-        messgeUpdateState({Read:true,UserId:this.userId}, res => {this.unreadNum = 0})
+    setAllRead() {//将当前角色消息全部置为已读
+      if (this.userId) {
+        messgeUpdateState({ Read: true, UserId: this.userId }, res => { this.unreadNum = 0 })
       }
     },
-    handleClose(e){//关闭消息列表
+    handleClose(e) {//关闭消息列表
       this.noticeListShow = false
     },
     handleClickRead() {//点击消息铃铛
-      this.noticeListShow?this.noticeListShow=false:this.noticeListShow=true
-      if(this.noticeListShow){
+      this.noticeListShow ? this.noticeListShow = false : this.noticeListShow = true
+      if (this.noticeListShow) {
         this.setAllRead()//将当前角色消息全部置为已读
       }
     },
@@ -170,7 +185,7 @@ export default {
     },
     //断开连接
     disconnect() {
-      this.client.disconnect(function() {
+      this.client.disconnect(function () {
         console.log("连接已断开!");
       })
     },
@@ -178,7 +193,7 @@ export default {
     send(destination, message, headers = {}) {
       this.client.send(destination, headers, JSON.stringify(message))
     },
-    
+
     handleClickConnectMQ() {//连接MQ
       this.connect()
     },
@@ -189,213 +204,225 @@ export default {
       this.unsubscribe()
     },
     handleClickSendMessage() {//发送消息
-      this.send('/topic/datacenter.broadcast',this.sendMessage)
+      this.send('/topic/datacenter.broadcast', this.sendMessage)
+    },
+    allDetails() {
+      this.noticeListShow = false;
+      this.$router.push({ path: "/allDetails" });
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
-  .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;
+.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;
-      width: 272px;
-      height: 362px;
-      box-shadow: 0 1px 6px 0 #ccc;
-      color: #333;
-      background: #fff;
-      overflow: visible!important;
+      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);
+      }
     }
-    .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;
+    .active {
+      box-shadow: 0 -2px 0 0 #5182e4 inset;
     }
-    .noticeTab {
-      padding: 8px 16px 0;
-      z-index: 10;
-      height: 32px;
+  }
+  .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;
-      box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
-      .noticeTab_item {
+      .noticeItem_box {
         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;
+        .noticeItem_text {
+          color: rgba(10, 18, 32, 0.87);
+          font-weight: 700;
+          padding-left: 18px;
+          text-indent: -6px;
           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;
-            }
+          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;
           }
-          .noticeItem_time {
-            font-size: 12px;
-            height: 19px;
-            line-height: 19px;
-            color: rgba(10, 18, 32, 0.46);
-            margin-top: 4px;
-            padding-left: 18px;
+          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;
+          .proname{
+            float: left;
+            display: block;
+            width: 80px;
+            overflow: hidden;
+            white-space: nowrap;
+            text-overflow: ellipsis;
           }
         }
-      }
-      .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;
-      }
+    .noticeList_item:hover {
+      background-color: #f5f7f7;
     }
-    .el-icon-message-solid{
-      font-size: 22px;
+    .noticeList_item:after {
+      content: "";
+      display: block;
+      height: 0;
+      clear: both;
+      visibility: hidden;
     }
-    /deep/ .el-badge__content{
-      height: 16px;
-      line-height: 16px;
-      border: 1px solid transparent;
+    .noticeList_item:before {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      height: 1px;
+      padding: 0 16px;
+      background-color: #ebebeb;
+      content: "";
+      background-clip: content-box;
     }
   }
-  .notification-box:hover{
-    color: #d3d8e2;
-    background-color: #3f4f62;
-  }
-  .success-color{
-    color: #67C23A;
-  }
-  .error-color{
-    color: #F56C6C;
+  .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;
+    }
   }
-  .warning-color{
-    color: #E6A23C;
+  .el-icon-message-solid {
+    font-size: 22px;
   }
-  .info-color{
-    color: #909399;
+  /deep/ .el-badge__content {
+    height: 16px;
+    line-height: 16px;
+    border: 1px solid transparent;
   }
+}
+.notification-box:hover {
+  color: #d3d8e2;
+  background-color: #3f4f62;
+}
+.success-color {
+  color: #67c23a;
+}
+.error-color {
+  color: #f56c6c;
+}
+.warning-color {
+  color: #e6a23c;
+}
+.info-color {
+  color: #909399;
+}
 </style>

+ 209 - 0
src/framework/components/messagesever/msgAllDetails.vue

@@ -0,0 +1,209 @@
+  <template>
+  <div class="box">
+    <div class="condition">
+      <div class="main" :style="tableData && tableData.length?'height: calc(100% - 50px);':'height: calc(100% - 46px);'">
+        <el-table ref="multipleTable" :data="tableData" v-loading='loading' stripe height="100%" :header-cell-style="headerStyle"
+          @expand-change="changeMessageState">
+          <el-table-column type="selection" width="55"></el-table-column>
+          <el-table-column width="25">
+            <template slot-scope="scope">
+              <el-badge class="item" type="warning" is-dot v-if="!scope.row.Read"></el-badge>
+            </template>
+          </el-table-column>
+          <el-table-column prop="Title" label="标题内容" min-width="300" show-overflow-tooltip></el-table-column>
+          <el-table-column label="项目">
+            <template slot-scope="scope">
+              {{ scope.row.Project[0].ProjLocalName }}
+            </template>
+          </el-table-column>
+          <el-table-column label="模块" width="200">
+            <template slot-scope="scope">
+              {{ moduleMap[scope.row.Module]?moduleMap[scope.row.Module]:scope.row.Module }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="CreateTime" label="消息时间">
+          </el-table-column>
+          <el-table-column label="消息类型">
+            <template slot-scope="scope">
+              <div>
+                <i :class="iconClassMap[scope.row.Type]?iconClassMap[scope.row.Type]:'msg-icon el-icon-warning warning-color'" style="font-size:14px;"></i>
+                <span>{{ typeMap[scope.row.Type]?typeMap[scope.row.Type]:scope.row.Type }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column type="expand">
+            <template slot-scope="scope">
+              <p>{{ scope.row.Content.Message }}</p>
+              <el-link v-for="(btn, index) in scope.row.Content.ButtonList" style="float:left;font-size:12px;color:white;width:"
+                :key="index" :href="`/image-service/common/file_get?systemId=revit&key=${btn.Url}`" :download="btn.FileName?btn.FileName:''">
+                {{btn.Name}}
+              </el-link>
+            </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>
+      <el-pagination class="right" v-show="tableData && tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="page.pageNumber" :page-sizes="page.pageSizes" :page-size="page.pageSize" layout="total, sizes, prev, pager, next, jumper"
+        :total="page.total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+  <script>
+import { mapGetters } from 'vuex'
+import { messgeQuery, messgeUpdate } from '@/api/msgsever'
+import Bus from '@/utils/bus.js'
+
+export default {
+  data() {
+    return {
+      tableData: [],
+      loading: false,
+      page: {
+        pageSize: 50,
+        pageSizes: [10, 20, 50, 100],
+        pageNumber: 1,
+        total: 0
+      },
+      headerStyle: {// 列表样式
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      }, 
+      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",
+      },
+      typeMap: { //消息类型文字映射
+        "Success": "成功",
+        "Error": "错误",
+        "Warning": "警告",
+        "Info": "提醒",
+      }
+    }
+  },
+  computed: {
+    ...mapGetters('layout', ['userId'])
+  },
+  mounted() {
+    this.getTableData();
+  },
+  methods: {
+    // 获取列表数据
+    getTableData() {
+      let params = {
+        Cascade: [
+          {
+            Name: "project"
+          }
+        ],
+        Filters: `UserId='${this.userId}'`,
+        Orders: "CreateTime desc, Id asc",
+        PageNumber: this.page.pageNumber,
+        PageSize: this.page.pageSize
+      }
+      this.loading = true;
+      messgeQuery(params, res => {
+        this.tableData = res.Content;
+        this.page.total = res.Total;
+        this.loading = false;
+      })
+    },
+    // 切换每页显示数量
+    handleSizeChange(val) {
+      this.page.pageSize = val;
+      this.getTableData();
+    },
+    // 切换页码
+    handleCurrentChange(val) {
+      this.page.pageNumber = val;
+      this.getTableData();
+    },
+    // 更新消息状态:已读、未读
+    changeMessageState(val) {
+      if(!val.Read){
+        val.Read = true;
+        let params = {
+          Content: [{
+            Id: val.Id,
+            Read: true
+          }]
+        }
+        messgeUpdate(params, res => { 
+          Bus.$emit('getUnreadCountUpdate')
+        });// 展开更新为已读状态,未读数量同步变更
+      }
+    }
+  }
+};
+  </script>
+
+<style scoped lang='less'>
+.box {
+  .condition {
+    padding: 10px;
+    display: flex;
+    height: 100%;
+    flex-direction: column;
+    border: 1px solid #dfe6ec;
+    background: #fff;
+    .main {
+      margin-top: 10px;
+      a{
+        text-decoration: none;
+      }
+    }
+  }
+}
+.el-badge.item {
+  height: 10px;
+}
+.el-table__expanded-cell {
+  p {
+    margin-left: 40px;
+  }
+}
+.el-link {
+  margin: 20px 0 0 40px;
+  background: #409eff;
+  border-radius: 3px;
+  padding: 3px 15px;
+}
+.demo-table-expand {
+  font-size: 0;
+}
+.demo-table-expand label {
+  width: 90px;
+  color: #99a9bf;
+}
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  margin-left: 120px;
+  width: 100%;
+}
+.success-color {
+  color: #67c23a;
+}
+.error-color {
+  color: #f56c6c;
+}
+.warning-color {
+  color: #e6a23c;
+}
+.info-color {
+  color: #909399;
+}
+</style>

+ 15 - 11
src/framework/layout/layout-store.js

@@ -62,22 +62,22 @@ export default {
         setSidebarSelected: (state, val) => {
             state.sidebarSelected = val
             storage.set(KEY_MENU_SELECTED, val)
-            lStorage.set('screen_data', {path: val,data: {}})
+            lStorage.set('screen_data', { path: val, data: {} })
         },
         setprojectId: (state, val) => {
-            let cacheInfo = lStorage.get('cacheInfo')?lStorage.get('cacheInfo'):{}
+            let cacheInfo = lStorage.get('cacheInfo') ? lStorage.get('cacheInfo') : {}
             state.projectId = val
             localStorage.setItem('projectId', val)
-            if(cacheInfo[state.userInfo.userName]){
+            if (cacheInfo[state.userInfo.userName]) {
                 cacheInfo[state.userInfo.userName].projectId = val
                 lStorage.set('cacheInfo', cacheInfo)
             } else {
-                cacheInfo[state.userInfo.userName] = {projectId: val}
+                cacheInfo[state.userInfo.userName] = { projectId: val }
                 lStorage.set('cacheInfo', cacheInfo)
             }
             storage.set(KEY_PROJECT_SELECTED, val)
-            state.projects.map((item) =>{
-                if(item.id == val) {
+            state.projects.map((item) => {
+                if (item.id == val) {
                     state.secret = item.pwd
                 }
             })
@@ -100,21 +100,21 @@ export default {
                         }
                         state.projects = []
                         if (resp.Projects) {
-                            if(resp.Projects[0] && resp.Projects[0].ProjId) {
+                            if (resp.Projects[0] && resp.Projects[0].ProjId) {
                                 state.projectId = resp.Projects[0].ProjId
-                                state.secret = resp.Projects[0].Secret?resp.Projects[0].Secret:""
+                                state.secret = resp.Projects[0].Secret ? resp.Projects[0].Secret : ""
                             }
                             resp.Projects.forEach(proj =>
                                 state.projects.push({
                                     id: proj.ProjId,
                                     name: proj.ProjLocalName,
-                                    pwd: proj.Secret?proj.Secret:""
+                                    pwd: proj.Secret ? proj.Secret : ""
                                 })
                             )
                         }
                     } else {
                         state.userInfo = null
-                       
+
                     }
                     resolve(resp)
                 })
@@ -122,7 +122,11 @@ export default {
         },
         setBreadcrumb: {
             root: true,
-            handler({ state }, val) {
+            handler({ state, commit }, val) {
+                let label = val[0].label;
+                if (label === "消息中心") {
+                    commit("setSidebarSelected", "message"); // 当进入消息中心页面的时候不选中导航栏
+                }
                 state.breadcrumb = []
                 state.breadcrumb = val
                 storage.set(KEY_PAGE_BRANDCRUMB, val)

+ 28 - 14
src/router/system.js

@@ -1,4 +1,5 @@
 import LayoutMain from '@/framework/layout/Main'
+import MsgAllDetails from "@/framework/components/messagesever/msgAllDetails"
 
 import Login from '@/framework/layout/Login'
 import Dasboard from '@/views/dasboard'
@@ -55,8 +56,8 @@ import partsadd from '@/views/ledger/facility/partsmanage/addparts'
 import deviceadd from '@/views/ledger/facility/addfacility'
 import propertyadd from '@/views/ledger/property/addproperty'
 import propertyLedger from '@/views/ledger/property'
-import spacelist from '@/views/ledger/spacelist'//业务空间台账
-import addPropertys from '@/views/ledger/property/addpropertys'//根据未关联资产的设备或部件批量创建设备
+import spacelist from '@/views/ledger/spacelist' //业务空间台账
+import addPropertys from '@/views/ledger/property/addpropertys' //根据未关联资产的设备或部件批量创建设备
 import batchlinkAssets from '@/views/ledger/facility/batchlink' //批量关联资产
 import cenotelist from '@/views/ledger/cenotelist' //竖井清单
 import cenoteadd from '@/views/ledger/cenotelist/cenoteadd' //添加竖井
@@ -67,6 +68,7 @@ import dataReport from '@/views/ledger/report'
 import auth from '@/views/system/auth'
 import noUser from '@/views/system/nouser'
 import spaceDetail from '@/views/ledger/spacelist/spaceDetail'
+import relatedSpace from '@/views/ledger/cenotelist/relatedSpace'
 
 /**  关系维护并计算 */
 import maintain from '@/views/relation/maintain'
@@ -85,25 +87,32 @@ import dataUtil from '@/views/business_space/dataUtil'
 
 /**市场及商务 */
 const OwnerManage = () =>
-    import('@/views/market/owner/manage')
+    import ('@/views/market/owner/manage')
 
-export default [
-    { path: '/', name: '', component: LayoutMain, children: [{ path: '', name: 'blank', component: Dasboard }] },
+export default [{
+        path: '/',
+        name: '',
+        component: LayoutMain,
+        children: [
+            { path: '', name: 'blank', component: Dasboard },
+            { path: 'allDetails', name: "allDetails", component: MsgAllDetails, meta: { keepAlive: false, breadcrumbs: [{ label: '消息中心' }] } }
+        ]
+    },
     //{ path: '/login', name: 'Login', component: Login },
     { path: '/auth', name: 'auth', component: auth },
     { path: '/noUser', name: 'noUser', component: noUser },
     // 业务空间数据导入工具
-    { path: '/dataUtil', name: 'dataUtil', component: LayoutMain,children:[{path:'index',component: dataUtil}] },
+    { path: '/dataUtil', name: 'dataUtil', component: LayoutMain, children: [{ path: 'index', component: dataUtil }] },
     // 辅助屏
     {
-        path: '/splitScreen', 
-        name: 'splitScreen', 
+        path: '/splitScreen',
+        name: 'splitScreen',
         component: splitScreen,
         children: [
-            {path: 'spaceledger', name: 'spaceLedger', component: spaceLedger},
-            {path: 'integrateresults', name: 'integrateResults', component: integrateResults}
+            { path: 'spaceledger', name: 'spaceLedger', component: spaceLedger },
+            { path: 'integrateresults', name: 'integrateResults', component: integrateResults }
         ]
-     },
+    },
     // 平台管理
     {
         path: '/platform',
@@ -125,7 +134,7 @@ export default [
             // { 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:'平面图维护' }] }}
+            { path: 'repetitionGraphy', name: 'repetitionGraphy', component: repetitionGraphy, meta: { keepAlive: false, breadcrumbs: [{ label: '建筑楼层管理', path: '/ready/buildfloor' }, { label: '平面图维护' }] } }
         ]
     },
     //模型管理
@@ -337,7 +346,7 @@ export default [
                 path: 'systemDetail',
                 name: 'systemDetail',
                 component: systemDetail,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '系统台账', path: '/ledger/facility' }, { label: '系统详情'}] }
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '系统台账', path: '/ledger/facility' }, { label: '系统详情' }] }
             },
             {
                 path: 'systemadd',
@@ -355,7 +364,7 @@ export default [
                 path: 'spaceDetail',
                 name: 'spaceDetail',
                 component: spaceDetail,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '业务空间台账',path: '/ledger/spacelist' }, {label:'业务空间详情'}] }
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '业务空间台账', path: '/ledger/spacelist' }, { label: '业务空间详情' }] }
             },
             {
                 path: 'cenotelist',
@@ -374,6 +383,11 @@ export default [
                 name: 'cenoteDetail',
                 component: cenoteDetail,
                 meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '竖井台账', path: '/ledger/cenotelist' }, { label: '竖井关系详情' }] }
+            }, {
+                path: 'relatedSpace',
+                name: 'relatedSpace',
+                component: relatedSpace,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '竖井台账', path: '/ledger/cenotelist' }, { label: '竖井关联的元空间' }] }
             },
             {
                 path: 'rentlist',

+ 11 - 19
src/utils/handsontable/mainText.js

@@ -102,27 +102,19 @@ const text = {
         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
-                        }
-                    }
+            let text = ""
+            for (let i = 0; i < value.length; i++) {
+                if(value[i].BuildID && value[i].FloorID){
+                    text += `${value[i].BuildLocalName || value[i].BuildName}-${value[i].FloorLocalName || value[i].FloorName }、`
+                } else {
+                    text += `${value[i].BuildLocalName || value[i].BuildName}、`
                 }
-                td.innerHTML = text.substring(0, 40) + "..."
             }
+            text = text.substring(0,text.length-1);
+            if(text.length>15){
+                text = text.substring(0,15)+ "...";
+            }
+            td.innerHTML = text;
         } else {
             td.innerHTML = "无所属建筑楼层"
         }

+ 27 - 0
src/utils/tools.js

@@ -34,4 +34,31 @@ tools.deepCopy = (obj) => {
     return temp
 }
 
+//判断watch监听的值是否相同
+tools.isSimilarly = (newValue, oldValue) => {
+    if(typeof newValue === typeof oldValue){
+        if(newValue === oldValue){
+            return true
+        } else {
+            let flag = false
+            try {
+                Object.keys(newValue).forEach((item, index, arr) => {
+                    if(oldValue.hasOwnProperty(item) && newValue[item] === oldValue[item]){
+                        if(index == arr.length-1){
+                            flag = true
+                        }
+                    } else {
+                        throw new Error()
+                    }
+                })
+            } catch (error) {
+                return false
+            }
+            return flag
+        }
+    } else {
+        return false
+    }
+}
+
 export default tools

+ 1 - 1
src/views/data_admin/buildTask/addTask/addAssetsTask.vue

@@ -211,7 +211,7 @@ export default {
       }
       createAssetsTask(param, res => {
         this.$message.success("创建成功!")
-        this.$router.push({ name: "buildTask" })
+        this.$router.push({ name: "buildTask",query:{ newTaskTypes:this.$route.query.newTaskTypes } })
       })
     }
   }

+ 10 - 9
src/views/data_admin/buildTask/addTask/addDeviceTask.vue

@@ -23,15 +23,17 @@
               </el-form>
             </template>
           </el-table-column>
-          <el-table-column label="所属建筑楼层" width="200">
-            <template slot-scope="scope">
+          <el-table-column label="所属建筑楼层" width="200"></el-table-column>
+          <el-table-column prop="EquipLocalName" label="设备本地名称" show-overflow-tooltip>
+             <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:'':''}}
+                {{scope.row.EquipLocalName}}
+                <el-badge v-if="scope.row.Component&&scope.row.Component.length?true:false" 
+                  :value="scope.row.Component&&scope.row.Component.length?scope.row.Component.length:0" class="item" type="warning">
+                </el-badge>
               </div>
-          </template>
+            </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="EquipCategory.EquipName" label="设备类"></el-table-column>
           <el-table-column prop="LedgerParam.Siteinstall.InstallLocation" label="安装位置"></el-table-column>
@@ -109,6 +111,7 @@ export default {
   },
   created() {
     this.params = this.$route.query
+    console.log(this.params)
   },
   mounted() {
     this.getTableData()
@@ -228,7 +231,6 @@ export default {
       } else if (this.params.floorId && this.params.floorId != "all") {
         params.Filters += `;FloorId='${this.params.floorId}'`
       }
-
       return params
     },
     //选择的设备或部件
@@ -242,7 +244,6 @@ export default {
     },
     //切换页数
     handleCurrentChange(val) {
-      this.page.pageNumber = 1
       this.page.pageNumber = val
       this.getTableData()
     },
@@ -256,7 +257,7 @@ export default {
       }
       createDeviceTask(param, res => {
         this.$message.success("创建成功!")
-        this.$router.push({ name: "buildTask" })
+        this.$router.push({ name: "buildTask",query:{ newTaskTypes:this.$route.query.newTaskTypes } })
       })
     }
   }

+ 12 - 4
src/views/data_admin/buildTask/addTask/addModelTask.vue

@@ -4,7 +4,8 @@
       <el-button style="float:left;margin-right:20px;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
       <model-folder ref="modelFolder" @change="handleChangeModelFolder" style="margin-right:10px;"></model-folder>
       <my-cascader :isWidth="false" ref="cascader" @change="changeDevice"></my-cascader>
-      <el-button style="float:right;margin-top:1px;" @click="handleClickCreate">创建所选</el-button>
+      <el-button style="float:right;margin-top:1px;" @click="handleClickCreate">{{buttonContent}}</el-button>
+      <el-switch v-show="CurrentModelId" style="float:right;margin-top:7px;margin-right:20px;" v-model="isLight" active-text="高亮显示未完成验证的区块"></el-switch>
     </div>
     <el-row>
       <div class="l-list">
@@ -18,10 +19,10 @@
         </div>
       </div>
       <div class="r-model">
-        <draw-model ref="drawModel" :id="1" :CurrentModelId="CurrentModelId"></draw-model>
+        <draw-model ref="drawModel" :id="1" :CurrentModelId="CurrentModelId" :isLight="isLight" @changeButtonContent="changeButtonContent"></draw-model>
       </div>
     </el-row>
-    <modelTask-dialog :dialogVisible.sync="dialogVisible" :params="params"></modelTask-dialog>
+    <modelTask-dialog :dialogVisible.sync="dialogVisible" :params="params" :newTaskTypes="newTaskTypes"></modelTask-dialog>
   </div>
 </template>
 
@@ -42,6 +43,7 @@ export default {
   },
   data() {
     return {
+      isLight: false,//是否高亮未完成验证区块
       query: {},//query信息
       dialogVisible: false,//是否显示弹窗
       modelFolderName: '',//模型文件夹名字
@@ -50,7 +52,9 @@ export default {
       modelFileList: [],
       CurrentModelId: '',//模型文件id
       device: '',//设备类别
-      spaceList: []//选中的空间
+      spaceList: [],//选中的空间
+      newTaskTypes: [],
+      buttonContent: "通过模型创建",// 按钮文案
     };
   },
   computed: {
@@ -112,6 +116,7 @@ export default {
       this.CurrentModelId = file.CurrentModelId
       this.modelFolderId = file.FolderId
       this.modelFileName = file.FloorName
+      this.newTaskTypes = this.$route.query.newTaskTypes
     },
     changeDevice(val){//切换设备类别
       this.device = val.code
@@ -125,6 +130,9 @@ export default {
         return item.data.SourceId
       })
       this.dialogVisible = true
+    },
+    changeButtonContent(val){// 通过判断是否选中模型空间调整文案
+      this.buttonContent = val;
     }
   },
   watch: {

+ 9 - 5
src/views/data_admin/buildTask/index.vue

@@ -21,7 +21,7 @@
 			<tear-table v-else-if="taskType == 'tear'"></tear-table>
 			<replace-table v-else-if="taskType == 'replace'"></replace-table>
 		</div>
-		<add-task :addTaskDialog.sync="addTaskDialog"></add-task>
+		<add-task :addTaskDialog.sync="addTaskDialog" :newTaskTypes="newTaskTypes"></add-task>
 	</div>
 </template>
 
@@ -94,14 +94,18 @@ export default {
 			deviceCategory: '',//设备-设备类型
 			family: '',//设备族
 			buildfloor: ['all'],//建筑楼层
-			taskTypes: ['verification','model'],
+			taskTypes: [],
 			addTaskDialog: false, //是否显示添加任务弹窗
+			newTaskTypes:''
     }
-  },
-  mounted() { },
+	},
+	created(){
+		this.$route.query.newTaskTypes?this.newTaskTypes = this.$route.query.newTaskTypes:this.newTaskTypes = ['verification','model']
+		this.taskTypes = this.newTaskTypes
+	},
   methods: {
 		handleChangeTask(val){//切换任务类型
-			
+			this.newTaskTypes = val
 		},
 		handleChangeModel(val) {//修改模型文件
 			if(val[1]){

+ 4 - 27
src/views/ledger/cenotelist/index.vue

@@ -25,24 +25,6 @@
       <div class="tableLeft" v-show="tableData && tableData.length">
         <handson-table ref="table"></handson-table>
       </div>
-      <div class="tableRight">
-        <div v-show="isTableRightShow">
-          <div class="table_right_box"><span class="iconfont close_right" @click="handleCloseRight">&#xe66b;</span></div>
-          <h5>管理需要关联的元空间</h5>
-          <p style="margin-bottom: 10px;">以下为关联的元空间id</p>
-          <el-input
-            type="textarea"
-            :autosize="{ minRows: 6, maxRows: 10}"
-            :disabled="onlyRead"
-            placeholder="请输入元空间id,以“,”分割"
-            v-model="spaceList">
-          </el-input>
-          <el-row class="right" v-show="!onlyRead">
-            <el-button @click="handleCloseRight">取消</el-button>
-            <el-button @click="saveSpaceList" type="primary">保存</el-button>
-          </el-row>
-        </div>
-      </div>
     </div>
     <el-pagination
       class="right"
@@ -75,7 +57,6 @@ import tools from "@/utils/scan/tools"
 import handsonUtils from "@/utils/hasontableUtils"
 import showTools from "@/utils/handsontable/notShow"
 import text from "@/utils/handsontable/mainText"
-
 import cenoteType from "@/components/ledger/lib/cenoteType";
 import handsonTable from "@/components/common/handsontable";
 import { getDataDictionary, getCenoteTableData, updataCenoteTableData, deleteCenoteTableData, saveCenoteRelateSpace, BeatchQueryParam } from "@/api/scan/request"
@@ -89,7 +70,6 @@ export default {
     return {
       cenoteId: "",//竖井类型id
       shaftId: "",//要操作的竖井id
-      isTableRightShow: false,
       spaceList: "",
       options: [{
         value: true,
@@ -297,11 +277,6 @@ export default {
       this.cenoteId = value.Id
       this.getTableHeader()
     },
-    //关闭右侧关联元空间输入按钮
-    handleCloseRight() {
-      this.isTableRightShow = false
-      this.spaceList = ""
-    },
     //切换每页显示多少条数据
     handleSizeChange(val) {
       this.page.pageSize = val
@@ -372,8 +347,10 @@ export default {
       this.shaftId = infos.ShaftID //要操作的数据id
       //点击关联的元空间
       if (val === "SpaceCount") {
-        this.spaceList = infos.SpaceList
-        this.isTableRightShow = true
+        this.$router.push({
+          path:'/ledger/relatedSpace',
+          query:{ShaftId: this.shaftId,name:name,onlyRead:this.onlyRead}
+        })
         return false
       } else if (val === "OtheRelations") {
         this.$router.push({

+ 260 - 0
src/views/ledger/cenotelist/relatedSpace.vue

@@ -0,0 +1,260 @@
+<template>
+  <div id="relatedSpace">
+    <div class="condition">
+      <div class="header">
+        <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
+        <span style="float:left;">{{ cenoteObj.name || '' }}</span>
+        <div class="edit-tool" v-if="!cenoteObj.onlyRead">
+          <el-button v-if="isMyTab == 2" size="small" style="float:right" @click="dialogVisible = true">添加</el-button>
+          <div v-else>
+            <el-button v-show="!isEdit" @click="isEdit = true" size="small" style="float:right">编辑</el-button>
+            <el-button v-show="isEdit" size="small" style="float:right">保存</el-button>
+            <el-button v-show="isEdit" size="small" @click="isEdit = false" style="float:right">取消</el-button>
+          </div>
+          <addSpaceDialog :dialogVisible.sync="dialogVisible" ref="addSpaceDialog" @refresh="refresh" :params="cenoteObj" :spaceType="spaceType" :floorType="floorType"></addSpaceDialog>
+        </div>
+        <space-select @change="changeSpace"></space-select>
+      </div>
+      <div class="saga-build-tab">
+        <el-radio-group v-model="isMyTab" @change="changeRadio" style="width: 136px;">
+          <el-radio-button label="1">平面图</el-radio-button>
+          <el-radio-button label="2" class="space-own-radio" style="width: 68px;">列表</el-radio-button>
+        </el-radio-group>
+      </div>
+      <div v-show="isMyTab == 1" class="data-item">
+        <el-select v-model="building" placeholder="请选择建筑" @change="changeBuilding">
+          <el-option v-for="item in buildingList" :key="item.value" :label="item.BuildLocalName" :value="item.BuildID"></el-option>
+        </el-select>
+        <div style="height:calc(100% - 42px);margin:10px 0 0 0;width:100%;position:relative;">
+          <el-scrollbar style="height:100%;width:149px;border-right:1px solid;margin:0px;">
+          <div class="floor" style="width:149px;height:100%;">
+            <span class="floor-item">楼 层</span>
+            <div v-if="building">
+            <span class="floor-item" @click="changeFloor(item.FloorID)" :class="{floorItemChoose:(item.FloorID == floor)}" v-for="item in buildingObj.Floor" :key="item.FloorID">{{ item.FloorLocalName }}</span>
+            </div>
+          </div>
+          </el-scrollbar>
+        </div>
+      </div>
+      <div v-show="isMyTab == 2" class="data-item">
+        <related-spaceList :space="space" ref="spacelist"></related-spaceList>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import spaceSelect from "@/components/ledger/lib/spaceSelect";
+import relatedSpaceList from "@/views/ledger/cenotelist/relatedSpaceList";
+import addSpaceDialog from '@/components/ledger/cenote/dialog/addSpaceDialog';
+import { queryDictionaryHead, buildingQuery } from '@/api/scan/request'
+export default {
+  data() {
+    return {
+      isMyTab: 1,//默认平面图
+      isEdit: false,//是否正在编辑
+      building: '',//当前建筑id
+      buildingObj:{},//当前建筑obj
+      buildingList: [],
+      space: '',//当前业务空间
+      floor: '',//当前楼层
+      dialogVisible: false,//添加空间弹窗
+      spaceType: {},//空间种类
+      floorType: {},//子组件楼层信息
+    }
+  },
+  computed: {
+    cenoteObj() {
+      return this.$route.query;
+    }
+  },
+  props: {
+
+  },
+  components: {
+    spaceSelect,
+    relatedSpaceList,
+    addSpaceDialog
+  },
+  created() {
+    this.load();
+    let pa = {
+      Filters: `parentId='Space'`
+    }
+    queryDictionaryHead(pa, res => {
+      res.Content.map(t => {
+        if (t.Name != "元空间") {
+          this.spaceType[t.Code] = t.Name;
+        }
+      })
+    });
+
+    let param = {
+      Cascade: [
+        { Name: "floor" }
+      ]
+    };
+    buildingQuery(param, res => {
+      this.buildingList = res.Content;
+      if(this.buildingList.length > 0){
+        this.building = this.buildingList[0].BuildID;
+        this.buildingObj = this.buildingList[0];
+        if(this.buildingObj.Floor.length > 0){
+          this.floor = this.buildingObj.Floor[0].FloorID;
+        }
+      }
+      res.Content.map(item => {
+        if (item.BuildID && item.BuildLocalName) {
+          this.floorType[item.BuildID] = item.BuildLocalName;
+          if (item.Floor instanceof Array) {
+            item.Floor.map(f => {
+              if (f.FloorID && f.FloorLocalName) {
+                this.floorType[f.FloorID] = f.FloorLocalName;
+              }
+            })
+          }
+        }
+      });
+    });
+  },
+  methods: {
+    //更改业务空间类型
+    changeSpace(val) {
+      this.space = val;
+      this.load();
+    },
+    //加载数据
+    load() {
+      if (this.isMyTab == 1) {
+
+      }
+      else {
+        this.$refs.spacelist.getSpaceList();
+      }
+    },
+    //更换建筑
+    changeBuilding(bid){
+      this.buildingList.map(item => {
+        if(item.BuildID == bid){
+          this.buildingObj = item;
+        }
+      })
+      this.load();
+    },
+    //更换楼层
+    changeFloor(fid){
+      this.floor = fid;
+      this.load();
+    },
+    //更换列表或平面图
+    changeRadio(val) {
+      this.isMyTab = val;
+      this.load();
+    },
+    //返回
+    goBack() {
+      this.$router.push({
+        name: 'cenotelist'
+      })
+    },
+    //更新
+    refresh() {
+      this.load();
+    }
+  },
+  watch: {
+
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.condition {
+  position: relative;
+  padding: 10px 10px;
+  display: flex;
+  height: calc(100% - 22px);
+  flex-direction: column;
+  border: 1px solid #dfe6ec;
+  background: #fff;
+  .header {
+    padding-bottom: 10px;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.5);
+    span {
+      line-height: 33px;
+      margin-left: 15px;
+    }
+    /deep/ .buildFloor {
+      line-height: 32px;
+    }
+  }
+  .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;
+    }
+  }
+}
+.saga-build-tab {
+  position: absolute;
+  left: 50%;
+  transform: translateX(-50%);
+  .tab-main {
+    float: left;
+    width: 120px;
+    padding: 0 5px;
+    margin: 5px 0;
+    border: 1px solid #ccc;
+    background-color: #fff;
+    height: 30px;
+    box-sizing: border-box;
+    text-align: center;
+    cursor: pointer;
+    overflow: hidden;
+    i {
+      font-size: 18px;
+      padding-right: 10px;
+      float: left;
+      line-height: 30px;
+      margin-left: 10px;
+    }
+    span {
+      line-height: 30px;
+      float: left;
+    }
+  }
+  .tab-active {
+    background-color: #409eff;
+    color: #fff;
+  }
+}
+.data-item {
+  height: calc(100% - 44px);
+  padding: 10px 0px;
+}
+.floor-item {
+  padding: 10px 10px;
+  display: block;
+  margin: 0px;
+  cursor: pointer;
+}
+.floorItemChoose {
+  background: rgba(0,0,0,0.2);
+}
+/deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+</style>

+ 82 - 0
src/views/ledger/cenotelist/relatedSpaceList.vue

@@ -0,0 +1,82 @@
+<template>
+  <div id="relatedSpaceList" style="height:100%;">
+    <div class="query">
+      <el-input v-model="keyword" placeholder="请输入关键词" @keyup.enter.native="getSpaceList" style="width:240px;margin:0 0 0 10px;">
+        <i slot="suffix" class="el-input__icon el-icon-search" @click="getSpaceList"></i>
+      </el-input>
+      <floorCascader @change="changeCascader"></floorCascader>
+    </div>
+    <div class="table-area" style="height:calc(100% - 52px)">
+      <el-scrollbar style="height:calc(100% - 40px);">
+        <el-table :data="tableData" style="width: 100%;height:100%;" v-loading="loading" :header-cell-style="headerStyle">
+          <el-table-column prop='MeterFunc' label='业务空间建筑楼层' show-overflow-tooltip min-width="200" header-align='center' align="center">
+          </el-table-column>
+          <el-table-column prop='MeterFunc' label='业务空间类型' show-overflow-tooltip min-width="200" header-align='center' align="center">
+          </el-table-column>
+          <el-table-column prop='MeterFunc' label='业务空间本地名称' show-overflow-tooltip min-width="200" header-align='center' align="center">
+          </el-table-column>
+          <el-table-column prop='MeterFunc' label='业务空间本地编码' show-overflow-tooltip min-width="200" header-align='center' align="center">
+          </el-table-column>
+          <el-table-column prop='' label='操作' show-overflow-tooltip min-width="90" header-align='center' align='center'>
+            <template slot-scope="scope">
+              <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" type="danger" plain icon="el-icon-delete"></el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-scrollbar>
+      <!-- 分页 -->
+      <el-pagination @size-change="getSpaceList" @current-change="getSpaceList" :current-page="currentPage" :page-sizes="pageSizes"
+        :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="tableData.length" style="float:right;">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import floorCascader from "@/components/ledger/lib/floorCascader";
+export default {
+  data() {
+    return {
+      //表格头样式
+      headerStyle: {
+        backgroundColor: '#e1e4e5',
+        color: '#2b2b2b',
+        lineHeight: '30px'
+      },
+      pageSizes: [10, 20, 50, 100],
+      pageSize: 50,
+      currentPage: 1,
+      keyword: '',//关键词
+      floor: '',//当前楼层
+      options: [],//楼层
+      tableData: [],//表格数据
+      loading: false,//加载
+    }
+  },
+  components:{
+    floorCascader
+  },
+  methods: {
+    getSpaceList() {
+      console.log(111)
+    },
+    changeCascader(val){
+      console.log(val);
+    }
+  },
+  props: {
+    space: '',//空间id
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.query {
+  padding: 10px 0px;
+}
+#relatedSpaceList {
+  /deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+}
+</style>

+ 2 - 1
src/views/ledger/spacelist/index.vue

@@ -374,7 +374,8 @@ export default {
   .spaceTypes {
     .types {
       float: left;
-      width: calc(100% - 200px);
+      width: 100%;
+      // width: calc(100% - 200px);
     }
     .groupAdd {
       float: left;

+ 1 - 1
src/views/ledger/system/index.vue

@@ -6,7 +6,7 @@
     <saga-title :mess="mess"></saga-title>
     <div class="table-main">
       <div class="search-header">
-        <floor-cascader :type="'no'" @change="changeFloor"></floor-cascader>
+        <floor-cascader @change="changeFloor"></floor-cascader>
         <my-cascader ref="cascader" @change="changeDevice"></my-cascader>
       </div>
       <hanson-table @close="close" ref="tableMain"></hanson-table>

+ 8 - 1
src/views/model/file/index.vue

@@ -20,7 +20,9 @@
             </div>
           </div>
           <div class="folder-list">
-            <div class="head">模型文件夹</div>
+            <div class="head">建筑模型文件夹
+              <span>(建议按建筑模型进行命名)</span>
+            </div>
             <ul class="lists">
               <el-scrollbar style="height:100%;">
                 <li @click="openFolder(index,item)" v-for="(item,index) in navigationModel" :key="index"
@@ -595,6 +597,11 @@ export default {
       justify-content: left;
       align-items: center;
       font-weight: bold;
+      span{
+        font-weight: normal;
+        font-size: 12px;
+        color: #606266;
+      }
     }
     .lists {
       width: 100%;

+ 1 - 1
src/views/ready/buildfloor/drawGraphy/checkGraphy.vue

@@ -78,7 +78,7 @@ export default {
     handleItemChange(val) {
       let data = {
         FolderId: val[0],
-        Status: '3, 31, 4',
+        Status: '4',
         ProjectId: this.projectId
       };
       request.queryFloorList(data, res => {

+ 25 - 2
src/views/ready/buildfloor/drawGraphy/drawFloor.vue

@@ -3,7 +3,7 @@
     <canvas :id="`floorCanvas${id}`" :width="cadWidth" :height="cadHeight" ref="canvas" tabindex="0"></canvas>
     <div class="operate" v-if="showTools">
       <canvasFun @fit="fit" @savePng="savePng" @saveSvg="saveSvg" @divide="divide" @clearDivide="clearDivide" @undo="undo" @redo="redo" @scale="scale"
-        @changeAbsorb="changeAbsorb" :isEdit="isEdit" ref="canvasFun"></canvasFun>
+        @changeAbsorb="changeAbsorb" :config="config" ref="canvasFun" @saveJson="saveJson"></canvasFun>
     </div>
   </div>
 </template>
@@ -29,7 +29,11 @@ export default {
       modelId: '',
       FloorID: '',
       Outline: [],
-      floorData: {}
+      floorData: {},
+      config: {
+        isEdit: false,
+        divide: true
+      }
     };
   },
   props: {
@@ -116,6 +120,16 @@ export default {
         this.initGraphy(this.floorData.StructureInfo.FloorMap, 2)
       })
     },
+    // 获取绑定该模型id的其他楼层轮廓线
+    getOtherFloorOutLine(){
+      let modelid =  this.$route.query.modelId;
+      let pa = {
+        Filters: `ModelId='${modelid}'`
+      }
+      floorQuery(pa, res => {
+        console.log(res)
+      })
+    },
     // 清空平面图
     clearGraphy() {
       if (this.view) {
@@ -154,6 +168,10 @@ export default {
     changeAbsorb(isAbsorbing) {
       this.drawMainScene.isAbsorbing = isAbsorbing;
     },
+    // 保存json
+    saveJson() {
+      this.view.saveFloorJson(`${this.floor}.json`)
+    },
     // 撤销
     undo() {
 
@@ -176,6 +194,11 @@ export default {
           this.$refs.canvasFun.sliderVal = n * 10 / this.view.minScale;
         }
       }
+    },
+    "isEdit": {
+      handler(n) {
+        this.config.isEdit = n;
+      }
     }
   }
 };

+ 1 - 1
src/views/ready/buildfloor/repetitionGraphy.vue

@@ -63,7 +63,7 @@ export default {
         Outline = Outline.map(t => {
           return {
             x: t.x.toFixed(2),
-            y: t.y.toFixed(2),
+            y: -t.y.toFixed(2),
           }
         })
       }

+ 122 - 11
src/views/screen/splitscreen/spaceledger/index.vue

@@ -1,33 +1,144 @@
 
 <template>
-  <div>
-    <h1>业务空间台账辅助屏</h1>
+  <div class="box">
+    <el-container>
+      <el-header>
+        <div class="boxName">
+          第二屏详情
+        </div>
+        <div class="spaceName">
+          空间名称:{{spaceDetails.RoomLocalName}}
+        </div>
+      </el-header>
+      <el-container>
+        <el-aside width="500px">
+          Aside
+        </el-aside>
+        <el-main>
+          <el-tabs v-model="activeTab" type='card'>
+            <template v-for="(item,index) in tabsList">
+              <el-tab-pane :name="item.Code" :key="index" :label="item.Name">
+                <!-- 静态数据 -->
+                <div v-if="activeTab === 'staticData'" style="width:100%">
+                  <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+                </div>
+                <!-- 动态数据 -->
+                <div v-if="activeTab === 'dynamicData'" style="width:100%">
+                  <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+                </div>
+                <!-- 对象关系 -->
+                <div v-if="activeTab === 'objectRelationship'" style="width:100%">
+                  <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+                  <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+                  <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+                </div>
+              </el-tab-pane>
+            </template>
+          </el-tabs>
+        </el-main>
+      </el-container>
+    </el-container>
   </div>
 </template>
 
 <script>
 import { mapGetters } from 'vuex'
+import { queryZone } from '@/api/scan/request'
 
 export default {
   data() {
     return {
-      
+      tabsList: [
+        { Code: 'staticData', Name: '静态数据' },
+        { Code: 'dynamicData', Name: '动态数据' },
+        { Code: 'objectRelationship', Name: '对象关系' }
+      ],
+      activeTab: 'staticData',
+      spaceDetails: {},
+      iframeSrc: '',
+      projectId: ''
     }
   },
   created() {
-
-  },
-  mounted() {
+    if (this.$route.query.RoomID && this.$route.query.zone) {
+      this.getData();
+    }
+    this.setFrame();
   },
+  updated() { },
+  mounted() { },
   computed: {
-    ...mapGetters('layout', ['userInfo', 'projectId', 'projects', 'userId'])
+    ...mapGetters('layout', ['userInfo', 'projects', 'userId', 'secret'])
+  },
+  methods: {
+    getData() {
+      // 获取空间本地名称
+      let params = {
+        data: {
+          Filters: `RoomID="${this.$route.query.RoomID}"`
+        },
+        zone: this.$route.query.zone
+      }
+      queryZone(params, res => {
+        this.spaceDetails = res.Content[0];
+      })
+    },
+    // 设置静态数据tab的iframe
+    setFrame() {
+      this.projectId = localStorage.getItem('projectId');
+      this.iframeSrc = `${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.$route.query.RoomID}&type=0&code=${this.$route.query.zone}`
+    },
   },
-  methods:{
-    
+  watch: {
+    $route(to, from) {
+      // 监听路由变化就重新获取空间名称
+      this.getData();
+    }
   }
 }
 </script>
 
-<style lang="scss" scoped>
-
+<style lang="less" scoped>
+#screenBox .screen-router[data-v-6c06ede0] {
+  padding: 0;
+}
+.el-header {
+  padding: 0;
+  height: 80px !important;
+  .boxName {
+    color: #fff;
+    font-size: 16px;
+    line-height: 50px;
+    height: 50px !important;
+    padding: 0 20px;
+    background-color: #3f4f62;
+  }
+  .spaceName {
+    font-size: 14px;
+    line-height: 30px;
+    padding: 0 20px;
+    border-bottom: 1px solid black;
+    box-sizing: border-box;
+  }
+}
+.el-aside {
+  // background-color: #d3dce6;
+  color: #333;
+  text-align: center;
+  line-height: 200px;
+}
+.el-main {
+  // background-color: #e9eef3;
+  color: #333;
+  text-align: center;
+}
+.el-tabs__content {
+  height: 750px;
+}
+#pane-staticData {
+  height: 750px;
+  div {
+    height: 100%;
+  }
+}
 </style>