index.vue 58 KB

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