roomCountDrawer.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <template>
  2. <el-drawer title="关联的业务空间" :visible.sync="drawer" :direction="direction" :before-close="handleClose" size="20%" custom-class="room-count">
  3. <div class="drawer-body" :style="{height:drawerBodyHeight}">
  4. <div class="default-zone zone">
  5. <p>默认业务空间</p>
  6. <div v-if="!(readonly&&!zoneList.GeneralZone.length)">
  7. <div v-for="(item,index) in zoneList.GeneralZone" :key="item.RoomID" class="zoneItem"
  8. :title="`${item.BuildLocalName}-${item.FloorLocalName}-${item.RoomLocalName || item.RoomName}`">
  9. {{item.BuildLocalName}}-{{item.FloorLocalName}}-{{item.RoomLocalName || item.RoomName}}
  10. <i size="mini" class="el-icon-delete" title="删除" @click="deleteZoneItem('GeneralZone',index)" v-if="!readonly"></i>
  11. </div>
  12. <div class="zoneItem" style="border:none;padding:0;" v-if="!readonly">
  13. <el-cascader placeholder="请选择" v-model="GeneralVal" :options="option.GeneralZone" :props="props" filterable @expand-change="expandChange"
  14. @change="change" style="width:100%;">
  15. </el-cascader>
  16. </div>
  17. </div>
  18. <div v-else class="center">
  19. <i class="icon-wushuju iconfont"></i>
  20. 暂无数据
  21. </div>
  22. </div>
  23. <div class="tenant-zone zone">
  24. <p>租户业务空间</p>
  25. <div v-if="!(readonly&&!zoneList.TenantZone.length)">
  26. <div v-for="(item,index) in zoneList.TenantZone" :key="item.RoomID" class="zoneItem"
  27. :title="`${item.BuildLocalName}-${item.FloorLocalName}-${item.RoomLocalName || item.RoomName}`">
  28. {{item.BuildLocalName}}-{{item.FloorLocalName}}-{{item.RoomLocalName || item.RoomName}}
  29. <i size="mini" class="el-icon-delete" title="删除" @click="deleteZoneItem('TenantZone',index)" v-if="!readonly"></i>
  30. </div>
  31. <div class="zoneItem" style="border:none;padding:0;" v-if="!readonly">
  32. <el-cascader placeholder="请选择" v-model="TenantVal" :options="option.TenantZone" :props="props" filterable
  33. @expand-change="expandChangeTenantZone" @change="changeTenantZone" style="width:100%;">
  34. </el-cascader>
  35. </div>
  36. </div>
  37. <div v-else class="center">
  38. <i class="icon-wushuju iconfont"></i>
  39. 暂无数据
  40. </div>
  41. </div>
  42. </div>
  43. <div class="btn" v-if="!readonly">
  44. <el-button type="primary" @click="save">保存</el-button>
  45. </div>
  46. </el-drawer>
  47. </template>
  48. <script>
  49. import {
  50. tnRelateTenantZone, //关联租户空间
  51. tnRelateGeneralZone, //关联默认空间
  52. tnRelateOneZone,// 关联业务空间
  53. delTnRelateZone, // 删除关系业务空间与租户
  54. // buildingQuery, //建筑查询
  55. queryParentZone, //业务空间查询GeneralZone-TenantZone
  56. } from '@/api/scan/request'
  57. import { buildingQuery } from '@/api/object/build'
  58. import { mapGetters } from "vuex";
  59. export default {
  60. data() {
  61. return {
  62. drawer: false,
  63. direction: 'rtl',
  64. zoneList: {
  65. GeneralZone: [],
  66. TenantZone: []
  67. },
  68. option: {
  69. GeneralZone: [],
  70. TenantZone: []
  71. },
  72. props: {
  73. children: 'Floor'
  74. },
  75. GeneralVal: [],
  76. TenantVal: [],
  77. curTenantId: '',
  78. drawerBodyHeight: ''
  79. }
  80. },
  81. props: {
  82. readonly: {
  83. default: true
  84. }
  85. },
  86. computed: {
  87. ...mapGetters("layout", ["projectId"])
  88. },
  89. watch: {
  90. projectId() {
  91. this.init();
  92. }
  93. },
  94. mounted() {
  95. this.drawerBodyHeight = document.body.clientHeight - 152 + 'px'
  96. },
  97. created() {
  98. this.init();
  99. },
  100. methods: {
  101. init() {
  102. this.getBuilding()
  103. },
  104. getBuilding() {
  105. let pa = {
  106. cascade: [{ name: 'floor', orders: 'floorSequenceId desc' }],
  107. order: 'localName asc'
  108. }
  109. //todo 检测所有大小写
  110. buildingQuery(pa, res => {
  111. this.option.GeneralZone = res.content.map(build => {
  112. build.value = build.id;
  113. build.label = build.localName;
  114. if (build.floor) {
  115. build.floor = build.floor.map(floor => {
  116. floor.value = floor.id;
  117. floor.label = floor.localName;
  118. floor.floor = [];
  119. return floor;
  120. });
  121. build.floor.unshift({ value: 'noknowFloor', label: '未明确楼层', Floor: [] })
  122. }
  123. return build;
  124. })
  125. this.option.GeneralZone.unshift({ value: 'noknowBuild', label: '未明确建筑', Floor: [] });
  126. this.option.TenantZone = JSON.parse(JSON.stringify(this.option.GeneralZone));
  127. })
  128. },
  129. expandChange(val) {
  130. this.middleware(val, "GeneralZone")
  131. },
  132. expandChangeTenantZone(val) {
  133. this.middleware(val, "TenantZone")
  134. },
  135. middleware(val, type) {
  136. let filters = '';
  137. if (val[0] == 'noknowBuild') { //未明确建筑
  138. filters = `buildingId isNull`
  139. this.getZone(filters, type, val)
  140. } else if (val[1]) {
  141. if (val[1] == "noknowFloor") {
  142. filters = `buildingId='${val[0]}';floorId isNull`
  143. } else {
  144. filters = `buildingId='${val[0]}';floorId='${val[1]}'`
  145. }
  146. this.getZone(filters, type, val)
  147. }
  148. },
  149. getZone(filters, type, selected) {
  150. if (!filters) return;
  151. let params = {
  152. Cascade: [{ Name: 'building' }, { Name: 'floor' }],
  153. Filters: `${filters};ObjectType='${type}'`,
  154. Orders: "RoomID asc",
  155. PageSize: 1000,
  156. Projection: ["RoomID", "RoomLocalName", "RoomName", "ObjectType", "BuildingId", "FloorId"]
  157. }
  158. queryParentZone(params, res => {
  159. if (res.Content.length) {
  160. let tempArr = res.Content.map(t => {
  161. t.BuildLocalName = t.Building ? t.Building.BuildLocalName : '未明确建筑';
  162. t.FloorLocalName = t.Floor ? t.Floor.FloorLocalName : '未明确楼层';
  163. delete t.Floor;
  164. t.value = JSON.parse(JSON.stringify(t));
  165. t.label = t.RoomLocalName || t.RoomName;
  166. return t;
  167. })
  168. if (selected.length == 1) {
  169. this.option[type][0].Floor = tempArr;
  170. } else {
  171. for (let i = 0; i < this.option[type].length; i++) {
  172. if (this.option[type][i].value == selected[0]) {
  173. for (let j = 0; j < this.option[type][i].Floor.length; j++) {
  174. if (this.option[type][i].Floor[j].value == selected[1]) {
  175. this.option[type][i].Floor[j].Floor = tempArr;
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }
  182. })
  183. },
  184. change(val) {
  185. let zoneObj = val[val.length - 1];
  186. if (zoneObj.BuildLocalName == '未明确建筑') {
  187. zoneObj.FloorLocalName = ''
  188. }
  189. if (this.zoneList.GeneralZone.findIndex((item) => (item.RoomID == zoneObj.RoomID)) == -1) {
  190. this.zoneList.GeneralZone.push(zoneObj);
  191. this.relateGeneral('GeneralZone', zoneObj.RoomID)
  192. } else {
  193. this.$message.warning('已有业务空间,请重新选择')
  194. }
  195. this.GeneralVal = [];
  196. },
  197. changeTenantZone(val) {
  198. let zoneObj = val[val.length - 1];
  199. if (zoneObj.BuildLocalName == '未明确建筑') {
  200. zoneObj.FloorLocalName = ''
  201. }
  202. if (this.zoneList.TenantZone.findIndex((item) => (item.RoomID == zoneObj.RoomID)) == -1) {
  203. this.zoneList.TenantZone.push(zoneObj);
  204. this.relateGeneral('TenantZone', zoneObj.RoomID)
  205. } else {
  206. this.$message.warning('已有业务空间,请重新选择')
  207. }
  208. this.TenantVal = [];
  209. },
  210. showDrawer(tenant) {
  211. this.curTenantId = tenant.TenantID;
  212. if (tenant.ZoneGeneraltList) {
  213. this.zoneList.GeneralZone = tenant.ZoneGeneraltList.map(t => {
  214. if (t.Building) {
  215. t.BuildLocalName = t.Building.BuildLocalName || t.Building.BuildName;
  216. } else {
  217. t.BuildLocalName = '未明确建筑'
  218. }
  219. if (t.Floor) {
  220. t.FloorLocalName = t.Floor.FloorLocalName || t.Floor.FloorName;
  221. } else {
  222. t.FloorLocalName = '未明确楼层'
  223. }
  224. if (t.BuildLocalName == '未明确建筑') {
  225. t.FloorLocalName = ''
  226. }
  227. return t;
  228. });
  229. } else {
  230. this.zoneList.GeneralZone = [];
  231. }
  232. if (tenant.ZoneTenantList) {
  233. this.zoneList.TenantZone = tenant.ZoneTenantList.map(t => {
  234. if (t.Building) {
  235. t.BuildLocalName = t.Building.BuildLocalName || t.Building.BuildName;
  236. } else {
  237. t.BuildLocalName = '未明确建筑'
  238. }
  239. if (t.Floor) {
  240. t.FloorLocalName = t.Floor.FloorLocalName || t.Floor.FloorName;
  241. } else {
  242. t.FloorLocalName = '未明确楼层'
  243. }
  244. if (t.BuildLocalName == '未明确建筑') {
  245. t.FloorLocalName = ''
  246. }
  247. return t;
  248. });
  249. } else {
  250. this.zoneList.TenantZone = [];
  251. }
  252. this.drawer = true;
  253. },
  254. handleClose(done) {
  255. this.zoneList.GeneralZone = [];
  256. this.zoneList.GeneralZone = [];
  257. this.$emit('refresh');
  258. done();
  259. },
  260. // 删除
  261. deleteZoneItem(type, index) {
  262. let pa = {
  263. type: type,
  264. data: [
  265. {
  266. SpaceID: this.zoneList[type][index].RoomID,
  267. TenantID: this.curTenantId
  268. }
  269. ]
  270. }
  271. this.zoneList[type].splice(index, 1);
  272. delTnRelateZone(pa, res => { })
  273. },
  274. // 关联默认空间
  275. relateGeneral(type, SpaceId) {
  276. let pa = {
  277. type: type,
  278. data: {
  279. Content: [
  280. {
  281. SpaceId: SpaceId,
  282. TenantID: this.curTenantId
  283. }
  284. ]
  285. }
  286. }
  287. tnRelateOneZone(pa, res => { })
  288. },
  289. save() {
  290. this.$emit('refresh');
  291. this.drawer = false;
  292. }
  293. }
  294. }
  295. </script>
  296. <style lang="less" scoped>
  297. .room-count {
  298. .drawer-body {
  299. position: relative;
  300. padding: 10px 10px 30px;
  301. overflow-y: auto;
  302. .zone {
  303. padding: 6px 14px 22px;
  304. box-shadow: 0 0 3px #cacaca;
  305. p {
  306. margin-bottom: 4px;
  307. }
  308. .zoneItem {
  309. position: relative;
  310. padding: 2px 34px 2px 10px;
  311. border: 1px solid #ccc;
  312. border-radius: 4px;
  313. white-space: nowrap;
  314. overflow: hidden;
  315. text-overflow: ellipsis;
  316. i {
  317. position: absolute;
  318. right: 10px;
  319. top: 50%;
  320. transform: translateY(-50%);
  321. cursor: pointer;
  322. }
  323. }
  324. .zoneItem + .zoneItem {
  325. margin-top: 6px;
  326. }
  327. }
  328. .zone + .zone {
  329. margin-top: 10px;
  330. }
  331. }
  332. .btn {
  333. position: absolute;
  334. width: calc(100% - 20px);
  335. bottom: 20px;
  336. right: 20px;
  337. text-align: right;
  338. }
  339. }
  340. </style>