index.vue 59 KB

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