index1.vue 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946
  1. <template>
  2. <div
  3. v-if="!isBottom"
  4. id="header"
  5. class="ignore_com-top"
  6. >
  7. <Header :outWeather="outWeather" v-if="!isBottom"/>
  8. </div>
  9. <!-- <Comheader v-else color="#f7f8fa" id="header"></Comheader>-->
  10. <div class="envmonitor" id="env">
  11. <div class="envmonitor-content"
  12. :style="{overflow:isBottom?'hidden':'auto'}"
  13. id="envContent"
  14. >
  15. <div class="envmonitor-box" id="envBox">
  16. <img
  17. class="top-bg"
  18. :style="{opacity:opacityV}"
  19. v-show="!hideTopImg"
  20. :src="topbgimg"
  21. alt=""
  22. >
  23. <div :class="!isBottom?'content ptheader':''">
  24. <div class="house"
  25. :style="{opacity:opacityV}"
  26. id="house"
  27. v-show="!hideTopImg"
  28. >
  29. <img
  30. v-show="headerInfo.headImg"
  31. :src="headerInfo.headImg"
  32. alt=""
  33. >
  34. </div>
  35. <div class="house-des"
  36. :class="isBottom?'house-des-bottom':'house-des-top'"
  37. id="houseDes"
  38. >
  39. <div class="house-scrool-icon">
  40. <img :src="parseImgUrl('map-new-icon','scrool.svg')" alt="">
  41. </div>
  42. <div class="house-top">
  43. <div class="house-name">
  44. {{ localName }}
  45. </div>
  46. <!-- &lt;!&ndash; 个人办公室 &ndash;&gt;-->
  47. <!-- <div class="house-device"-->
  48. <!-- v-if="roomType=='个人'"-->
  49. <!-- >-->
  50. <!-- &lt;!&ndash; <span>设备将在 <i>21:30</i> 关闭</span>&ndash;&gt;-->
  51. <!-- <span>{{ headerInfo.headScene }}</span>-->
  52. <!-- <VanIcon-->
  53. <!-- :name="deviceIcon"-->
  54. <!-- class="device-arrow"-->
  55. <!-- />-->
  56. <!-- </div>-->
  57. <!-- 会议室(场景) -->
  58. <div class="house-device"
  59. @click="handlePopup('scenario')"
  60. v-if="roomType=='会议室'"
  61. >
  62. <!-- <span>设备将在 <i>21:30</i> 关闭</span>-->
  63. <span>{{ headerInfo.headScene }}</span>
  64. <VanIcon
  65. :name="deviceIcon"
  66. class="device-arrow"
  67. />
  68. </div>
  69. <!-- 开放区域 -->
  70. <!-- v-if="roomType=='开放' && spaceExistenceDevice.light"-->
  71. <div class="house-device" v-if="false">
  72. <span
  73. class="btn-off-work"
  74. v-if="showWorkOff"
  75. @click.stop="handlePreClose"
  76. >提前关闭</span>
  77. <span
  78. v-if="headerInfo.tipTextSwatch"
  79. class="tmp-title"
  80. @click.stop="handlePopup('timer')"
  81. >{{ headerInfo.tipText }}</span>
  82. <span
  83. class="tmp-title"
  84. @click.stop="handlePopup('timer')"
  85. v-show="!headerInfo.tipTextSwatch && spaceExistenceDevice.light"
  86. >
  87. 设备将在
  88. <i>{{ headerInfo.tipText }}</i>
  89. 关闭</span>
  90. <VanIcon
  91. name="arrow"
  92. class="device-arrow"
  93. />
  94. </div>
  95. </div>
  96. <div class="house-row">
  97. <div
  98. class="house-col"
  99. v-for="(item,index) in realEevList"
  100. @click="handleDetail(item)"
  101. :key="'env'+index"
  102. >
  103. <template v-if="item.num">
  104. <p>{{ item.name }}</p>
  105. <p>{{ item.num }}</p>
  106. <p>{{ item.level }}</p>
  107. </template>
  108. </div>
  109. </div>
  110. </div>
  111. <Air v-if="officeData.temperature || spaceExistenceDevice.airConditioner"
  112. id="airId"
  113. key="airId"
  114. @updateAirTemp="updateAirTemp"
  115. :hasAir="spaceExistenceDevice.airConditioner"
  116. :airVolumes="officeData.airVolumes"
  117. :temperature="officeData.temperature"
  118. :spaceId="spaceInfo.spaceId"
  119. :projectId="projectId"
  120. :isACATVA="isACATVA"
  121. :userIsControl="userIsControl"
  122. />
  123. <Light v-if="spaceExistenceDevice.light"
  124. id="lightId"
  125. key="lightId"
  126. :userIsControl="userIsControl"
  127. :spaceId="spaceInfo.spaceId"
  128. :projectId="projectId"
  129. />
  130. <Curtain :spaceId="spaceInfo.spaceId"
  131. id="curtainId"
  132. key="curtainId"
  133. :userIsControl="userIsControl"
  134. v-if="spaceExistenceDevice.curtain"
  135. :projectId="projectId"
  136. />
  137. </div>
  138. </div>
  139. </div>
  140. <van-popup v-model:show="showScenario" position="bottom">
  141. <scenario
  142. v-if="popupType==='scenario'"
  143. :popList="popList"
  144. :spaceId="spaceInfo.spaceId"
  145. :projectId="projectId"
  146. @setHeadScene="setHeadScene"
  147. :vanPopupIndex="vanPopupIndex"
  148. ></scenario>
  149. <timeBox
  150. @setWorkTime="setWorkTime"
  151. :spaceId="spaceInfo.spaceId"
  152. :workInfo="workInfo"
  153. :projectId="projectId"
  154. :nextCusStartTime="nextCusStartTime"
  155. :cusStartTime="cusStartTime"
  156. :cusEndTime="cusEndTime"
  157. v-else
  158. ></timeBox>
  159. </van-popup>
  160. <van-dialog v-model:show="showSecenDetailDalig"
  161. class="dialog-width"
  162. :show-confirm-button="false"
  163. :show-cancel-button="false"
  164. >
  165. <div class="air-dialog-content">
  166. <div class="dialog-top">
  167. <img
  168. class="img-yellow"
  169. v-if="sceneDetail.img"
  170. :src="parseImgUrl('page-officehome',sceneDetail.img)" alt=""
  171. >
  172. </div>
  173. <div class="secen-title">
  174. 切换至{{ sceneDetail.name }}场景
  175. </div>
  176. <div class="scene-popup-body">
  177. <div
  178. class="body-item"
  179. v-for="(item,idx) in sceneDetail.textObj"
  180. :key="idx"
  181. >
  182. <van-icon
  183. name="passed"
  184. style="color:#07C160;margin-right:8px"
  185. v-if="item.status=== 'ok'"
  186. />
  187. <span
  188. class="text-status"
  189. v-if="item.status=== 'go'"
  190. ></span>
  191. <span
  192. class="text-status grey"
  193. v-if="item.status=== 'grey'"
  194. ></span>
  195. <span>{{ item.text }}</span>
  196. </div>
  197. </div>
  198. <div class="dialog-btns" @click="showSecenDetailDalig = false">
  199. <span>隐藏</span>
  200. </div>
  201. </div>
  202. </van-dialog>
  203. <van-popup v-model:show="showSpaceTip" class="space-tip">
  204. <div class="space-tip-close" @click="closeTip">
  205. <img :src="parseImgUrl('page-officehome','close.svg')" alt="">
  206. </div>
  207. <div class="space-tip-title">
  208. 设置成功
  209. </div>
  210. <div class="space-tip-box">
  211. <span>单击</span>
  212. <img :src="parseImgUrl('page-officehome','mySpaceIcon.svg')" alt="">
  213. <span>可打开常驻空间的调节页面</span>
  214. </div>
  215. </van-popup>
  216. </div>
  217. <nav-bar :navList="navList"
  218. ref="childRef"
  219. id="nav"
  220. @changeNav="changeNav"
  221. v-if="!isBottom"
  222. ></nav-bar>
  223. </template>
  224. <script lang="ts">
  225. import { defineComponent, reactive, toRefs, ref, onBeforeMount, onMounted, nextTick, onBeforeUnmount } from 'vue'
  226. import MapBox from '@/views/envmonitor/MapBox.vue'
  227. import Header from '@/components/header/Index.vue'
  228. import Comheader from '@/components/header/Comheader.vue'
  229. import Scenario from '@/views/envmonitor/components/Scenario/Scenario.vue'
  230. import Air from '@/views/envmonitor/components/Air.vue'
  231. import Light from '@/views/envmonitor/components/Light.vue'
  232. import Curtain from '@/views/envmonitor/components/Curtain.vue'
  233. import TimeBox from '@/views/envmonitor/TimeBox.vue'
  234. import NavBar from '@/views/envmonitor/NavBar.vue'
  235. import { Icon, Popup, Dialog, Toast } from 'vant'
  236. import { useRouter, useRoute } from 'vue-router'
  237. import {
  238. getCompanyInfo,
  239. getWeather,
  240. getSpaceInfo,
  241. getMeetingSceneHttp,
  242. getSetTimeHttp,
  243. changeSetTimeHttp, getSpaceEquipType, getPermanentSpace, getUserControlAuth, getSpaceMode, getSpaceTemp
  244. } from '@/apis/envmonitor'
  245. import Keys from '@/constant/key'
  246. import {
  247. formatDate,
  248. getHours,
  249. getLocalNewSpaceInfo,
  250. getUserInfo,
  251. parseImgUrl,
  252. setLocalNewSpaceInfo,
  253. setQueryConfig
  254. } from '@/utils'
  255. import { store } from '@/store'
  256. import { UserMutationTypes } from '@/store/modules/user/mutation-types'
  257. import { SpaceInfoModel } from '@/model/userModel'
  258. import { getWorkType } from '@/utils/mapIcon'
  259. export default defineComponent({
  260. components: {
  261. MapBox,
  262. Scenario,
  263. Header,
  264. Comheader,
  265. NavBar,
  266. Air,
  267. Light,
  268. Curtain,
  269. TimeBox,
  270. [Dialog.Component.name]: Dialog.Component,
  271. VanPopup: Popup,
  272. VanIcon: Icon
  273. },
  274. setup() {
  275. const router: any = useRouter()
  276. const route: any = useRoute()
  277. const document: any = window.document
  278. const screenHeight: any = document.body.clientHeight
  279. const outWeather: any = {}
  280. // 空间数据(包括空间下的设备的状态)
  281. const officeData: any = {}
  282. let spaceEqFlagObj: SpaceInfoModel = {
  283. hasAir: true, // 有无空调
  284. hasBlowing: false, // 空调有无 变风量系统
  285. hasLamp: false //有无灯具
  286. }
  287. const popList: any = []
  288. // 空间类型
  289. let spaceInfo: any = {}
  290. const projectId: string = store.state.user.projectId
  291. const sceneDetail: any = {}
  292. const headerInfo: {
  293. headImg: any
  294. headScene: string
  295. tipText: string
  296. tipTextSwatch: boolean
  297. } = {
  298. headImg: '',
  299. headScene: '',
  300. tipText: '选择工作结束时间',
  301. tipTextSwatch: false
  302. }
  303. let spaceExistenceDevice: any = {
  304. 'curtain': false,
  305. 'light': false,
  306. 'airConditioner': false,
  307. 'bodySensor': false
  308. }
  309. let childRef: any = {}
  310. // let mapRef: any = {}
  311. let intervalTimer: any = null
  312. const workInfo: any = {}
  313. const userInfo: any = getUserInfo()
  314. let spaceTimer: any = null
  315. let listSen: any = [
  316. {
  317. id: 0,
  318. code: 'DISCUSSING',
  319. name: '会议模式',
  320. img: 'scene_work.svg',
  321. checked: true,
  322. textObj: [
  323. {
  324. text: '照明灯光已全部为您开启',
  325. status: 'ok'
  326. },
  327. {
  328. text: '演示设备已为您准备',
  329. status: 'ok'
  330. },
  331. {
  332. text: '空调已为您开启',
  333. type: 'air',
  334. status: 'ok'
  335. }
  336. ]
  337. },
  338. {
  339. id: 1,
  340. code: 'PROJECTING',
  341. name: '投影模式',
  342. img: 'scene_visitor.svg',
  343. checked: false,
  344. textObj: [
  345. {
  346. text: '主灯已为您关闭,氛围灯为您开启',
  347. status: 'ok'
  348. },
  349. {
  350. text: '演示设备已为您开启',
  351. status: 'ok'
  352. },
  353. {
  354. text: '空调已为您开启',
  355. type: 'air',
  356. status: 'ok'
  357. },
  358. {
  359. text: '窗帘已为您关闭',
  360. status: 'ok'
  361. }
  362. ]
  363. },
  364. {
  365. id: 2,
  366. code: 'ADJOURNMENT',
  367. name: '全关模式',
  368. img: 'scene_rest.svg',
  369. checked: false,
  370. textObj: [
  371. {
  372. text: '照明灯光2min后将全部关闭',
  373. status: 'ok'
  374. },
  375. {
  376. text: '演示设备已为您关闭',
  377. status: 'ok'
  378. },
  379. {
  380. text: '空调全部关闭',
  381. type: 'air',
  382. status: 'ok'
  383. },
  384. {
  385. text: '窗帘已为您关闭',
  386. status: 'ok'
  387. }
  388. ]
  389. }
  390. ]
  391. let userSpaceInfo: any = []
  392. let spaceModelTimer: any = null
  393. let spaceTempTimer: any = null
  394. let envlist: any = [
  395. {
  396. id: 0,
  397. name: 'CO₂',
  398. num: '',
  399. level: '',
  400. funcid: 'CO2',
  401. code: 'co2'
  402. },
  403. {
  404. id: 1,
  405. name: 'PM2.5',
  406. num: '',
  407. level: '',
  408. funcid: 'PM2d5',
  409. code: 'pm25'
  410. },
  411. {
  412. id: 2,
  413. name: '甲醛',
  414. num: '',
  415. level: '',
  416. funcid: 'HCHO',
  417. code: 'jiaquan'
  418. },
  419. {
  420. id: 3,
  421. name: '湿度',
  422. num: '',
  423. level: '',
  424. funcid: 'Tdb,RH',
  425. code: 'shidu'
  426. }
  427. ]
  428. let realEevList: any = [] // 解决v-if报错的问题临时使用
  429. const proxyData = reactive({
  430. parseImgUrl: parseImgUrl,
  431. localName: '',
  432. airTemp: '',
  433. userIsControl: false,
  434. spaceModelTimer: spaceModelTimer,
  435. spaceTempTimer: spaceTempTimer,
  436. userSpaceInfo: userSpaceInfo,
  437. spaceTimer: spaceTimer,
  438. workInfo: workInfo,
  439. intervalTimer: intervalTimer,
  440. roomType: '',
  441. showSpaceTip: false,
  442. mapOpacity: 0,
  443. opacityV: 1,
  444. childRef: childRef,
  445. // mapRef: mapRef,
  446. hideTopImg: false,
  447. isBottom: false,
  448. isScrool: false,
  449. officeData: officeData,
  450. popList: popList,
  451. popupType: 'scenario',
  452. showSecenDetailDalig: false,
  453. sceneDetail: sceneDetail,
  454. showScenario: false,
  455. projectId: projectId,
  456. spaceInfo: spaceInfo,
  457. headerInfo: headerInfo,
  458. topbgimg: '',
  459. userInfo: userInfo,
  460. deviceIcon: 'arrow',
  461. visible: false,
  462. outWeather: outWeather,
  463. vanPopupIndex: '',
  464. spaceEqFlagObj: spaceEqFlagObj,
  465. spaceExistenceDevice: spaceExistenceDevice,
  466. listOffice: [
  467. {
  468. id: 0,
  469. name: '工作',
  470. code: 'work',
  471. img: 'scene_work.svg',
  472. checked: true,
  473. textObj: [
  474. {
  475. text: '办公区灯光已全部为您开启',
  476. status: 'ok'
  477. },
  478. {
  479. text: '正在将温度调至 26℃',
  480. status: 'ok'
  481. },
  482. {
  483. text: '窗帘已为您全部打开',
  484. status: 'ok'
  485. },
  486. {
  487. text: '饮用水已为您准备',
  488. status: 'ok'
  489. }
  490. ]
  491. },
  492. {
  493. id: 1,
  494. name: '会客',
  495. code: 'guest',
  496. img: 'scene_visitor.svg',
  497. checked: false,
  498. textObj: [
  499. {
  500. text: '会客区照明已为您开启',
  501. status: 'ok'
  502. },
  503. {
  504. text: '空调已为您切换至会客温度,目标温度24℃',
  505. status: 'ok'
  506. },
  507. {
  508. text: '窗帘已为您全部开启',
  509. status: 'ok'
  510. },
  511. {
  512. text: '演示设备已为您准备',
  513. status: 'ok'
  514. },
  515. {
  516. text: '饮用水已为您准备',
  517. status: 'ok'
  518. }
  519. ]
  520. },
  521. {
  522. id: 2,
  523. name: '休息',
  524. code: 'rest',
  525. img: 'scene_rest.svg',
  526. checked: false,
  527. textObj: [
  528. {
  529. text: '主灯已关闭,氛围灯将为您开启',
  530. status: 'ok'
  531. },
  532. {
  533. text: '空调将为您调节至适宜休息的温度,目标温度26℃',
  534. status: 'ok'
  535. },
  536. {
  537. text: '窗帘已为您全部关闭',
  538. status: 'ok'
  539. }
  540. ]
  541. }
  542. ],
  543. listSen: listSen,
  544. isACATVA: false,
  545. showWorkOff: false,// 开放办公室的 提前关闭是否展示
  546. envlist: envlist,
  547. realEevList: realEevList,
  548. navList: [
  549. {
  550. top: 0,
  551. id: 'airId',
  552. code: 'air',
  553. name: '温度/湿度',
  554. noShow: true,
  555. img: parseImgUrl('page-officehome', 'temp.png'),
  556. activeImg: parseImgUrl('page-officehome', 'temp_active.svg')
  557. },
  558. {
  559. top: 0,
  560. id: 'lightId',
  561. code: 'lamp',
  562. name: '光照',
  563. noShow: false,
  564. img: parseImgUrl('page-officehome', 'lamp.png'),
  565. activeImg: parseImgUrl('page-officehome', 'lamp_active.svg')
  566. },
  567. {
  568. top: 0,
  569. id: 'curtainId',
  570. code: 'curtain',
  571. name: '窗帘',
  572. noShow: false,
  573. img: parseImgUrl('page-officehome', 'curtain-nav.svg'),
  574. activeImg: parseImgUrl('page-officehome', 'curtain-nav-active.svg')
  575. },
  576. {
  577. top: 0,
  578. id: 4,
  579. code: 'mySpace',
  580. name: '常驻空间',
  581. noShow: false,
  582. activeImg: parseImgUrl('page-officehome', 'mySpaceIcon.svg'),
  583. img: parseImgUrl('page-officehome', 'mySpaceIcon.svg')
  584. },
  585. {
  586. top: 0,
  587. id: 5,
  588. code: 'switchSpace',
  589. name: '我的',
  590. noShow: true,
  591. activeImg: parseImgUrl('page-officehome', 'mapIcon.png'),
  592. img: parseImgUrl('page-officehome', 'mapIcon.png')
  593. }
  594. ],
  595. // 上班=ATWORK 讨论=DISCUSSING 投影=PROJECTING 散会=ADJOURNMENT 下班=OFFWORK
  596. meetingRoomSence: [
  597. {
  598. code: 'DISCUSSING',
  599. name: '讨论'
  600. },
  601. {
  602. code: 'PROJECTING',
  603. name: '演示'
  604. },
  605. {
  606. code: 'ADJOURNMENT',
  607. name: '散会'
  608. }
  609. ],
  610. nextCusStartTime: 0, // 第二天服务定制开始时间
  611. cusEndTime: 0,
  612. cusStartTime: 0, // 当天服务定制-开始时间
  613. /**
  614. * 修改空间id
  615. * @param spaceId
  616. */
  617. changeSpaceId(spaceId: any) {
  618. proxyData.loadingStart()
  619. proxyData.spaceInfo.spaceId = spaceId
  620. proxyData.headerInfo.headScene = ''
  621. // 切换空间的时候先清除定时器
  622. proxyData.clearTimerSpaceInfo()
  623. proxyData.init()
  624. // 判断用户是否有可控制权限
  625. proxyData.checkUserSpace()
  626. },
  627. /**
  628. *
  629. * @param item
  630. */
  631. handleDetail(item: any) {
  632. router.push({
  633. path: '/envmonitor-detail',
  634. query: {
  635. funcid: item.funcid,
  636. spaceId: proxyData.spaceInfo.spaceId
  637. }
  638. })
  639. },
  640. // 获取公司信息
  641. async getCompanyInfo() {
  642. const res: any = await getCompanyInfo({ companyId: Keys.companyKey })
  643. const data = res.data
  644. // store.commit(UserMutationTypes.SET_PROJECT_ID, 'Pj1101080259')
  645. // const location: any = data.sagaCareCoords.split(',')
  646. // const targetLocationInfo: any = {
  647. // longitude: location[0],
  648. // latitude: location[1]
  649. // }
  650. // console.log(targetLocationInfo)
  651. },
  652. // 获取天气信息
  653. getWeather() {
  654. const params: any = {
  655. openid: proxyData.userInfo.openid,
  656. pubname: proxyData.userInfo.pubname,
  657. projectId: store.state.user.projectId
  658. }
  659. const str: string = setQueryConfig(params)
  660. getWeather(str).then(res => {
  661. const content: any = res?.content ?? {}
  662. proxyData.outWeather = content
  663. const text: string = content.text
  664. proxyData.getWeatherIcon(text)
  665. proxyData.getnowTime(text)
  666. })
  667. },
  668. // 设置当前背景图
  669. getnowTime(text: string) { // 头部背景图片
  670. const now = getHours()
  671. if (text.indexOf('霾') > -1) {
  672. proxyData.topbgimg = parseImgUrl('weather', 'office_smog.jpg')
  673. } else {
  674. if (now >= 6 && now < 19) {
  675. // 白天
  676. proxyData.topbgimg = parseImgUrl('weather', 'office_bright.jpg')
  677. } else {
  678. // 夜晚
  679. proxyData.topbgimg = parseImgUrl('weather', 'office_night.jpg')
  680. }
  681. }
  682. },
  683. // 设置天气icon
  684. getWeatherIcon(text: string) {
  685. if (text && text.indexOf('晴') > -1) {
  686. proxyData.outWeather.imgname = parseImgUrl('weather', 'sun.png')
  687. } else if (text && text.indexOf('雨') > -1) {
  688. proxyData.outWeather.imgname = parseImgUrl('weather', 'rain.png')
  689. } else if (text && text.indexOf('阴') > -1 || text.indexOf('云') > -1) {
  690. proxyData.outWeather.imgname = parseImgUrl('weather', 'cloudy.png')
  691. } else if (text && text.indexOf('霾') > -1) {
  692. proxyData.outWeather.imgname = parseImgUrl('weather', 'mai.png')
  693. } else if (text && text.indexOf('雾') > -1) {
  694. proxyData.outWeather.imgname = parseImgUrl('weather', 'fog.png')
  695. } else if (text && text.indexOf('风') > -1) {
  696. proxyData.outWeather.imgname = parseImgUrl('weather', 'wind.png')
  697. } else if (text && text.indexOf('雷') > -1) {
  698. proxyData.outWeather.imgname = parseImgUrl('weather', 'thunder.png')
  699. } else {
  700. proxyData.outWeather.imgname = parseImgUrl('weather', 'sun.png')
  701. }
  702. },
  703. // 判断空间类型
  704. checkSpaceType(roomFuncType: string) {
  705. let roomType: any = getWorkType(roomFuncType)
  706. if (roomType === '个人') {
  707. proxyData.roomType = '个人'
  708. proxyData.headerInfo.headImg = parseImgUrl('page-officehome', 'office_person_2.png')
  709. proxyData.headerInfo.headScene = '工作'
  710. proxyData.popList = proxyData.listOffice
  711. } else if (roomType === '会议室') {
  712. proxyData.roomType = '会议室'
  713. proxyData.popList = JSON.parse(JSON.stringify(proxyData.listSen))
  714. proxyData.headerInfo.headImg = parseImgUrl('page-officehome', 'office_normal_2.png')
  715. // 获取会议室场
  716. proxyData.getPageMeetingSceneHttp()
  717. } else if (roomType === '开放') {
  718. proxyData.roomType = '开放'
  719. proxyData.headerInfo.headImg = parseImgUrl('page-officehome', 'office_publi_2.png')
  720. } else {
  721. proxyData.roomType = '其它'
  722. proxyData.headerInfo.headImg = parseImgUrl('page-officehome', 'office_publi_2.png')
  723. }
  724. if (roomType !== '会议室') {
  725. proxyData.timerSpaceInfo()
  726. }
  727. },
  728. /**
  729. * 检查用户可使用的权限
  730. */
  731. checkUserSpace() {
  732. let flag: any = false
  733. // let flag: any = true
  734. for (let i = 0; i < proxyData.userSpaceInfo.length; i++) {
  735. if (proxyData.spaceInfo.spaceId === proxyData.userSpaceInfo[i].sp_id) {
  736. flag = true
  737. break
  738. }
  739. }
  740. proxyData.userIsControl = flag
  741. },
  742. /**
  743. * 获取用户控制权限
  744. */
  745. getUserControlAuth() {
  746. getUserControlAuth().then(res => {
  747. let resData: any = res
  748. if (resData.result === 'success') {
  749. proxyData.userSpaceInfo = resData.data
  750. } else {
  751. proxyData.userSpaceInfo = []
  752. }
  753. proxyData.checkUserSpace()
  754. }).catch(() => {
  755. proxyData.userSpaceInfo = []
  756. proxyData.checkUserSpace()
  757. })
  758. },
  759. // 获取空间信息
  760. getSpaceInfo() {
  761. // const userInfo =
  762. const data: any = {
  763. criteria: {
  764. spaceId: proxyData.spaceInfo.spaceId,
  765. projectId: proxyData.userInfo.projectId
  766. },
  767. pubname: proxyData.userInfo.pubname,
  768. openid: proxyData.userInfo.openid
  769. }
  770. getSpaceInfo(data).then(res => {
  771. const content: any = res?.content ?? []
  772. proxyData.officeData = content[0] ? content[0] : {}
  773. if (proxyData.officeData.localName) {
  774. proxyData.localName = proxyData.officeData.localName
  775. }
  776. if (proxyData.officeData.temperature) {
  777. proxyData.officeData.temperature = proxyData.officeData.temperature.toFixed(2) * 1
  778. }
  779. // 环境数据
  780. proxyData.checkSpaceType(proxyData.officeData.roomFuncType)
  781. proxyData.formatSpaceInfo(content)
  782. proxyData.setPageheight()
  783. proxyData.loadinngEnd()
  784. }).catch(() => {
  785. proxyData.loadinngEnd()
  786. })
  787. },
  788. // 定时调获取空调接口
  789. getSpaceModeTimer() {
  790. proxyData.spaceModelTimer = setTimeout(() => {
  791. proxyData.getSpaceMode()
  792. clearTimeout(proxyData.spaceModelTimer)
  793. proxyData.spaceModelTimer = null
  794. }, 1000)
  795. },
  796. // 获取运行模式
  797. getSpaceMode() {
  798. getSpaceMode().then(res => {
  799. proxyData.getSpaceModeTimer()
  800. }).catch(() => {
  801. proxyData.getSpaceModeTimer()
  802. })
  803. },
  804. // 定时调用获取温度
  805. getSpaceTempTimer() {
  806. proxyData.spaceTempTimer = setTimeout(() => {
  807. clearTimeout(proxyData.spaceTempTimer)
  808. proxyData.spaceTempTimer = null
  809. proxyData.getSpaceTemp()
  810. })
  811. },
  812. // 获取空间空调设备温度
  813. getSpaceTemp() {
  814. getSpaceTemp().then(res => {
  815. proxyData.getSpaceTempTimer()
  816. }).catch(() => {
  817. proxyData.getSpaceTempTimer()
  818. })
  819. },
  820. checkLevel(value: string, name: string) {
  821. let objList = {
  822. humidity: {
  823. range: [30, 70],
  824. text: ['干燥', '健康', '潮湿']
  825. },
  826. co2: {
  827. range: [800, 1000, 1500],
  828. text: ['健康', '达标', '略高', '超标']
  829. },
  830. pm25: {
  831. range: [35, 75, 115, 150, 250],
  832. text: ['健康', '良', '轻度污染', '中度污染', '重度污染', '严重污染']
  833. },
  834. hcho: {
  835. range: [0.1],
  836. text: ['健康', '超标']
  837. }
  838. }
  839. let sortArr = [value, ...objList[name].range].sort((a, b) => {
  840. return a - b
  841. })
  842. let level = sortArr.findIndex(item => item === value)
  843. let levelTxt = objList[name].text[level]
  844. return {
  845. level,
  846. levelTxt
  847. }
  848. },
  849. /**
  850. *设置当前页面的高度
  851. */
  852. setPageheight() {
  853. nextTick(() => {
  854. document.getElementById('envBox').style.height = document.getElementById('envBox').offsetHeight + 'px'
  855. })
  856. },
  857. // 空间信息数据格式化
  858. formatSpaceInfo(content: any = []) {
  859. proxyData.realEevList = []
  860. for (let i = 0; i < content.length; i++) {
  861. let item = content[i]
  862. if (item.co2 || item.co2 == 0) {
  863. proxyData.envlist[0].level = proxyData.checkLevel(item.co2, 'co2').levelTxt
  864. proxyData.envlist[0].num = item.co2
  865. } else {
  866. proxyData.envlist[0].level = ''
  867. proxyData.envlist[0].num = ''
  868. }
  869. if (item.pm25 || item.pm25 === 0) {
  870. proxyData.envlist[1].level = proxyData.checkLevel(item.pm25, 'pm25').levelTxt
  871. proxyData.envlist[1].num = item.pm25
  872. } else {
  873. proxyData.envlist[1].level = ''
  874. proxyData.envlist[1].num = ''
  875. }
  876. if (item.hcho || item.hcho == 0) {
  877. proxyData.envlist[2].level = proxyData.checkLevel(item.hcho, 'hcho').levelTxt
  878. proxyData.envlist[2].num = item.hcho.toFixed(2)
  879. } else {
  880. proxyData.envlist[2].level = ''
  881. proxyData.envlist[2].num = ''
  882. }
  883. if (item.humidity || item.humidity == 0) {
  884. proxyData.envlist[3].level = proxyData.checkLevel(item.humidity, 'humidity').levelTxt
  885. proxyData.envlist[3].num = item.humidity.toFixed(0)
  886. } else {
  887. proxyData.envlist[3].level = ''
  888. proxyData.envlist[3].num = ''
  889. }
  890. }
  891. // 只展示有数据的(之江定制)
  892. for (let i = 0; i < proxyData.envlist.length; i++) {
  893. if (proxyData.envlist[i].num) {
  894. proxyData.realEevList.push(proxyData.envlist[i])
  895. }
  896. }
  897. // 切换空间修改底部的位置
  898. proxyData.updateBottomPerstion()
  899. },
  900. // 获取会议室场景(如果是会议室的才调此接口)
  901. getPageMeetingSceneHttp() {
  902. const params: { spaceId: string } = {
  903. spaceId: proxyData.spaceInfo.spaceId
  904. }
  905. getMeetingSceneHttp(params).then(res => {
  906. // console.log('res====')
  907. // console.log(res)
  908. // debugger
  909. let resSen: string = res?.content ?? ''
  910. if (resSen === 'OFFWORK') {
  911. resSen = 'ADJOURNMENT'
  912. }
  913. let filterArr: any = []
  914. proxyData.listSen.map((item: any) => {
  915. if (item.code === resSen) {
  916. filterArr.push(item)
  917. }
  918. })
  919. // console.log('filterArr===')
  920. // console.log(filterArr)
  921. // debugger
  922. // // 根据code 获取场景的名字
  923. proxyData.headerInfo.headScene = filterArr[0] && filterArr[0].name ? filterArr[0].name : '全关模式'
  924. proxyData.vanPopupIndex = resSen ? resSen : ''
  925. // 定时调空间数据
  926. proxyData.timerSpaceInfo()
  927. }).catch(() => {
  928. proxyData.timerSpaceInfo()
  929. })
  930. },
  931. // 设置场景名称
  932. setHeadScene(headScene: any, data: any) {
  933. // console.log('场景刷新===')
  934. proxyData.headerInfo.headScene = headScene
  935. proxyData.sceneDetail = data
  936. proxyData.setHeadSceneAirTemp()
  937. // 隐藏当前弹窗
  938. proxyData.showScenario = false
  939. proxyData.showSecenDetailDalig = true
  940. },
  941. // 获取空调设备温度
  942. updateAirTemp(airTemp: any) {
  943. proxyData.airTemp = airTemp
  944. proxyData.setHeadSceneAirTemp()
  945. },
  946. // 设置场景切换时候的温度
  947. setHeadSceneAirTemp() {
  948. if (proxyData.sceneDetail && proxyData.sceneDetail.textObj && proxyData.sceneDetail.textObj.length) {
  949. if (proxyData.airTemp && (proxyData.sceneDetail.code == 'DISCUSSING' || proxyData.sceneDetail.code == 'PROJECTING')) {
  950. for (let i = 0; i < proxyData.sceneDetail.textObj.length; i++) {
  951. let item: any = proxyData.sceneDetail.textObj
  952. if (item.type === 'air') {
  953. item.text = item.text + ',目标温度' + proxyData.airTemp
  954. }
  955. }
  956. }
  957. }
  958. },
  959. // 修改加班时间
  960. setWorkTime() {
  961. proxyData.showScenario = false
  962. // 修改成功后获取服务定制时间
  963. proxyData.setTime()
  964. },
  965. // 提前关闭
  966. handlePreClose() {
  967. let endDate: any = formatDate()
  968. let endTime: any = getHours()
  969. if (endTime < 10) {
  970. endTime = `0${endTime}`
  971. }
  972. const params = {
  973. 'projectId': proxyData.projectId,
  974. 'objectId': proxyData.spaceInfo.spaceId, // 空间ID
  975. 'endDate': endDate, // 结束日期 "20210310",
  976. 'endTime': endTime + '0000', // 结束时间 "090000"
  977. 'type': 3 // 0 预约加班,1 取消,2 我来了/确定, 3 我走了
  978. }
  979. changeSetTimeHttp(params).then(res => {
  980. const resData: any = res
  981. if (resData.result == 'success') {
  982. proxyData.changeLampStatus()
  983. }
  984. })
  985. },
  986. // 提前关闭更改状态
  987. changeLampStatus() {
  988. proxyData.showWorkOff = false
  989. proxyData.headerInfo.tipText = '选择工作结束时间'
  990. proxyData.headerInfo.tipTextSwatch = true
  991. },
  992. // 获取空间下的设备信息
  993. getEquipments() {
  994. let params: { spaceId: string, projectId: string } = {
  995. spaceId: proxyData.spaceInfo.spaceId,
  996. projectId: proxyData.projectId
  997. }
  998. /**
  999. *重新获取设备的时候,先初始化数据
  1000. */
  1001. proxyData.spaceExistenceDevice = {
  1002. 'curtain': false,
  1003. 'light': false,
  1004. 'airConditioner': false,
  1005. 'bodySensor': false
  1006. }
  1007. let queryParams: any = setQueryConfig(params)
  1008. getSpaceEquipType(queryParams).then(res => {
  1009. let resData: any = res
  1010. if (resData.result === 'success') {
  1011. let data: any = resData?.data ?? []
  1012. for (let i = 0; i < data.length; i++) {
  1013. proxyData.spaceExistenceDevice[data[i]] = true
  1014. }
  1015. // if (proxyData.spaceExistenceDevice.airConditioner) {
  1016. // proxyData.navList[0].noShow = true
  1017. // } else {
  1018. // proxyData.navList[0].noShow = false
  1019. // }
  1020. // debugger
  1021. if (proxyData.spaceExistenceDevice.light) {
  1022. proxyData.navList[1].noShow = true
  1023. } else {
  1024. proxyData.navList[1].noShow = false
  1025. }
  1026. if (proxyData.spaceExistenceDevice.curtain) {
  1027. proxyData.navList[2].noShow = true
  1028. } else {
  1029. proxyData.navList[2].noShow = false
  1030. }
  1031. }
  1032. })
  1033. },
  1034. // 时间格式转换
  1035. hourMiChange(tempStr: number) {
  1036. // 转为时间 19.3 - 19:30 19.41-19:41 19-19:00
  1037. let str = tempStr.toString()
  1038. let newStr = ''
  1039. let dLen = str.length > 2 ? str.split('.')[1].length : str
  1040. if (dLen === 1) {
  1041. str = str.replace('.', '') + '0'
  1042. newStr = str.slice(0, 2) + ':' + str.slice(2)
  1043. } else if (dLen === 2) {
  1044. str = str.replace('.', '')
  1045. newStr = str.slice(0, 2) + ':' + str.slice(2)
  1046. } else {
  1047. newStr = str + ':00'
  1048. }
  1049. return newStr
  1050. },
  1051. // 获取灯灯定制时间
  1052. getSetTimeHttp() {
  1053. const params: { spaceId: string } = {
  1054. spaceId: proxyData.spaceInfo.spaceId
  1055. }
  1056. getSetTimeHttp(params).then(res => {
  1057. const resData = res
  1058. // debugger
  1059. const content = resData?.content ?? {}
  1060. // proxyData.workInfo = content
  1061. /* 可选日期和时间的规则是:
  1062. 当下时间至次日服务定制开始时间;
  1063. 如果没有服务定制时间,
  1064. 默认次日8:00 */
  1065. proxyData.nextCusStartTime = content.nextCusStartTime ? Math.floor(Number(content.nextCusStartTime / 10000)) : 9
  1066. /* 当时间早于 当天服务定制开始时间且不早于2个小时,当前时间-当天服务开始时间 ;
  1067. 否则,当天服务结束时间为开始-明天服务定制开始时间/明天8点
  1068. */
  1069. let date = formatDate('')
  1070. let tomText: string = '' // 明天 文案
  1071. let now = getHours() // 用户的时间
  1072. let cusEndTime: number = 0 // 服务定制 - 开始时间
  1073. let cusStartTime: number = 0 // 服务定制 - 结束时间
  1074. let changTime: number = 0 // 修改后的时间
  1075. proxyData.showWorkOff = false // 不显示提前关闭
  1076. /*
  1077. 先判断服务定制时间是否跨天,跨天以第二天的开始时间为准
  1078. */
  1079. // 修改以后的时间 endDate 和 endTime
  1080. // 当天
  1081. // debugger
  1082. if (content.endDate && date === content.endDate) {
  1083. changTime = Number(content.endTime / 10000)
  1084. tomText = ''
  1085. }
  1086. // 修改到明天
  1087. if (content.endDate && date !== content.endDate) {
  1088. changTime = Number(content.endTime / 10000) // 今天的时间肯定小于明天的 所以+24
  1089. tomText = '明天'
  1090. }
  1091. /* 无服务定制时间:
  1092. --- 时间弹窗 ----
  1093. 今天显示:当前时间开始,默认是当前时间+2小时
  1094. 次日显示:00点 - 8点
  1095. --- 有设置时间 ---
  1096. 1、 且 设置时间在当前时间之后,显示设置时间
  1097. 2、 且在当前时间之前,显示选择结束时间
  1098. */
  1099. // 无服务定制时间
  1100. if (!content.nextCusEndTime && !content.cusStartTime && content.endDate) {
  1101. let daTime = tomText ? changTime + 24 : changTime
  1102. // console.log('无服务定制', daTime);
  1103. if (now < daTime) {
  1104. proxyData.headerInfo.tipText = `${tomText}${proxyData.hourMiChange(changTime)}`
  1105. proxyData.headerInfo.tipTextSwatch = false
  1106. proxyData.showWorkOff = true // 提前关闭
  1107. proxyData.workInfo.textTime = proxyData.hourMiChange(changTime)
  1108. proxyData.workInfo.text = tomText ? tomText : '今天'
  1109. } else {
  1110. proxyData.headerInfo.tipText = '选择工作结束时间'
  1111. proxyData.headerInfo.tipTextSwatch = true
  1112. proxyData.workInfo.textTime = ''
  1113. proxyData.workInfo.text = ''
  1114. }
  1115. } else {
  1116. proxyData.headerInfo.tipText = '选择工作结束时间'
  1117. proxyData.headerInfo.tipTextSwatch = true
  1118. proxyData.workInfo.textTime = ''
  1119. proxyData.workInfo.text = ''
  1120. }
  1121. if (!content.cusEndTime) {
  1122. proxyData.cusStartTime = 0 // 今天的服务定制开始时间
  1123. proxyData.cusEndTime = 0 // 今天结束时间
  1124. return
  1125. }
  1126. // 无服务定制不走下面的代码
  1127. /*
  1128. 有服务定制:
  1129. 当天进来时间、用户修改时间、当天服务定制时间 显示判断;
  1130. 1、今天没有,明天有
  1131. 2、今天有,明天没有
  1132. 3、今天有,明天有
  1133. */
  1134. if (content.cusEndTime) {
  1135. cusStartTime = content.cusStartTime ? Number(content.cusStartTime / 10000) : 0
  1136. cusEndTime = content.cusEndTime ? Number(content.cusEndTime / 10000) : 0
  1137. proxyData.cusStartTime = Math.floor(cusStartTime) // 今天的服务定制开始时间
  1138. proxyData.cusEndTime = Math.floor(cusEndTime) // 今天的服务定制结束时间
  1139. }
  1140. // 1、用户时间 服务定制时间之内
  1141. // debugger
  1142. if (now >= cusStartTime && now < cusEndTime && !changTime) {
  1143. // console.log('当前时间,服务定制之内,没有更改时间')
  1144. proxyData.headerInfo.tipText = `${tomText}${proxyData.hourMiChange(cusEndTime)}`
  1145. proxyData.headerInfo.tipTextSwatch = false
  1146. } else if (now >= cusStartTime && now < cusEndTime && changTime) {
  1147. const daTime = (tomText ? changTime + 24 : changTime) > now ? changTime : cusEndTime
  1148. // console.log('当前时间,服务定制之内,有更改时间', daTime)
  1149. proxyData.headerInfo.tipText = `${tomText}${proxyData.hourMiChange(daTime)}`
  1150. proxyData.headerInfo.tipTextSwatch = false
  1151. proxyData.workInfo.textTime = proxyData.hourMiChange(daTime)
  1152. proxyData.workInfo.text = tomText ? tomText : '今天'
  1153. } else if (now >= cusEndTime && changTime) {//大于服务定制时间
  1154. // (tomText ? changTime + 24 : changTime) 判断changeTime是否跨天
  1155. if ((tomText ? changTime + 24 : changTime) >= now) {
  1156. // console.log('当前时间,服务定制之外,有更改时间且 修改时间大于当前');
  1157. cusEndTime = changTime
  1158. proxyData.headerInfo.tipText = `${tomText}${proxyData.hourMiChange(cusEndTime)}`
  1159. proxyData.headerInfo.tipTextSwatch = false
  1160. proxyData.showWorkOff = true
  1161. proxyData.workInfo.textTime = proxyData.hourMiChange(cusEndTime)
  1162. proxyData.workInfo.text = tomText ? tomText : '今天'
  1163. } else {
  1164. // console.log('当前时间,服务定制之外,有更改时间且 修改时间小于当前')
  1165. proxyData.headerInfo.tipTextSwatch = true
  1166. proxyData.headerInfo.tipText = '选择工作结束时间'
  1167. proxyData.workInfo.textTime = ''
  1168. proxyData.workInfo.text = ''
  1169. }
  1170. } else {
  1171. // proxyData.headerInfo.tipTextSwatch = false
  1172. proxyData.headerInfo.tipTextSwatch = true
  1173. proxyData.headerInfo.tipText = '选择工作结束时间'
  1174. // proxyData.headerInfo.tipText = `${tomText}${proxyData.hourMiChange(cusEndTime)}`
  1175. proxyData.workInfo.textTime = ''
  1176. proxyData.workInfo.text = ''
  1177. }
  1178. })
  1179. },
  1180. // 设置设备的关闭时间
  1181. setTime() {
  1182. proxyData.getSetTimeHttp()
  1183. },
  1184. // 点击切换会议室场景
  1185. handlePopup(type: string = 'scenario') {
  1186. if (proxyData.userIsControl) {
  1187. proxyData.showScenario = !proxyData.showScenario
  1188. if (proxyData.showScenario) {
  1189. proxyData.deviceIcon = 'arrow-down'
  1190. } else {
  1191. proxyData.deviceIcon = 'arrow'
  1192. }
  1193. proxyData.popupType = type
  1194. } else {
  1195. Toast('您没有当前空间的控制权限!')
  1196. }
  1197. },
  1198. /**
  1199. * 当没有环境参数的时候更新页面的位置
  1200. */
  1201. updateBottomPerstion() {
  1202. if (proxyData.isBottom) {
  1203. let ele: any = document.getElementById('envContent')
  1204. let houseEle: any = document.getElementById('houseDes')
  1205. let houseHeight: any = houseEle.offsetHeight
  1206. ele.style.top = (screenHeight - houseHeight) + 'px'
  1207. }
  1208. },
  1209. // 切换空间
  1210. triggerCheckSpace() {
  1211. let ele: any = document.getElementById('envContent')
  1212. let houseEle: any = document.getElementById('houseDes')
  1213. let houseHeight: any = houseEle.offsetHeight
  1214. proxyData.opacityV = 0
  1215. proxyData.mapOpacity = 1
  1216. ele.scrollTop = 0
  1217. let top: any = 0
  1218. let interval: any = setInterval(() => {
  1219. top = top + 15
  1220. if (top < screenHeight - houseHeight) {
  1221. ele.style.top = top + 'px'
  1222. } else {
  1223. ele.style.top = (screenHeight - houseHeight) + 'px'
  1224. clearInterval(interval)
  1225. }
  1226. }, 10)
  1227. proxyData.hideTopImg = true
  1228. proxyData.isBottom = true
  1229. },
  1230. /**
  1231. * 切换导航滑动页面
  1232. */
  1233. changeNav(item: any) {
  1234. if (item.code === 'switchSpace') {
  1235. proxyData.triggerCheckSpace()
  1236. } else if (item.code === 'mySpace') { // 查看常驻空间
  1237. proxyData.getPermanentSpace()
  1238. } else {
  1239. nextTick(() => {
  1240. let activeNav: any = proxyData.setNarTop()
  1241. let envContentEle: any = document.getElementById('envContent')
  1242. activeNav.map((navItem: any, index: any) => {
  1243. if (index === 0) {
  1244. envContentEle.scrollTop = 0
  1245. return
  1246. }
  1247. if (item.code === navItem.code) {
  1248. envContentEle.scrollTop = navItem.top
  1249. return
  1250. }
  1251. })
  1252. })
  1253. }
  1254. },
  1255. /**
  1256. * 加载loading
  1257. */
  1258. loadingStart() {
  1259. Toast.loading({
  1260. duration: 0, // 持续展示 toast
  1261. forbidClick: true,
  1262. message: '加载中...'
  1263. })
  1264. },
  1265. /**
  1266. * 结束
  1267. */
  1268. loadinngEnd() {
  1269. Toast.clear()
  1270. },
  1271. /**
  1272. * 获取常驻空间
  1273. */
  1274. getPermanentSpace() {
  1275. proxyData.loadingStart()
  1276. getPermanentSpace().then(res => {
  1277. // debugger
  1278. let resResult: any = res
  1279. if (resResult.result === 'success') {
  1280. proxyData.spaceInfo = resResult.data
  1281. // 判断用户控制权限
  1282. proxyData.getUserControlAuth()
  1283. proxyData.init()
  1284. nextTick(() => {
  1285. // proxyData.mapRef.init(proxyData.spaceInfo)
  1286. })
  1287. }
  1288. proxyData.loadinngEnd()
  1289. }).catch(() => {
  1290. proxyData.loadinngEnd()
  1291. })
  1292. },
  1293. /**
  1294. * 判断当前用户是否设置过常驻空间
  1295. */
  1296. checkPermanetSpace() {
  1297. getPermanentSpace().then(res => {
  1298. let resResult: any = res ? res : {}
  1299. if (resResult.result === 'success') {
  1300. if (resResult.data && resResult.data.isPermanent) {
  1301. proxyData.navList[3].noShow = true
  1302. } else {
  1303. proxyData.navList[3].noShow = false
  1304. }
  1305. }
  1306. proxyData.loadinngEnd()
  1307. }).catch(() => {
  1308. proxyData.loadinngEnd()
  1309. })
  1310. }
  1311. ,
  1312. /**
  1313. * 设置导航的id
  1314. */
  1315. setNarTop() {
  1316. let navHeight: any = document.getElementById('nav').offsetHeight
  1317. let activeNav: any = proxyData.navList.filter((item: any, index: any) => {
  1318. if (item.noShow && index < 3) {
  1319. return item
  1320. }
  1321. })
  1322. activeNav.map((item: any) => {
  1323. let id: any = item.id
  1324. if (id) {
  1325. let cardEle = document.getElementById(id)
  1326. if (cardEle) {
  1327. let cartHeight = cardEle.offsetHeight
  1328. item.cartHeight = cartHeight
  1329. let top: any = cardEle.offsetTop - screenHeight / 2 + cartHeight / 2 + navHeight / 2
  1330. item.top = top
  1331. }
  1332. }
  1333. })
  1334. return activeNav
  1335. }
  1336. ,
  1337. /**
  1338. * 获取竖着的方向
  1339. */
  1340. envScrollTop() {
  1341. let envContentEle: any = document.getElementById('envContent')
  1342. envContentEle.addEventListener('scroll', () => {
  1343. if (!proxyData.isBottom) {
  1344. let scrollTop = envContentEle.scrollTop
  1345. let activeNav: any = proxyData.setNarTop()
  1346. activeNav.map((item: any, index: any) => {
  1347. if (index > 0) {
  1348. if (scrollTop <= item.top && scrollTop > activeNav[index - 1].top) {
  1349. proxyData.childRef.setActiveCode(item.code)
  1350. }
  1351. } else {
  1352. if (scrollTop <= item.top) {
  1353. proxyData.childRef.setActiveCode(item.code)
  1354. }
  1355. }
  1356. })
  1357. }
  1358. })
  1359. }
  1360. ,
  1361. /**
  1362. * 设备滑动效果
  1363. */
  1364. envmonitorMove() {
  1365. let ele: any = document.getElementById('envContent')
  1366. let houseEle: any = document.getElementById('houseDes')
  1367. let houseImgEle: any = document.getElementById('house')
  1368. let top: number = 0
  1369. let nowTop: number = 0
  1370. let temp: number = 0
  1371. const tempMove: number = 60
  1372. let houseHeight: number = 0
  1373. let houseImgHeight: number = 0
  1374. let beginY: any, endY: any, moveY: any = 0
  1375. ele.addEventListener('touchstart', function(event: any) {
  1376. event.stopPropagation()
  1377. houseHeight = houseEle.offsetHeight
  1378. // console.log('houseHeight===')
  1379. // console.log(houseHeight)
  1380. houseImgHeight = houseImgEle.offsetHeight
  1381. beginY = event.targetTouches[0].pageY
  1382. top = parseInt(ele.style.top) ? parseInt(ele.style.top) : 0
  1383. temp = 0.01
  1384. })
  1385. ele.addEventListener('touchmove', function(event: any) {
  1386. event.stopPropagation()
  1387. nowTop = parseInt(ele.style.top) ? parseInt(ele.style.top) : 0
  1388. endY = event.targetTouches[0].pageY
  1389. moveY = endY - beginY
  1390. temp = temp + 0.01
  1391. if (moveY > 0) { // 向下
  1392. proxyData.opacityV = 1 - temp <= 0 ? 0 : 1 - temp
  1393. if (moveY > tempMove) {
  1394. proxyData.hideTopImg = true
  1395. proxyData.mapOpacity = 1 + temp >= 1 ? 1 : 1 + temp
  1396. } else {
  1397. proxyData.hideTopImg = false
  1398. }
  1399. if (proxyData.hideTopImg) {
  1400. ele.style.top = moveY + (245 - 50) + 'px'
  1401. } else {
  1402. ele.style.top = moveY + 'px'
  1403. }
  1404. } else { // 向上
  1405. if (nowTop <= 0) { // 滑动顶部后不让再滑动
  1406. ele.style.top = 0 + 'px'
  1407. } else {
  1408. if (Math.abs(top + moveY) <= 256) {
  1409. proxyData.hideTopImg = false
  1410. proxyData.opacityV = temp <= 1 ? temp : 1
  1411. proxyData.mapOpacity = 1 - temp <= 0 ? 0 : 1 - temp
  1412. ele.style.top = top + moveY - 256 + 'px'
  1413. } else {
  1414. proxyData.hideTopImg = true
  1415. proxyData.mapOpacity = temp <= 1 ? temp : 1
  1416. ele.style.top = top + moveY + 'px'
  1417. }
  1418. if (Math.abs(moveY) > houseHeight) {
  1419. proxyData.mapOpacity = 0
  1420. proxyData.isBottom = false
  1421. }
  1422. }
  1423. }
  1424. })
  1425. ele.addEventListener('touchend', function(event: any) {
  1426. if (moveY === 0) {
  1427. return
  1428. }
  1429. event.stopPropagation()
  1430. if (moveY > 0) { // 向下
  1431. if (moveY > tempMove) {
  1432. proxyData.hideTopImg = true
  1433. } else {
  1434. proxyData.hideTopImg = false
  1435. }
  1436. } else { //向上
  1437. if (Math.abs(moveY) > tempMove) {
  1438. proxyData.hideTopImg = false
  1439. } else {
  1440. proxyData.hideTopImg = true
  1441. }
  1442. }
  1443. if (proxyData.hideTopImg) {
  1444. proxyData.opacityV = 0
  1445. proxyData.mapOpacity = 1
  1446. ele.style.top = (screenHeight - houseHeight) + 'px'
  1447. proxyData.isBottom = true
  1448. } else {
  1449. proxyData.opacityV = 1
  1450. proxyData.mapOpacity = 0
  1451. if (nowTop <= 0) { // 页面滚动
  1452. ele.style.top = 0 + 'px'
  1453. } else {
  1454. ele.style.top = 0 + 'px'
  1455. }
  1456. proxyData.isBottom = false
  1457. }
  1458. })
  1459. }
  1460. ,
  1461. // 关闭提示弹窗
  1462. closeTip() {
  1463. proxyData.showSpaceTip = false
  1464. clearInterval(proxyData.intervalTimer)
  1465. }
  1466. ,
  1467. // 清除定时器
  1468. clearTimerSpaceInfo() {
  1469. if (proxyData.spaceTimer) {
  1470. clearTimeout(proxyData.spaceTimer)
  1471. proxyData.spaceTimer = null
  1472. }
  1473. },
  1474. // 定时调空间
  1475. timerSpaceInfo() {
  1476. proxyData.clearTimerSpaceInfo()
  1477. proxyData.spaceTimer = setTimeout(() => {
  1478. proxyData.getSpaceInfo()
  1479. }, 2000)
  1480. },
  1481. /**
  1482. * 空间相关的接口
  1483. */
  1484. init() {
  1485. proxyData.getSpaceInfo()
  1486. proxyData.timerSpaceInfo()
  1487. // 获取空间下的设备信息
  1488. proxyData.getEquipments()
  1489. proxyData.setTime()
  1490. // 定时获取空间模式
  1491. // proxyData.getSpaceModeTimer()
  1492. },
  1493. /**
  1494. *删除参数
  1495. */
  1496. updatePageUrl() {
  1497. let history: any = window.history
  1498. let url: any = window.location.origin + window.location.pathname
  1499. history.replaceState('', '', url)
  1500. },
  1501. // 定时关闭提示框
  1502. setTimerCloseTip() {
  1503. let timeNum: number = 0
  1504. proxyData.intervalTimer = setInterval(() => {
  1505. timeNum++
  1506. if (timeNum > 2) {
  1507. proxyData.showSpaceTip = false
  1508. clearInterval(proxyData.intervalTimer)
  1509. proxyData.updatePageUrl()
  1510. }
  1511. }, 1000)
  1512. }
  1513. // 存储当前项目id
  1514. })
  1515. nextTick(() => {
  1516. proxyData.envmonitorMove()
  1517. proxyData.envScrollTop()
  1518. })
  1519. onBeforeUnmount(() => {
  1520. if (proxyData.spaceTimer) {
  1521. clearTimeout(proxyData.spaceTimer)
  1522. proxyData.spaceTimer = null
  1523. }
  1524. })
  1525. onMounted(() => {
  1526. if (route.query.showSpaceTip === 'true') {
  1527. proxyData.showSpaceTip = true
  1528. proxyData.setTimerCloseTip()
  1529. } else {
  1530. proxyData.showSpaceTip = false
  1531. }
  1532. // 获取天气信息
  1533. proxyData.spaceInfo = getLocalNewSpaceInfo()
  1534. if (proxyData.spaceInfo && proxyData.spaceInfo.spaceId) {
  1535. // 判断用户控制权限
  1536. proxyData.getUserControlAuth()
  1537. proxyData.init()
  1538. } else {
  1539. proxyData.getPermanentSpace()
  1540. }
  1541. proxyData.checkPermanetSpace()
  1542. proxyData.getWeather()
  1543. })
  1544. return {
  1545. ...toRefs(proxyData)
  1546. }
  1547. }
  1548. })
  1549. </script>
  1550. <style lang="scss" scoped>
  1551. .envmonitor {
  1552. position: relative;
  1553. width: 100%;
  1554. height: 100%;
  1555. overflow: hidden;
  1556. .map-content {
  1557. position: absolute;
  1558. top: 0;
  1559. width: 100%;
  1560. height: 100%;
  1561. padding-bottom: 120px;
  1562. //overflow: scroll;
  1563. overflow: hidden;
  1564. z-index: 222;
  1565. padding-top: 10px;
  1566. background: #f7f8fa;
  1567. }
  1568. .top-bg {
  1569. width: 100%;
  1570. height: 256px;
  1571. border: none;
  1572. }
  1573. .envmonitor-content {
  1574. position: absolute;
  1575. width: 100%;
  1576. height: 100%;
  1577. top: 0;
  1578. left: 0;
  1579. z-index: 333;
  1580. overflow: auto;
  1581. }
  1582. .envmonitor-box {
  1583. //position: relative;
  1584. //height: auto;
  1585. width: 100%;
  1586. height: 100%;
  1587. //overflow-x: hidden;
  1588. //z-index: 444;
  1589. }
  1590. .content {
  1591. width: 88%;
  1592. margin: 0 auto;
  1593. padding-bottom: 200px;
  1594. }
  1595. .house {
  1596. box-sizing: border-box;
  1597. margin-top: -242px;
  1598. height: 207px;
  1599. background: #FFFFFF;
  1600. //border-bottom: 5px solid #FFFFFF;
  1601. border-bottom: none;
  1602. //box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.07), 0px 4px 10px rgba(0, 0, 0, 0.05);
  1603. border-radius: 25px 25px 0 0;
  1604. img {
  1605. border-radius: 25px 25px 0 0;
  1606. border-top: 8px solid #fff;
  1607. border-right: 8px solid #fff;
  1608. border-left: 8px solid #fff;
  1609. //object-fit: contain;
  1610. background: #fff;
  1611. width: 100%;
  1612. height: 100%;
  1613. }
  1614. }
  1615. .house-des {
  1616. position: relative;
  1617. z-index: 111;
  1618. width: 100%;
  1619. //height: 128px;
  1620. padding-left: 14px;
  1621. padding-right: 14px;
  1622. padding-top: 10px;
  1623. padding-bottom: 10px;
  1624. background: #FFFFFF;
  1625. border-top: none;
  1626. margin-top: -1px;
  1627. box-sizing: border-box;
  1628. //box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.07), 0px 4px 10px rgba(0, 0, 0, 0.05);
  1629. .house-scrool-icon {
  1630. position: absolute;
  1631. top: 2px;
  1632. left: 50%;
  1633. transform: translateX(-50%);
  1634. }
  1635. }
  1636. .house-des-top {
  1637. border-radius: 0 0 25px 25px;
  1638. }
  1639. .house-des-bottom {
  1640. padding-top: 10px;
  1641. border-radius: 25px 25px 0 0;
  1642. box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.07), 0px -1px 1px rgba(0, 0, 0, 0.05);
  1643. }
  1644. .house-top {
  1645. display: flex;
  1646. height: 23px;
  1647. padding-top: 5px;
  1648. padding-left: 10px;
  1649. padding-right: 10px;
  1650. line-height: 23px;
  1651. justify-content: space-between;
  1652. .house-name {
  1653. height: 23px;
  1654. font-size: 18px;
  1655. }
  1656. .house-device {
  1657. height: 23px;
  1658. position: relative;
  1659. text-align: right;
  1660. padding-right: 15px;
  1661. flex: 1;
  1662. //width: 100px;
  1663. font-family: PingFang SC;
  1664. font-size: 14px;
  1665. line-height: 14px;
  1666. .btn-off-work {
  1667. position: absolute;
  1668. bottom: 50px;
  1669. right: 10px;
  1670. width: 64px;
  1671. height: 20px;
  1672. background: #000000;
  1673. border-radius: 4px;
  1674. font-size: 12px;
  1675. font-weight: 400;
  1676. line-height: 20px;
  1677. text-align: center;
  1678. color: #ffffff;
  1679. }
  1680. span {
  1681. display: inline-block;
  1682. vertical-align: middle;
  1683. line-height: 23px;
  1684. }
  1685. i {
  1686. display: inline-block;
  1687. vertical-align: middle;
  1688. font-style: normal;
  1689. padding: 0 3px;
  1690. font-size: 18px;
  1691. }
  1692. .tmp-title {
  1693. font-size: 10px;
  1694. }
  1695. .device-arrow {
  1696. position: absolute;
  1697. right: -15px;
  1698. top: 50%;
  1699. transform: translateY(-50%);
  1700. font-size: 14px;
  1701. color: #4D5262;
  1702. }
  1703. }
  1704. }
  1705. .house-row {
  1706. display: flex;
  1707. padding-top: 13px;
  1708. }
  1709. .house-col {
  1710. //flex: 1;
  1711. width: 25%;
  1712. text-align: center;
  1713. font-family: Montserrat;
  1714. font-style: normal;
  1715. font-weight: 600;
  1716. font-size: 12px;
  1717. line-height: 15px;
  1718. text-align: center;
  1719. color: #C4C4C4;
  1720. p {
  1721. display: block;
  1722. &:nth-child(2) {
  1723. font-family: Montserrat;
  1724. font-style: normal;
  1725. font-weight: normal;
  1726. font-size: 24px;
  1727. padding: 5px 0;
  1728. line-height: 24px;
  1729. text-align: center;
  1730. color: #1B144E;
  1731. }
  1732. }
  1733. }
  1734. .scene-popup-body {
  1735. display: flex;
  1736. flex-direction: column;
  1737. margin-left: 36px;
  1738. margin-top: 20px;
  1739. margin-right: 10px;
  1740. &.air-popup-body {
  1741. flex-direction: row;
  1742. margin: 0;
  1743. justify-content: center;
  1744. }
  1745. .body-item {
  1746. padding-top: 10px;
  1747. font-style: normal;
  1748. font-weight: 500;
  1749. font-size: 14px;
  1750. line-height: 21px;
  1751. color: #c4c4c4;
  1752. .text-status {
  1753. width: 16px;
  1754. height: 16px;
  1755. background: #f0da21;
  1756. border-radius: 100%;
  1757. display: inline-block;
  1758. margin-right: 16px;
  1759. &.grey {
  1760. background: #f3f3f3;
  1761. }
  1762. }
  1763. }
  1764. }
  1765. .dialog-width {
  1766. width: 280px !important;
  1767. }
  1768. .air-dialog-content {
  1769. position: relative;
  1770. width: 100%;
  1771. height: 360px;
  1772. .dialog-top {
  1773. position: relative;
  1774. height: 70px;
  1775. background: #F3F3F3;
  1776. .img-yellow {
  1777. background: #FFE823;
  1778. }
  1779. img {
  1780. box-sizing: border-box;
  1781. border-radius: 50%;
  1782. position: absolute;
  1783. left: 50%;
  1784. width: 70px;
  1785. height: 70px;
  1786. padding: 17px;
  1787. transform: translateX(-50%);
  1788. top: 15px;
  1789. }
  1790. }
  1791. .secen-title {
  1792. display: block;
  1793. text-align: center;
  1794. font-family: Black Han Sans;
  1795. font-style: normal;
  1796. font-weight: normal;
  1797. font-size: 17px;
  1798. line-height: 21px;
  1799. margin-top: 20px;
  1800. padding-top: 14px;
  1801. align-items: center;
  1802. text-align: center;
  1803. }
  1804. }
  1805. .dialog-btns {
  1806. position: absolute;
  1807. left: 50%;
  1808. bottom: 20px;
  1809. transform: translateX(-50%);
  1810. text-align: center;
  1811. margin: 0 auto;
  1812. width: 88px;
  1813. height: 46px;
  1814. line-height: 1;
  1815. color: #4D5262;
  1816. background: #FFFFFF;
  1817. box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.05), 0px 4px 15px rgba(0, 0, 0, 0.15);
  1818. border-radius: 25px;
  1819. cursor: pointer;
  1820. span {
  1821. height: 46px;
  1822. line-height: 46px;
  1823. display: inline-block;
  1824. }
  1825. }
  1826. }
  1827. </style>
  1828. <style lang="scss">
  1829. .space-tip {
  1830. width: 320px;
  1831. //height: 120px;
  1832. background: #FFFFFF;
  1833. box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 10px rgba(0, 0, 0, 0.1);
  1834. border-radius: 12px;
  1835. .space-tip-close {
  1836. padding-top: 10px;
  1837. padding-bottom: 10px;
  1838. padding-right: 10px;
  1839. text-align: right;
  1840. img {
  1841. width: 24px;
  1842. height: 24px;
  1843. }
  1844. }
  1845. .space-tip-title {
  1846. padding-bottom: 10px;
  1847. color: #000000;
  1848. opacity: 0.9;
  1849. font-size: 16px;
  1850. line-height: 20px;
  1851. text-align: center;
  1852. }
  1853. .space-tip-box {
  1854. font-style: normal;
  1855. padding-bottom: 35px;
  1856. font-weight: 400;
  1857. font-size: 17px;
  1858. line-height: 24px;
  1859. text-align: center;
  1860. color: rgba(0, 0, 0, 0.5);
  1861. span {
  1862. display: inline-block;
  1863. vertical-align: middle;
  1864. }
  1865. img {
  1866. vertical-align: middle;
  1867. margin-left: 3px;
  1868. width: 21px;
  1869. margin-right: 3px;
  1870. }
  1871. }
  1872. }
  1873. </style>
  1874. <style lang="scss">
  1875. .air-dialog-content {
  1876. .van-button_text {
  1877. color: $elActiveColor;
  1878. }
  1879. }
  1880. </style>