소스 검색

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

shaun-sheep 5 년 전
부모
커밋
4169d38289
4개의 변경된 파일407개의 추가작업 그리고 35개의 파일을 삭제
  1. 12 1
      src/api/scan/request.js
  2. 327 0
      src/components/ledger/cenote/elevationMap.vue
  3. 2 2
      src/components/ledger/lib/cenoteGraphy.vue
  4. 66 32
      src/views/ledger/cenotelist/relatedSpace.vue

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

@@ -863,6 +863,12 @@ export function spaceInShaftUnlink(param, success) {
   http.postJson(url, param.data, success)
 }
 
+//查询竖井关联的空间垂直交通关系
+export function shaftVerticalSpace(param, success) {
+  let url = `${baseUrl}/equip-component/shaft/shaft-vertical-space`
+  http.postJson(url, param, success)
+}
+
 //获取租户表格内容信息
 export function getRentTableData(param, success) {
   let url = `${baseUrl}/datacenter/tenant/query-with-count`
@@ -1789,8 +1795,13 @@ export function shaftSpaceTypeQuery(param, success) {
   let url = `${baseUrl}/datacenter/sh-contain-sp-base/space-type-query?shaftId=${param.shaftId}`;
   http.postJson(url, param, success)
 }
-//关系-----竖井下的业务空间,竖井一对多,此方法会覆盖以前的记录
+//关系-----竖井下的业务空间,竖井一对多,此方法会覆盖以前的记录
 export function shaftZoneLink(param, success) {
+  let url = `${baseUrl}/datacenter/sh-contain-sp-base/link-shsps`;
+  http.postJson(url, param, success)
+}
+//关系-----竖井下的业务空间,竖井一对多,此方法会覆盖以前的记录
+export function shaftZoneLinkReplace(param, success) {
   let url = `${baseUrl}/datacenter/sh-contain-sp-base/link-shsps-replace?BuildingId=${param.BuildingId}&FloorId=${param.FloorId}&Type=${param.Type}`;
   http.postJson(url, param.data, success)
 }

+ 327 - 0
src/components/ledger/cenote/elevationMap.vue

@@ -0,0 +1,327 @@
+<template>
+  <div v-loading="load" class="saga-elevation">
+    <div v-if="elevationData.length" class="saga-floor">
+      <div class="saga-rf">
+        <p class="saga-floorName">RF</p>
+        <div class="saga-spaceList">
+          <div class="saga-group" v-for="(winth, index) in groupWidth" :key="index" :style="`width: ${100*winth}px;`"></div>
+        </div>
+      </div>
+      <div class="saga-floor-item" v-for="floor in elevationData" :key="floor.FloorSequenceID">
+        <p class="saga-floorName">{{floor.FloorLocalName}}<i class="el-icon-right"></i></p>
+        <div class="saga-spaceList">
+          <div class="saga-group" v-for="(group, groupIndex) in floor.group" :key="floor.FloorSequenceID+'-'+groupIndex" :style="`width: ${100*groupWidth[groupIndex]}px;`">
+            <div class="saga-spaceItem" 
+            :class="[spaceItem.IsAI?spaceItem.checked?'saga-spaceItem-checked':'saga-spaceItem-ai':'']" 
+            v-for="spaceItem in group.spaceList" 
+            :key="spaceItem.RoomID" 
+            :title="spaceItem.RoomLocalName"
+            @click="handleClickCheck(spaceItem)"
+            >
+            {{spaceItem.RoomLocalName}}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div v-else class="saga-center">
+      <i class="icon-wushuju iconfont"></i>
+      数据暂无
+    </div>
+  </div>
+</template>
+
+<script>
+  import { shaftVerticalSpace, shaftZoneLink } from "@/api/scan/request"
+
+  import {mapGetters} from 'vuex'
+  export default {
+  data () {
+    return {
+      elevationData: [],
+      groupWidth: {},
+      checkedList: [],
+      load: true
+    }
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  props: {
+    params: Object,
+    onlyRead: Boolean,
+    isEdit: Boolean,
+    isAI: Boolean,
+  },
+  methods: {
+    init () { //获取数据并格式化数据
+      //根据isAI判断请求参数是否包含AI推介数据(暂未完成)
+      this.params.AiSwitch = this.isAI
+      console.log(this.params)
+      this.load = true;
+      // 查询竖井关联的空间垂直交通关系
+      shaftVerticalSpace(this.params, (res) => {
+        let data = res.Content;
+        // let data = [
+        //   {
+        //     FloorSequenceID: 5,
+        //     FloorLocalName: 'F5',
+        //     ZoneSpaceList: [
+        //       {
+        //         RoomID: 'f5-001',
+        //         IsAI: false,
+        //         RoomLocalName: '业务空间f5-001',
+        //         SpaceIdList: ['f4-002']
+        //       }
+        //     ]
+        //   },
+        //   {
+        //     FloorSequenceID: 4,
+        //     FloorLocalName: 'F4',
+        //     ZoneSpaceList: [{
+        //       RoomID: 'f4-001',
+        //       IsAI: true,
+        //       RoomLocalName: '业务空间f4-001',
+        //       SpaceIdList: ['f3-002']
+        //     }, {
+        //       RoomID: 'f4-002',
+        //       IsAI: true,
+        //       RoomLocalName: '业务空间f4-002',
+        //       SpaceIdList: ['f5-001']
+        //     }]
+        //   },
+        //   {
+        //     FloorSequenceID: 3,
+        //     FloorLocalName: 'F3',
+        //     ZoneSpaceList: [{
+        //       RoomID: 'f3-001',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f3-001',
+        //       SpaceIdList: ['f2-002']
+        //     }, {
+        //       RoomID: 'f3-002',
+        //       IsAI: true,
+        //       RoomLocalName: '业务空间f3-002',
+        //       SpaceIdList: ['f2-002','f4-001']
+        //     }]
+        //   },
+        //   {
+        //     FloorSequenceID: 2,
+        //     FloorLocalName: 'F2',
+        //     ZoneSpaceList: [{
+        //       RoomID: 'f2-001',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f2-001',
+        //       SpaceIdList: ['f1-001']
+        //     }, {
+        //       RoomID: 'f2-002',
+        //       IsAI: true,
+        //       RoomLocalName: '业务空间f2-002',
+        //       SpaceIdList: ['f3-001','f3-002']
+        //     }, {
+        //       RoomID: 'f2-003',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f2-003',
+        //       SpaceIdList: []
+        //     }]
+        //   },
+        //   {
+        //     FloorSequenceID: 1,
+        //     FloorLocalName: 'F1',
+        //     ZoneSpaceList: [{
+        //       RoomID: 'f1-001',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f1-001',
+        //       SpaceIdList: ['f2-001']
+        //     }, {
+        //       RoomID: 'f1-002',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f1-002',
+        //       SpaceIdList: []
+        //     }, {
+        //       RoomID: 'f1-003',
+        //       IsAI: false,
+        //       RoomLocalName: '业务空间f1-003',
+        //       SpaceIdList: []
+        //     }]
+        //   }
+        // ];
+        let max = 0, idMap = {}, groupMap = {}, copyData = JSON.parse(JSON.stringify(data));
+        this.groupWidth = {};
+        copyData.reverse().forEach(floor => {
+          if (floor.ZoneSpaceList && floor.ZoneSpaceList.length) {
+            floor.ZoneSpaceList.forEach(space => {
+              if (idMap[space.RoomID]) {  // 该业务空间在映射列表中
+                groupMap[idMap[space.RoomID]].push(space)
+                space.SpaceIdList.forEach(RoomID =>{
+                  if (!idMap[RoomID]) {
+                    idMap[RoomID] = idMap[space.RoomID];
+                  }
+                })
+              } else { // 该业务空间不在映射列表中
+                max++;
+                idMap[space.RoomID] = max;
+                groupMap[max] = [];
+                this.groupWidth[max] = 0;
+                groupMap[max].push(space);
+                space.SpaceIdList.forEach(RoomID =>{
+                  if (!idMap[RoomID]) {
+                    idMap[RoomID] = max;
+                  }
+                })
+              }
+            })
+          }
+        })
+        data.forEach((floor, index) =>{
+          floor.group = {};
+          Object.keys(groupMap).forEach(groupIndex =>{
+            let max = 0;
+            floor.group[groupIndex] = {
+              spaceList: []
+            };
+            if (floor.ZoneSpaceList && floor.ZoneSpaceList.length) {
+              floor.ZoneSpaceList.forEach(space => {
+                if (groupMap[groupIndex].find(item => { return space.RoomID == item.RoomID })) {
+                  space.checked = false;
+                  floor.group[groupIndex].spaceList.push(space);
+                  max++;
+                }
+              })
+            }
+            if (max > this.groupWidth[groupIndex]) {
+              this.groupWidth[groupIndex] = max;
+            }
+          })
+        });
+        this.elevationData = data
+        console.log(this.elevationData)
+        this.load = false;
+      })
+    },
+    handleClickCheck (sapceItem) { //点选推介的业务空间
+      console.log(this.isEdit)
+      if (sapceItem.IsAI && this.isEdit && !this.onlyRead) { //是AI推荐并且编辑模式下
+        sapceItem.checked = sapceItem.checked? false: true;
+        if (sapceItem.checked) {
+          this.checkedList.push(sapceItem)
+        } else {
+          let index = this.checkedList.findIndex(item =>{ return item.RoomID == sapceItem.RoomID })
+          if (index != -1) { // 找到对应的数据
+            this.checkedList.splice(index,1)
+          }
+        }
+      }
+    },
+    savaEdit () {// 接口保存数据和业务空间的关系
+      let params = {
+        ShaftId: this.params.ShaftId,
+        SpaceIdList: this.checkedList.map(item => {
+          return item.RoomID
+        })
+      }
+      console.log(params);
+      shaftZoneLink(params, res =>{
+        this.$message.success("保存成功");
+        this.init();
+      })
+    }
+  },
+  watch: {
+    projectId() {
+      if (this.params.BuildingId && this.params.ObjectType && this.params.ShaftId) {
+        this.init();
+      }
+      console.log(this.projectId)
+    },
+    // isAI() {
+    //   if (this.params.BuildingId && this.params.ObjectType && this.params.ShaftId) {
+    //     this.init();
+    //   }
+    // },
+    params: {
+      handler(val,ccc) {
+        if (this.params.BuildingId && this.params.ObjectType && this.params.ShaftId) {
+          this.init();
+        }
+      },
+      immediate: true,
+      deep: true,
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .saga-elevation {
+    height: 100%;
+    position: relative;
+    .saga-center{
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%,-60%);
+      text-align: center;
+    }
+    .saga-floor {
+      display: flex;
+      height: 100%;
+      box-sizing: border-box;
+      flex-direction: column;
+      justify-content: flex-end;
+      padding: 0 10px 60px 0;
+      .saga-rf {
+        display: flex;
+        flex-direction: row;
+        font-size: 12px;
+        color: blue;
+      }
+      .saga-floor-item {
+        display: flex;
+        flex-direction: row;
+        font-size: 12px;
+        height: 60px;
+        line-height: 60px;
+      }
+      .saga-floorName {
+        min-width: 50px;
+        text-align: right;
+      }
+      .saga-spaceList {
+        display: flex;
+        flex-direction: row;
+        flex: 1;
+        border-bottom: 2px solid #c1c6d2;
+        box-sizing: border-box;
+        .saga-group {
+          display: flex;
+          flex-direction: row;
+          margin-left: 10px;
+          box-sizing: border-box;
+          .saga-spaceItem {
+            width: 100px;
+            margin-left: 1px;
+            text-align: center;
+            overflow: hidden;
+            text-overflow:ellipsis;
+            white-space: nowrap;
+            background-color: #ffcc00;
+            border: 1px solid #333333;
+          }
+          .saga-spaceItem-ai{
+            cursor: pointer;
+            box-sizing: border-box;
+            background-color: #eaeae9;
+            border: 1px dashed #333333;
+          }
+          .saga-spaceItem-checked {
+            cursor: pointer;
+            box-sizing: border-box;
+            background-color: #1abc9c;
+            border: 1px dashed #333333;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 2 - 2
src/components/ledger/lib/cenoteGraphy.vue

@@ -22,7 +22,7 @@ import { SColor, SPoint } from "@saga-web/draw/lib";
 import { DivideFloorScene, SpaceItem, ZoneItem } from "@saga-web/cad-engine/lib";
 import { FloorView } from "@saga-web/cad-engine/lib/FloorView";
 import { colorArr } from '@/utils/spaceColor';
-import { getFloorMsgByFloorID, queryZone, shaftSpaceQuery, shaftZoneLink } from '@/api/scan/request';
+import { getFloorMsgByFloorID, queryZone, shaftSpaceQuery, shaftZoneLinkReplace } from '@/api/scan/request';
 import { resolve, reject } from 'q';
 export default {
   data() {
@@ -211,7 +211,7 @@ export default {
       param.data.SpaceIdList = arr.map(t => {
         return t.data.RoomID;
       })
-      shaftZoneLink(param, res => {
+      shaftZoneLinkReplace(param, res => {
         this.config.isEdit = false;
         this.$message.success("保存成功");
         this.getBusinessSpace();

+ 66 - 32
src/views/ledger/cenotelist/relatedSpace.vue

@@ -34,27 +34,43 @@
             <el-option v-for="item in buildingList" :key="item.value" :label="item.BuildLocalName" :value="item.BuildID"></el-option>
           </el-select>
         </el-badge>
-        <el-row style="height:calc(100% - 42px);margin:10px 0 0 0;width:100%;position:relative;">
-          <el-col :span="3" style="height:100%;border:1px solid #e4e4e4;">
-            <el-scrollbar style="height:100%;">
-              <div class="floor" style="height:100%;text-align:center;">
-                <span class="floor-item" style="border-bottom:1px solid #e4e4e4;">楼 层</span>
-                <div v-if="building" v-loading="buildingLoading">
-                  <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>
+        <el-switch
+          v-if="!cenoteObj.onlyRead"
+          style="margin-left:15px;"
+          v-model="isAI"
+          active-text="打开AI">
+        </el-switch>
+        <div style="height:calc(100% - 42px);margin:10px 0 0 0;width:100%;">
+          <el-row style="height:100%;margin:0;width:55%;position:relative;display:inline-block;border:1px solid #e4e4e4;">
+            <el-col :span="4" style="height:100%;border-right:1px solid #e4e4e4;">
+              <el-scrollbar style="height:100%;">
+                <div class="floor" style="height:100%;text-align:center;">
+                  <span class="floor-item" style="border-bottom:1px solid #e4e4e4;">楼 层</span>
+                  <div v-if="building" v-loading="buildingLoading">
+                    <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>
-              </div>
-            </el-scrollbar>
-          </el-col>
-          <el-col :span="21" style="height:100%;border:1px solid #e4e4e4;border-left:none;">
-            <cenote-graphy ref="cenotegraphy"></cenote-graphy>
-          </el-col>
-        </el-row>
+              </el-scrollbar>
+            </el-col>
+            <el-col :span="20" style="height:100%;position:relative;">
+              <cenote-graphy ref="cenotegraphy"></cenote-graphy>
+            </el-col>
+          </el-row>
+          <div class="elevation-box">
+            <elevation-map 
+              ref="elevationMap" 
+              :onlyRead="cenoteObj.onlyRead" 
+              :isEdit="isEdit" 
+              :isAI="isAI"
+              :params="{BuildingId: building, ObjectType: space, ShaftId: $route.query.ShaftId}">
+            </elevation-map>
+          </div>
+        </div>
 
       </div>
       <div v-show="isMyTab == 2" class="data-item">
-        <related-spaceList :space="space" :buildingList="buildingList" :spaceType="spaceType" :floorType="floorType" ref="relatedSpacelist">
-        </related-spaceList>
+        <related-spaceList :space="space" :buildingList="buildingList" :spaceType="spaceType" :floorType="floorType" ref="relatedSpacelist"></related-spaceList>
       </div>
     </div>
   </div>
@@ -63,6 +79,7 @@
 <script>
 import spaceSelect from "@/components/ledger/lib/spaceSelect";
 import relatedSpaceList from "@/components/ledger/cenote/relatedSpaceList";
+import elevationMap from "@/components/ledger/cenote/elevationMap";
 import addSpaceDialog from '@/components/ledger/cenote/dialog/addSpaceDialog';
 import { queryDictionaryHead, buildingQuery, shaftSpaceTypeQuery, shaftSpaceBuildingQuery } from '@/api/scan/request';
 import cenoteGraphy from '@/components/ledger/lib/cenoteGraphy'
@@ -82,14 +99,21 @@ export default {
       spaceType: {},//空间种类
       floorType: {},//子组件楼层信息
       buildingLoading: false,//左侧列表加载
-      showSpaceDot: false,//空间提示红点
-      showBuildDot: false,//楼层提示红点
+      // showSpaceDot: false,//空间提示红点
+      // showBuildDot: false,//楼层提示红点
+      isAI: true,//是否打开AI
     }
   },
   computed: {
     cenoteObj() {
       return this.$route.query;
     },
+    showSpaceDot() {
+      return this.spaceList.length > 1 && this.cenoteObj.onlyRead?true:false;
+    },
+    showBuildDot() {
+      return this.buildingList.length > 1 && this.cenoteObj.onlyRead?true:false;
+    },
     ...mapGetters("layout", ["projectId"])
   },
   props: {
@@ -99,9 +123,11 @@ export default {
     spaceSelect,
     relatedSpaceList,
     addSpaceDialog,
-    cenoteGraphy
+    cenoteGraphy,
+    elevationMap
   },
   created() {
+    this.isAI = this.$route.query.onlyRead?false:true;
     this.getSpaceData();
   },
   methods: {
@@ -137,9 +163,9 @@ export default {
     showDefaultSpace() {
       if (this.spaceList.length) {
         this.space = this.spaceList.find((item) => {return item.Code == "GeneralZone"})? "GeneralZone": this.spaceList[0].Code;
-        if (this.spaceList.length > 1 && this.cenoteObj.onlyRead) {
-          this.showSpaceDot = true;
-        }
+        // if (this.spaceList.length > 1 && this.cenoteObj.onlyRead) {
+        //   this.showSpaceDot = true;
+        // }
       }
       //处理空间类型
       this.spaceList.map(item => {
@@ -195,16 +221,15 @@ export default {
         this.$refs.relatedSpacelist.setFloorData(this.buildingList);
       }
       if (this.buildingList.length) {
-        if (this.buildingList.length > 1 && this.cenoteObj.onlyRead) {
-          this.showBuildDot = true;
-        }
+        // if (this.buildingList.length > 1 && this.cenoteObj.onlyRead) {
+        //   this.showBuildDot = true;
+        // }
         this.changeBuilding(this.buildingList[0].BuildID);
-      }
-      else {
+      } else {
         this.buildingList = [];
         this.building = '';
         this.floor = '';
-        this.showBuildDot = false;
+        // this.showBuildDot = false;
       }
       this.buildingList.map(item => {
         if (item.BuildID && item.BuildLocalName) {
@@ -221,7 +246,6 @@ export default {
     },
     //更改业务空间类型
     changeSpace(val) {
-      this.showSpaceDot = false;
       this.space = val;
       this.floor = '';
       this.buildingList = [];
@@ -242,7 +266,6 @@ export default {
           }
         }
       })
-      this.showBuildDot = false;
     },
     //更换楼层
     changeFloor(fid) {
@@ -264,6 +287,8 @@ export default {
     saveEdit() {
       this.isEdit = false;
       this.$refs.cenotegraphy.saveEdit();
+      // 走保存接口,然后回调渲染
+      this.$refs.elevationMap.savaEdit();
     },
     //更换列表或平面图
     changeRadio(val) {
@@ -387,6 +412,15 @@ export default {
   /deep/ .is-horizontal {
     display: none;
   }
+  .elevation-box {
+    height: 100%;
+    width: calc(45% - 14px);
+    margin-left: 10px;
+    display: inline-block;
+    box-sizing: border-box;
+    border: 1px solid #e4e4e4;
+    overflow: auto;
+  }
 }
 .floor-item {
   padding: 10px 10px;
@@ -400,4 +434,4 @@ export default {
 /deep/ .el-scrollbar__wrap {
   overflow-x: hidden;
 }
-</style>
+</style>