index.vue 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541
  1. <template >
  2. <el-card class="box-card">
  3. <div slot="header" class="clearfix">
  4. <div class="header-left">
  5. <span class="title">房态管理 </span>
  6. <span> / 共{{ roomData.length }}间</span>
  7. </div>
  8. <div class="header-right">
  9. <el-input
  10. placeholder="请输入姓名或者房间号"
  11. prefix-icon="el-icon-search"
  12. class="inquire-input"
  13. >
  14. </el-input>
  15. <el-button class="inquire-button">查询</el-button>
  16. <div class="control">
  17. <div class="title" @click="water = !water" style="cursor: pointer">
  18. 批量控制电
  19. </div>
  20. <ul v-show="water">
  21. <li
  22. @click="dialogShow"
  23. v-for="(item, index) in titles"
  24. :key="index"
  25. >
  26. {{ item }}
  27. </li>
  28. <el-dialog
  29. :title="title"
  30. :visible.sync="dialogVisible"
  31. width="692px"
  32. append-to-body
  33. >
  34. <el-tree
  35. :data="data"
  36. show-checkbox
  37. node-key="id"
  38. @check="checkRoom"
  39. :props="defaultProps"
  40. >
  41. </el-tree>
  42. <span slot="footer" class="dialog-footer">
  43. <el-button @click="dialogVisible = false">取 消</el-button>
  44. <el-button type="primary" @click="PLcloseRoom">确 定</el-button>
  45. </span>
  46. </el-dialog>
  47. </ul>
  48. </div>
  49. <div class="control" style="margin-left: 17px">
  50. <div class="title" @click="room = !room" style="cursor: pointer">
  51. 批量开关房
  52. </div>
  53. <ul v-show="room">
  54. <li
  55. @click="dialogShow"
  56. v-for="(item, index) in titles2"
  57. :key="index"
  58. >
  59. {{ item }}
  60. </li>
  61. <el-dialog
  62. :title="title"
  63. :visible.sync="dialogVisible"
  64. width="692px"
  65. append-to-body
  66. >
  67. <div class="tree">
  68. <div class="tree-left">
  69. <el-checkbox
  70. v-model="checked"
  71. style="margin-left: 15px"
  72. @change="chooseAll"
  73. >全选</el-checkbox
  74. >
  75. <span style="margin-left: 165px"
  76. >{{ count.length }} / {{ data[0].children.length }}</span
  77. >
  78. </div>
  79. <el-tree
  80. :data="data"
  81. show-checkbox
  82. node-key="id"
  83. ref="roomTree"
  84. :props="defaultProps"
  85. @check="checkRoom"
  86. >
  87. </el-tree>
  88. </div>
  89. <div class="tree">
  90. <div class="tree-left">
  91. <p style="margin-left: 15px">已选 ( {{ count.length }} )</p>
  92. </div>
  93. <ul
  94. class="infinite-list"
  95. v-infinite-scroll="load"
  96. style="overflow: auto"
  97. infinite-scroll-immediate="false"
  98. >
  99. <li
  100. v-for="(i, index) in count"
  101. :key="index"
  102. class="infinite-list-item"
  103. v-show="!i.children"
  104. >
  105. <span style="margin-left: 19px">{{ i.label }}</span
  106. ><i class="el-icon-close" @click="cancelCheck(i)"></i>
  107. </li>
  108. </ul>
  109. </div>
  110. <span slot="footer" class="dialog-footer">
  111. <el-button @click="dialogVisible = false">取 消</el-button>
  112. <el-button type="primary" @click="PLcloseRoom">确 定</el-button>
  113. </span>
  114. </el-dialog>
  115. </ul>
  116. </div>
  117. </div>
  118. </div>
  119. <div class="home-body">
  120. <div class="room-floor wrapper">
  121. <div class="scrollBlock" ref="scrollBlock">
  122. <div class="floor" v-for="(items, i) in floorRoomDatas" :key="i">
  123. <div class="header-title">
  124. <div class="tier">{{ parseInt(items.floor) }}层</div>
  125. <span>/&nbsp; 共{{ items.room.length }}间</span>
  126. </div>
  127. <div class="main-floor">
  128. <div
  129. class="room-num"
  130. v-for="item in roomData"
  131. :key="item.id"
  132. v-show="items.floor == item.floor"
  133. >
  134. <el-popover
  135. placement="right"
  136. trigger="click"
  137. popper-class="popperOptions"
  138. >
  139. <div class="control-room">
  140. <el-button size="mini" @click="closeRoom(item)"
  141. >关房</el-button
  142. >
  143. <el-button size="mini" @click="todirty(item)"
  144. >转脏房</el-button
  145. >
  146. <el-button
  147. size="mini"
  148. :disabled="item.statuName != '脏房'"
  149. @click="leisure(item)"
  150. >转空闲</el-button
  151. >
  152. <el-button size="mini" @click="closeEle(item)"
  153. >关电</el-button
  154. >
  155. <el-button size="mini">清扫</el-button>
  156. <el-button size="mini">IC卡</el-button>
  157. <el-button size="mini">指纹</el-button>
  158. </div>
  159. <div
  160. @click="EachRoom($event, item)"
  161. :class="item.roomId == clickId ? 'cardId' : ''"
  162. class="card"
  163. slot="reference"
  164. >
  165. <div class="title">
  166. <span>{{ item.build }}栋{{ item.roomno }}</span>
  167. <div class="state" :style="bgState(item.statu)">
  168. {{ item.statuName }}
  169. </div>
  170. </div>
  171. <template v-if="item.statu == 3">
  172. <div class="teacher">{{ item.useInfo.userName }}</div>
  173. <div class="num">
  174. <span>水:{{ item.useInfo.startOfWater }}吨</span
  175. >&nbsp;&nbsp;
  176. <span>电:{{ item.useInfo.startOfElectric }}度</span>
  177. </div>
  178. <div class="count-down">
  179. <span>退房倒计时 {{ item.useInfo.EndTime }}</span>
  180. <div class="tuifang" @click.stop="roomLock(item)">
  181. <IconSvg :W="21" :H="21" name="tuifang" />
  182. <el-dialog
  183. title="门锁管理"
  184. custom-class="lock"
  185. :append-to-body="true"
  186. :visible.sync="doorLock"
  187. width="30%"
  188. :before-close="lockClose"
  189. >
  190. <div class="roomID" style="margin-top: 13px">
  191. <div class="roomblock">
  192. <span>门锁ID:</span>
  193. <div
  194. class="number"
  195. v-if="doorLockList.doorIdshow"
  196. >
  197. <span>{{ doorLockList.doorId }}</span>
  198. <div @click="editlock">
  199. <IconSvg :W="16" :H="16" name="edit" />
  200. </div>
  201. </div>
  202. <el-input
  203. ref="roomId"
  204. v-else
  205. size="mini"
  206. v-model="doorLockList.doorId"
  207. @blur="editLockBlur"
  208. ></el-input>
  209. </div>
  210. <div class="roomblock">
  211. <span>水表编码:</span>
  212. <div
  213. class="number"
  214. v-if="doorLockList.waterIdshow"
  215. >
  216. <span>{{ doorLockList.waterId }}</span>
  217. <div @click="editWater">
  218. <IconSvg :W="16" :H="16" name="edit" />
  219. </div>
  220. </div>
  221. <el-input
  222. v-else
  223. size="mini"
  224. v-model="doorLockList.waterId"
  225. @blur="editWaterBlur"
  226. ></el-input>
  227. </div>
  228. </div>
  229. <div class="roomID">
  230. <div class="roomblock">
  231. <span>门锁序列号:</span>
  232. <div
  233. class="number"
  234. v-if="doorLockList.doorNumshow"
  235. >
  236. <span>{{ doorLockList.doorNum }}</span>
  237. <div @click="editRoomNum">
  238. <IconSvg :W="16" :H="16" name="edit" />
  239. </div>
  240. </div>
  241. <el-input
  242. v-else
  243. size="mini"
  244. v-model="doorLockList.doorNum"
  245. @blur="editRoomNumBlur"
  246. ></el-input>
  247. </div>
  248. <div class="roomblock">
  249. <span>电表编码:</span>
  250. <div
  251. class="number"
  252. v-if="doorLockList.electricityIdshow"
  253. >
  254. <span>{{ doorLockList.electricityId }}</span>
  255. <div @click="editEle">
  256. <IconSvg :W="16" :H="16" name="edit" />
  257. </div>
  258. </div>
  259. <el-input
  260. v-else
  261. size="mini"
  262. v-model="doorLockList.electricityId"
  263. @blur="editEleBlur"
  264. ></el-input>
  265. </div>
  266. </div>
  267. <div class="roomID">
  268. <div class="roompassword">
  269. <span>门锁密码:</span>
  270. <div
  271. class="sendpass"
  272. v-for="item in roomPassWord"
  273. :key="item.id"
  274. >
  275. <span>{{ item.lockRealtimePassword }}</span>
  276. <span class="password" @click="sending(item)"
  277. >下发密码</span
  278. >
  279. <span style="margin-left: 10px"
  280. >密码到期时间 :
  281. {{ item.endTime.replace("T", " ") }}</span
  282. >
  283. </div>
  284. </div>
  285. </div>
  286. <span slot="footer" class="dialog-footer">
  287. <el-button
  288. @click.stop="doorLock = false"
  289. size="mini"
  290. >取消</el-button
  291. >
  292. <el-button
  293. size="mini"
  294. @click.stop="doorLock = false"
  295. >完成</el-button
  296. >
  297. </span>
  298. </el-dialog>
  299. </div>
  300. </div>
  301. </template>
  302. </div>
  303. </el-popover>
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. </div>
  309. <div class="query-condition">
  310. <div class="title">查询条件</div>
  311. <div class="calendar">
  312. <p>日期查询</p>
  313. <div class="date">
  314. <el-date-picker
  315. size="mini"
  316. v-model="date"
  317. align="right"
  318. type="date"
  319. placeholder="请选择日期"
  320. :picker-options="pickerOptions"
  321. :clearable="false"
  322. >
  323. </el-date-picker>
  324. <!-- <el-calendar v-model="date" :first-day-of-week="7"> </el-calendar> -->
  325. <el-calendar v-model="date"> </el-calendar>
  326. </div>
  327. </div>
  328. <div class="filtrate">
  329. <p>房态筛选</p>
  330. <div class="room-filtrate">
  331. <div style="border-bottom: 1px solid rgba(225, 228, 232, 1)">
  332. <el-checkbox
  333. size="mini"
  334. :indeterminate="isIndeterminate"
  335. v-model="checkAll"
  336. @change="handleCheckAllChange"
  337. >全选</el-checkbox
  338. >
  339. <span class="all">150间</span>
  340. </div>
  341. <div style="margin: 15px 0"></div>
  342. <el-checkbox-group
  343. size="mini"
  344. v-model="checkedCities"
  345. @change="handleCheckedCitiesChange"
  346. >
  347. <el-checkbox
  348. size="mini"
  349. v-for="city in cities"
  350. :label="city"
  351. :key="city"
  352. >{{ city }} <span>50间</span></el-checkbox
  353. >
  354. </el-checkbox-group>
  355. </div>
  356. </div>
  357. <div class="reset">
  358. <el-button @click="reset" type="primary" size="mini"
  359. >重置筛选</el-button
  360. >
  361. </div>
  362. </div>
  363. </div>
  364. </el-card>
  365. </template>
  366. <script>
  367. import dayjs from "dayjs";
  368. import _ from "lodash";
  369. export default {
  370. name: "Home",
  371. data() {
  372. return {
  373. clickId: "",
  374. // 门锁管理
  375. doorLock: false,
  376. doorLockList: {
  377. doorId: "",
  378. doorIdshow: true,
  379. waterId: "",
  380. waterIdshow: true,
  381. doorNum: "111111",
  382. doorNumshow: true,
  383. electricityId: "",
  384. electricityIdshow: true,
  385. },
  386. roomPassWord: [], // 密码列表
  387. // 批量数据
  388. dialogVisible: false,
  389. enableEndTime: "", // 倒计时的日期
  390. Endtime: [],
  391. count: [], // 选中的全部数据
  392. title: "",
  393. checked: false,
  394. titles: ["批量开电", "批量关电"],
  395. titles2: ["批量开房", "批量关房"],
  396. data: [
  397. {
  398. id: 15263458,
  399. label: "墨轩湖酒店",
  400. children: [
  401. // {
  402. // id: 2,
  403. // label: "17栋1单元02层01",
  404. // },
  405. ],
  406. },
  407. ],
  408. floorRoomDatas: [],
  409. roomData: [],
  410. defaultProps: {
  411. children: "children",
  412. label: "label",
  413. },
  414. water: false,
  415. room: false,
  416. //日历
  417. pickerOptions: {
  418. disabledDate(time) {
  419. return time.getTime() > Date.now();
  420. },
  421. shortcuts: [
  422. {
  423. text: "今天",
  424. onClick(picker) {
  425. picker.$emit("pick", new Date());
  426. },
  427. },
  428. {
  429. text: "昨天",
  430. onClick(picker) {
  431. const date = new Date();
  432. date.setTime(date.getTime() - 3600 * 1000 * 24);
  433. picker.$emit("pick", date);
  434. },
  435. },
  436. {
  437. text: "一周前",
  438. onClick(picker) {
  439. const date = new Date();
  440. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
  441. picker.$emit("pick", date);
  442. },
  443. },
  444. ],
  445. },
  446. date: new Date(),
  447. // 房态筛选数据
  448. checkAll: false,
  449. checkedCities: [],
  450. cities: ["入住", "空闲", "锁定", "脏房", "预定"],
  451. isIndeterminate: false,
  452. };
  453. },
  454. mounted() {
  455. document.getElementsByClassName(
  456. "el-button--plain"
  457. )[0].children[0].innerText = "<";
  458. document.getElementsByClassName(
  459. "el-button--plain"
  460. )[1].children[0].innerText = "o";
  461. document.getElementsByClassName(
  462. "el-button--plain"
  463. )[2].children[0].innerText = ">";
  464. this.roomList();
  465. },
  466. created() {
  467. // let arr = {
  468. // roomNo: "2-2-1001",
  469. // build: 2,
  470. // floor: "2",
  471. // roomTypeId: 1,
  472. // roomTypeName: "测试房",
  473. // enableUse: "1",
  474. // };
  475. // this.API.room.roomSave(arr).then((res) => {
  476. // console.log(res);
  477. // });
  478. window.addEventListener("scroll", this.lazyLoading, true); // 滚动到底部,再加载的处理事件
  479. },
  480. //页面离开后销毁,防止切换路由后上一个页面监听scroll滚动事件会在新页面报错问题
  481. destroyed() {
  482. window.removeEventListener("scroll", this.lazyLoading);
  483. //页面离开后销毁,防止切换路由后上一个页面监听scroll滚动事件会在新页面报错问题
  484. },
  485. methods: {
  486. // 数据滚动加载
  487. lazyLoading() {
  488. // 滚动到底部,再加载的处理事件
  489. //滚动高度
  490. let scrollTop =
  491. document.getElementsByClassName("room-floor")[0].scrollTop;
  492. // console.log(scrollTop, "scrollTop");
  493. //可视区高度
  494. let clientHeight =
  495. document.getElementsByClassName("room-floor")[0].clientHeight;
  496. // console.log(clientHeight, "clientHeight");
  497. //滚动页面的高度
  498. let scrollHeight = this.$refs.scrollBlock.scrollHeight;
  499. // console.log(scrollHeight, "scrollHeight");
  500. if (scrollTop + clientHeight >= scrollHeight) {
  501. // 滚动到底部,逻辑代码
  502. //事件处理
  503. console.log("滚动到底部,触发"); //此处可以添加数据请求
  504. // 这这里可以写一些业务逻辑,请求数据等
  505. }
  506. },
  507. roomList() {
  508. this.API.room.roomPageGroup("pageSize=40").then((res) => {
  509. this.floorRoomDatas = [];
  510. // console.log(res);
  511. let arr = [];
  512. res.data.list.forEach((items) => {
  513. console.log(items);
  514. items.floors.forEach((item) => {
  515. console.log(item);
  516. if (item.floor == 1) {
  517. // arr.push(...items.room);
  518. console.log(item.room);
  519. }
  520. });
  521. this.floorRoomDatas.push(items.floors[0]);
  522. });
  523. console.log(res.data.list);
  524. console.log(this.floorRoomDatas);
  525. this.floorRoomDatas.forEach((item) => {
  526. item.room.forEach((items) => {
  527. items.roomno =
  528. items.roomNo.split("-")[0] +
  529. "单元" +
  530. items.roomNo.split("-")[1] +
  531. "层" +
  532. items.roomNo.split("-")[2] +
  533. "房";
  534. });
  535. });
  536. let ids = [];
  537. this.floorRoomDatas.forEach((item) => {
  538. item.room.forEach((item) => {
  539. ids.push(item.id);
  540. });
  541. });
  542. let roomIds = [];
  543. ids.forEach((item) => {
  544. roomIds.push("roomIds=" + item);
  545. });
  546. roomIds = roomIds.join("&");
  547. let startDay = dayjs(new Date()).format("YYYY-MM-DD");
  548. let endDay = dayjs(new Date()).add(1, "day").format("YYYY-MM-DD");
  549. let params =
  550. "?" +
  551. "startDay=" +
  552. startDay +
  553. "&" +
  554. "endDay=" +
  555. endDay +
  556. "&" +
  557. roomIds;
  558. this.API.roomRealTimeStatu.realData(params).then((res) => {
  559. console.log(res);
  560. this.roomData = res.data;
  561. this.roomData.forEach((resItem) => {
  562. if (resItem.statu == 1) {
  563. resItem.statuName = "空闲";
  564. } else if (resItem.statu == 2) {
  565. resItem.statuName = "预定";
  566. } else if (resItem.statu == 3) {
  567. resItem.statuName = "入住";
  568. } else if (resItem.statu == 4) {
  569. resItem.statuName = "脏房";
  570. } else if (resItem.statu == 5) {
  571. resItem.statuName = "锁定";
  572. }
  573. });
  574. this.data[0].children = [];
  575. this.floorRoomDatas.forEach((items) => {
  576. items.room.forEach((item) => {
  577. this.roomData.forEach((i, index) => {
  578. if (item.id == i.roomId) {
  579. i = Object.assign(i, item);
  580. // console.log(i);
  581. let arr = {
  582. id: i.roomId,
  583. label: i.build + "栋" + i.roomno,
  584. };
  585. if (i.statu != 5) {
  586. this.data[0].children.push(arr);
  587. }
  588. if (i.useInfo) {
  589. this.enableEndTime = i.useInfo.enableEndTime;
  590. this.showTime(index, i.useInfo.enableEndTime);
  591. // console.log(i.useInfo.enableEndTime);
  592. }
  593. }
  594. });
  595. });
  596. });
  597. // this.showTime(this.enableEndTime);
  598. console.log(this.roomData);
  599. });
  600. });
  601. },
  602. // 退房倒计时
  603. showTime(index, endtime) {
  604. setInterval(() => {
  605. //设置2020年春节时间
  606. var newyear = new Date(endtime);
  607. //获取当前时间
  608. var date1 = new Date();
  609. //两个日期对象直接相减就能获取两个日期相差的时间戳(以毫秒计,也就是能得出相差多少毫秒)
  610. var ms = newyear - date1;
  611. //获取天数
  612. var day = Math.floor(ms / 1000 / 3600 / 24);
  613. //获取小时数
  614. var h = Math.floor((ms % (3600 * 24 * 1000)) / 1000 / 3600);
  615. //获取分钟数
  616. var m = Math.floor((((ms % (3600 * 24 * 1000)) / 1000) % 3600) / 60);
  617. //获取秒数
  618. var s = Math.floor((((ms % (3600 * 24 * 1000)) / 1000) % 3600) % 60);
  619. if (day < 10) {
  620. day = "0" + day;
  621. }
  622. if (h < 10) {
  623. h = "0" + h;
  624. }
  625. if (m < 10) {
  626. m = "0" + m;
  627. }
  628. if (s < 10) {
  629. s = "0" + s;
  630. }
  631. if (ms < 0) {
  632. this.$set(this.roomData[index].useInfo, "EndTime", "00:00:00:00");
  633. } else {
  634. let enableEndTime = day + ":" + h + ":" + m + ":" + s;
  635. // this.roomData[index].useInfo.EndTime = enableEndTime;
  636. if (this.roomData[index].useInfo) {
  637. this.$set(this.roomData[index].useInfo, "EndTime", enableEndTime);
  638. }
  639. }
  640. }, 0);
  641. },
  642. bgState(e) {
  643. let color = ["", "#296DE3", "#00BAAD", "#D3DBE6", "#FF5733", "#3BB1E3"];
  644. return { background: color[e] };
  645. },
  646. EachRoom($event, item) {
  647. console.log(item);
  648. this.clickId = item.roomId;
  649. },
  650. // 批量开关房start
  651. chooseAll() {
  652. if (this.checked) {
  653. this.$refs.roomTree.setCheckedNodes(this.data[0].children);
  654. this.count = this.data[0].children;
  655. } else {
  656. this.$refs.roomTree.setCheckedNodes([]);
  657. this.count = [];
  658. }
  659. },
  660. dialogShow(e) {
  661. this.dialogVisible = true;
  662. this.title = e.target.innerText;
  663. },
  664. load() {
  665. // this.count += 0;
  666. // if (this.count < 50) {
  667. // this.count += 4;
  668. // }
  669. },
  670. // 勾选房间
  671. checkRoom(data, nodes) {
  672. this.count = _.cloneDeep(nodes.checkedNodes);
  673. nodes.checkedNodes.forEach((item, index) => {
  674. if (item.children) {
  675. this.count.splice(index, 1);
  676. }
  677. });
  678. if (this.data[0].children.length == this.count.length) {
  679. this.checked = true;
  680. } else {
  681. this.checked = false;
  682. }
  683. console.log(this.count);
  684. },
  685. // 取消选中房间
  686. cancelCheck(i) {
  687. console.log(i);
  688. this.count = this.count.filter((item) => {
  689. return i.id != item.id;
  690. });
  691. if (this.data[0].children.length == this.count.length) {
  692. this.checked = true;
  693. } else {
  694. this.checked = false;
  695. }
  696. this.$refs.roomTree.setCheckedNodes(this.count);
  697. console.log(this.count);
  698. },
  699. PLcloseRoom() {
  700. this.dialogVisible = false;
  701. if (this.title == "批量关房") {
  702. let roomId = [];
  703. let startDate = dayjs(new Date()).format("YYYY-MM-DD");
  704. let endDate = dayjs(new Date()).add(1, "day").format("YYYY-MM-DD");
  705. let remark = "锁定房间";
  706. this.count.forEach((item) => {
  707. roomId.push(item.id);
  708. });
  709. console.log(roomId);
  710. this.$confirm("确认关闭房间吗?")
  711. .then((_) => {
  712. this.API.roomRealTimeStatu
  713. .lock({ roomId, startDate, endDate, remark })
  714. .then((res) => {
  715. console.log(res);
  716. this.roomList();
  717. this.room = false;
  718. this.count = [];
  719. this.$refs.roomTree.setCheckedNodes([]);
  720. });
  721. })
  722. .catch((_) => {});
  723. }
  724. },
  725. // 批量开关房end
  726. //脏房转空闲
  727. leisure(item) {
  728. this.API.roomRealTimeStatu
  729. .clean(item.statuId)
  730. .then((res) => console.log(res));
  731. console.log(item);
  732. this.roomList();
  733. },
  734. // 锁定房间
  735. closeRoom(item) {
  736. console.log(item);
  737. let roomId = [item.roomId];
  738. let startDate = dayjs(new Date()).format("YYYY-MM-DD");
  739. let endDate = dayjs(new Date()).add(1, "day").format("YYYY-MM-DD");
  740. // let startDate = "2022-08-23";
  741. // let endDate = "2022-08-24";
  742. let remark = "锁定房间";
  743. this.API.roomRealTimeStatu
  744. .lock({ roomId, startDate, endDate, remark })
  745. .then((res) => {
  746. console.log(res);
  747. this.roomList();
  748. });
  749. },
  750. // 转脏房
  751. todirty(item) {
  752. console.log(item);
  753. let roomId = item.roomId;
  754. let startDay = dayjs(new Date()).format("YYYY-MM-DD");
  755. let endDay = dayjs(new Date()).add(1, "day").format("YYYY-MM-DD");
  756. // let startDate = "2022-08-23";
  757. // let endDate = "2022-08-24";
  758. this.API.roomRealTimeStatu
  759. .toDirty({ roomId, startDay, endDay })
  760. .then((res) => {
  761. console.log(res);
  762. this.roomList();
  763. });
  764. },
  765. // 关电
  766. closeEle(item) {
  767. console.log(item);
  768. let operType = "2";
  769. let roomId = item.roomId;
  770. this.API.roomThirdSetting.changeElectric(roomId, operType).then((res) => {
  771. console.log(res);
  772. this.$message({
  773. message: "关电成功",
  774. type: "success",
  775. });
  776. this.roomList();
  777. });
  778. },
  779. // 房态筛查
  780. handleCheckAllChange(val) {
  781. console.log(val);
  782. this.checkedCities = val ? this.cities : [];
  783. this.isIndeterminate = false;
  784. },
  785. handleCheckedCitiesChange(value) {
  786. console.log(value);
  787. let checkedCount = value.length;
  788. this.checkAll = checkedCount === this.cities.length;
  789. this.isIndeterminate =
  790. checkedCount > 0 && checkedCount < this.cities.length;
  791. },
  792. reset() {
  793. this.checkedCities = [];
  794. this.isIndeterminate = false;
  795. this.checkAll = false;
  796. },
  797. //门锁管理
  798. lockClose(done) {
  799. this.doorLock = false;
  800. },
  801. // 下发密码
  802. sending(item) {
  803. console.log(item);
  804. this.$confirm(`确认下发密码(${item.lockRealtimePassword})吗?`)
  805. .then((_) => {
  806. this.API.doorLock.sendPassword(item.id).then((res) => {
  807. console.log(res);
  808. });
  809. })
  810. .catch((_) => {});
  811. },
  812. roomLock(item) {
  813. this.doorLock = true;
  814. console.log(item);
  815. // 房间id查询密码锁
  816. this.API.doorLock.roomDoorLockRoomId(item.roomId).then((res) => {
  817. console.log(res.data);
  818. this.roomPassWord = res.data;
  819. });
  820. // 根据房间id查询(拿到电表码,水表码)
  821. this.API.roomThirdSetting.settingId(item.roomId).then((res) => {
  822. console.log(res.data);
  823. this.doorLockList.electricityId = res.data.electricId;
  824. this.doorLockList.waterId = res.data.waterId;
  825. this.doorLockList.doorId = res.data.lockId;
  826. });
  827. // 订单Id查询密码锁
  828. this.API.doorLock
  829. .roomDoorLockOrderId(item.useInfo.orderId)
  830. .then((res) => {
  831. console.log(res);
  832. });
  833. },
  834. // 编辑门锁ID
  835. editlock() {
  836. this.doorLockList.doorIdshow = false;
  837. },
  838. editLockBlur() {
  839. this.doorLockList.doorIdshow = true;
  840. console.log(111);
  841. },
  842. // 门锁序列号
  843. editRoomNum() {
  844. this.doorLockList.doorNumshow = false;
  845. },
  846. editRoomNumBlur() {
  847. this.doorLockList.doorNumshow = true;
  848. console.log(111);
  849. },
  850. // 编辑水表编码
  851. editWater() {
  852. this.doorLockList.waterIdshow = false;
  853. },
  854. editWaterBlur() {
  855. this.doorLockList.waterIdshow = true;
  856. console.log(111);
  857. },
  858. // 编辑电表编码
  859. editEle() {
  860. this.doorLockList.electricityIdshow = false;
  861. },
  862. editEleBlur() {
  863. this.doorLockList.electricityIdshow = true;
  864. console.log(111);
  865. },
  866. },
  867. };
  868. </script>
  869. <style lang="scss" scoped>
  870. .box-card {
  871. /deep/ .el-card__header {
  872. padding: 0;
  873. }
  874. }
  875. .clearfix {
  876. height: 96px;
  877. display: flex;
  878. align-items: center;
  879. .el-card__header {
  880. padding: 0;
  881. }
  882. .header-left {
  883. margin-left: 33px;
  884. display: flex;
  885. align-items: center;
  886. .title {
  887. color: rgba(0, 0, 0, 1);
  888. font-size: 24px;
  889. font-weight: 500;
  890. margin-right: 15px;
  891. }
  892. }
  893. .header-right {
  894. display: flex;
  895. .inquire-input {
  896. width: 261px;
  897. height: 37px;
  898. background: rgba(240, 243, 247, 1);
  899. border-radius: 5px;
  900. margin-left: 744px;
  901. /deep/ .el-input__inner {
  902. height: 37px !important;
  903. }
  904. }
  905. .inquire-button {
  906. width: 73px;
  907. height: 37px;
  908. font-size: 16px;
  909. margin: 0 20px 0 9px;
  910. padding: 0;
  911. background: rgba(41, 109, 227, 1);
  912. color: #fff;
  913. }
  914. .control {
  915. // width: 121px;
  916. height: 37px;
  917. position: relative;
  918. .title {
  919. background: rgba(41, 109, 227, 1);
  920. color: #fff;
  921. text-align: center;
  922. line-height: 37px;
  923. padding: 0 11px;
  924. }
  925. ul {
  926. position: absolute;
  927. list-style: none;
  928. width: 100%;
  929. padding: 0;
  930. box-sizing: border-box;
  931. margin: 0;
  932. background: rgba(255, 255, 255, 1);
  933. box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
  934. border-radius: 3px;
  935. li {
  936. height: 26px;
  937. font-size: 12px;
  938. color: #000;
  939. line-height: 26px;
  940. text-align: center;
  941. &:hover {
  942. background-color: rgba(41, 109, 227, 1);
  943. color: #fff;
  944. cursor: pointer;
  945. }
  946. }
  947. }
  948. }
  949. }
  950. }
  951. /deep/ .el-card__body {
  952. height: 854px;
  953. width: 100%;
  954. padding: 0;
  955. .home-body {
  956. display: flex;
  957. height: 100%;
  958. .room-floor {
  959. height: 100%;
  960. overflow: auto;
  961. flex: 1;
  962. .floor {
  963. margin: 0 0 0 33px;
  964. .header-title {
  965. display: flex;
  966. align-items: center;
  967. height: 66px;
  968. .tier {
  969. color: rgba(0, 0, 0, 1);
  970. font-size: 20px;
  971. font-weight: 500;
  972. display: inline-block;
  973. }
  974. span {
  975. color: rgba(102, 102, 102, 1);
  976. font-size: 14px;
  977. font-weight: 400;
  978. margin-left: 10px;
  979. }
  980. }
  981. .main-floor {
  982. display: flex;
  983. flex-wrap: wrap;
  984. .room-num {
  985. margin-bottom: 30px;
  986. .card {
  987. width: 228px;
  988. height: 140px;
  989. background: rgba(240, 243, 247, 1);
  990. border-radius: 4px;
  991. margin-right: 20px;
  992. font-size: 12px;
  993. font-weight: 400;
  994. color: #000;
  995. box-sizing: border-box;
  996. border: 1px solid transparent;
  997. display: flex;
  998. flex-direction: column;
  999. // div {
  1000. // margin-left: 15px;
  1001. // margin-bottom: 7px;
  1002. // }
  1003. .title {
  1004. display: flex;
  1005. align-items: center;
  1006. margin: 15px;
  1007. span {
  1008. display: inline-block;
  1009. height: 24px;
  1010. font-size: 16px;
  1011. font-weight: 500;
  1012. letter-spacing: 0px;
  1013. color: rgba(51, 51, 51, 1);
  1014. }
  1015. .state {
  1016. width: 46px;
  1017. height: 17px;
  1018. opacity: 1;
  1019. /** 文本1 */
  1020. font-size: 12px;
  1021. font-weight: 400;
  1022. letter-spacing: 0px;
  1023. color: #fff;
  1024. text-align: center;
  1025. line-height: 17px;
  1026. margin-left: 7px;
  1027. background: rgba(41, 109, 227, 1);
  1028. }
  1029. }
  1030. .teacher {
  1031. margin: 5px 15px;
  1032. }
  1033. .num {
  1034. margin: 5px 15px;
  1035. }
  1036. .count-down {
  1037. margin-left: 15px;
  1038. display: flex;
  1039. span {
  1040. margin-right: 54px;
  1041. }
  1042. .tuifang {
  1043. width: 21px;
  1044. height: 21px;
  1045. cursor: pointer;
  1046. .el-dialog {
  1047. box-shadow: none;
  1048. margin: 350px 0 0 450px !important;
  1049. width: 555px !important;
  1050. height: 377px !important;
  1051. .text {
  1052. display: flex;
  1053. margin-left: 34px;
  1054. margin-bottom: 15px;
  1055. font-size: 14px;
  1056. font-weight: 400;
  1057. span {
  1058. margin-right: 20px;
  1059. }
  1060. .password {
  1061. color: #fff;
  1062. border-radius: 2px;
  1063. font-size: 12px;
  1064. padding: 2px;
  1065. cursor: pointer;
  1066. background-color: rgba(41, 109, 227, 1);
  1067. }
  1068. }
  1069. .el-dialog__body {
  1070. flex-direction: column;
  1071. }
  1072. .el-dialog__footer {
  1073. margin: 40px -48px 0 0;
  1074. .dialog-footer {
  1075. .el-button:nth-child(2) {
  1076. color: #fff;
  1077. background: rgba(41, 109, 227, 1);
  1078. }
  1079. .el-button {
  1080. width: 67px;
  1081. height: 37px;
  1082. padding-left: 20px;
  1083. }
  1084. }
  1085. }
  1086. }
  1087. }
  1088. }
  1089. }
  1090. .cardId {
  1091. border: 1px solid rgba(41, 109, 227, 1);
  1092. box-sizing: border-box;
  1093. }
  1094. .el-dropdown-link {
  1095. cursor: pointer;
  1096. color: #409eff;
  1097. }
  1098. .el-icon-arrow-down {
  1099. font-size: 12px;
  1100. }
  1101. }
  1102. }
  1103. }
  1104. }
  1105. .query-condition {
  1106. width: 302px;
  1107. height: 752px;
  1108. background: rgba(240, 243, 247, 1);
  1109. border-radius: 4px;
  1110. margin: 72px 29px 0 0;
  1111. .title {
  1112. color: rgba(0, 0, 0, 1);
  1113. font-size: 20px;
  1114. font-weight: 400;
  1115. height: 55px;
  1116. border-bottom: 1px solid rgba(217, 217, 217, 1);
  1117. line-height: 55px;
  1118. text-align: center;
  1119. }
  1120. .calendar {
  1121. margin: 0 auto;
  1122. width: 266px;
  1123. height: 243px;
  1124. .date {
  1125. box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);
  1126. .el-input {
  1127. width: 266px !important;
  1128. .el-input__inner {
  1129. padding-left: 15px;
  1130. }
  1131. .el-input__prefix {
  1132. left: 233px !important;
  1133. }
  1134. }
  1135. }
  1136. .el-calendar {
  1137. width: 266px;
  1138. height: 240px;
  1139. .el-calendar__header {
  1140. height: 37px;
  1141. padding: 0;
  1142. font-size: 10px;
  1143. padding: 0 20px;
  1144. align-items: center;
  1145. .el-button {
  1146. width: 30px;
  1147. border: none;
  1148. padding: 5px 10px;
  1149. }
  1150. }
  1151. .el-calendar__body {
  1152. height: 190px !important;
  1153. padding: 0 20px;
  1154. table {
  1155. width: 100%;
  1156. height: 100% !important;
  1157. thead {
  1158. height: 19px;
  1159. th {
  1160. font-size: 10.7px;
  1161. padding: 15px 0 10px 0;
  1162. }
  1163. }
  1164. .el-calendar-table__row {
  1165. .next,
  1166. .prev {
  1167. .el-calendar-day {
  1168. display: none;
  1169. }
  1170. }
  1171. height: 19px !important;
  1172. .is-selected {
  1173. background: transparent;
  1174. .el-calendar-day {
  1175. border-radius: 50%;
  1176. background-color: rgba(51, 150, 251, 1);
  1177. span {
  1178. color: #fff;
  1179. }
  1180. }
  1181. }
  1182. td {
  1183. height: 19px !important;
  1184. border-left: none;
  1185. border-top: none;
  1186. border-bottom: none;
  1187. border-right: none;
  1188. .el-calendar-day {
  1189. display: inline-block;
  1190. padding: 0;
  1191. height: 19px;
  1192. border: none !important;
  1193. margin: 4px 5px;
  1194. span {
  1195. display: inline-block;
  1196. font-size: 10.7px;
  1197. width: 19px;
  1198. height: 19px;
  1199. border-radius: 50%;
  1200. color: #000;
  1201. text-align: center;
  1202. line-height: 19px;
  1203. }
  1204. }
  1205. }
  1206. }
  1207. }
  1208. }
  1209. }
  1210. }
  1211. .filtrate {
  1212. margin-top: 85px;
  1213. padding: 0 20px;
  1214. p {
  1215. color: rgba(0, 0, 0, 1);
  1216. font-size: 16px;
  1217. font-weight: 400;
  1218. padding: 10px 0;
  1219. }
  1220. .room-filtrate {
  1221. border-bottom: 1px solid rgba(225, 228, 232, 1);
  1222. .el-checkbox.is-checked {
  1223. .el-checkbox__inner {
  1224. background-color: rgba(41, 109, 227, 1);
  1225. }
  1226. .el-checkbox__label {
  1227. color: #000;
  1228. }
  1229. }
  1230. .is-indeterminate {
  1231. .el-checkbox__inner {
  1232. background-color: rgba(41, 109, 227, 1);
  1233. }
  1234. }
  1235. }
  1236. .all {
  1237. float: right;
  1238. font-size: 12px;
  1239. }
  1240. .el-checkbox {
  1241. width: 50%;
  1242. margin: 0;
  1243. .el-checkbox__label {
  1244. font-size: 12px;
  1245. margin-bottom: 10px;
  1246. span {
  1247. margin-left: 25px;
  1248. font-size: 12px;
  1249. }
  1250. }
  1251. }
  1252. .el-checkbox__inner {
  1253. width: 12px;
  1254. height: 12px;
  1255. &:after {
  1256. left: 3px;
  1257. top: 0;
  1258. }
  1259. }
  1260. }
  1261. .reset {
  1262. margin: 15px 20px;
  1263. .el-button {
  1264. width: 69px;
  1265. height: 28px;
  1266. background: rgba(41, 109, 227, 1);
  1267. border-radius: 4px;
  1268. padding: 0;
  1269. }
  1270. }
  1271. }
  1272. }
  1273. }
  1274. .box-card {
  1275. width: 1612px;
  1276. height: 950px;
  1277. box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
  1278. border-radius: 8px;
  1279. }
  1280. /deep/ .lock.el-dialog {
  1281. box-shadow: none;
  1282. margin: 350px 0 0 450px !important;
  1283. width: 555px !important;
  1284. height: 377px !important;
  1285. .el-dialog__header {
  1286. border-bottom: 1px solid rgba(204, 204, 204, 1);
  1287. .el-dialog__headerbtn {
  1288. width: 35px;
  1289. height: 35px;
  1290. font-size: 24px;
  1291. i {
  1292. color: #000;
  1293. }
  1294. }
  1295. }
  1296. .el-dialog__body {
  1297. display: flex;
  1298. flex-direction: column;
  1299. .roomID {
  1300. display: flex;
  1301. height: 49px;
  1302. .roompassword {
  1303. margin: 10px 19px;
  1304. .sendpass {
  1305. margin: 5px;
  1306. }
  1307. .password {
  1308. margin-left: 10px;
  1309. color: #fff;
  1310. border-radius: 2px;
  1311. font-size: 12px;
  1312. padding: 2px;
  1313. cursor: pointer;
  1314. background-color: rgba(41, 109, 227, 1);
  1315. }
  1316. }
  1317. .roomblock {
  1318. margin: 10px 19px;
  1319. width: 262px;
  1320. display: flex;
  1321. align-items: center;
  1322. span {
  1323. margin-right: 5px;
  1324. }
  1325. .number {
  1326. display: flex;
  1327. span {
  1328. margin-right: 5px;
  1329. }
  1330. }
  1331. }
  1332. .el-input {
  1333. width: 150px;
  1334. }
  1335. }
  1336. }
  1337. .el-dialog__footer {
  1338. margin: 20px 14px 0px 0;
  1339. .dialog-footer {
  1340. .el-button:nth-child(2) {
  1341. color: #fff;
  1342. background: rgba(41, 109, 227, 1);
  1343. }
  1344. .el-button {
  1345. width: 67px;
  1346. height: 37px;
  1347. padding-left: 20px;
  1348. }
  1349. }
  1350. }
  1351. }
  1352. /deep/ .addroom.el-dialog {
  1353. box-shadow: none;
  1354. margin: 150px 0 0 600px !important;
  1355. width: 700px !important;
  1356. .el-dialog__header {
  1357. border-bottom: 1px solid rgba(204, 204, 204, 1);
  1358. }
  1359. .el-dialog__body {
  1360. .el-form {
  1361. display: flex;
  1362. .room {
  1363. margin: 0 40px;
  1364. }
  1365. }
  1366. }
  1367. .el-dialog__footer {
  1368. margin: 40px 14px 0 0;
  1369. .dialog-footer {
  1370. .el-button:nth-child(2) {
  1371. color: #fff;
  1372. background: rgba(41, 109, 227, 1);
  1373. }
  1374. .el-button {
  1375. width: 67px;
  1376. height: 37px;
  1377. padding-left: 20px;
  1378. }
  1379. }
  1380. }
  1381. }
  1382. /deep/ .el-dialog {
  1383. height: 565px !important;
  1384. .el-dialog__header {
  1385. height: 81px;
  1386. margin: 0;
  1387. padding: 0;
  1388. border-bottom: 1px solid rgba(230, 230, 230, 1);
  1389. display: flex;
  1390. align-items: center;
  1391. color: rgba(0, 0, 0, 1);
  1392. span {
  1393. font-size: 20px;
  1394. font-weight: 500;
  1395. margin-left: 30px;
  1396. }
  1397. button {
  1398. font-size: 20px;
  1399. width: 35px;
  1400. height: 35px;
  1401. top: 23px !important;
  1402. }
  1403. }
  1404. .el-dialog__body {
  1405. display: flex;
  1406. justify-content: center;
  1407. padding: 21px 0 0 0;
  1408. .tree {
  1409. .tree-left {
  1410. width: 316px;
  1411. height: 44px;
  1412. background: rgba(240, 243, 247, 1);
  1413. border: 1px solid rgba(230, 230, 230, 1);
  1414. box-sizing: border-box;
  1415. display: flex;
  1416. align-items: center;
  1417. }
  1418. }
  1419. .el-tree {
  1420. width: 316px;
  1421. height: 324px;
  1422. border: 1px solid rgba(230, 230, 230, 1);
  1423. box-sizing: border-box;
  1424. padding-left: 9px;
  1425. overflow: auto;
  1426. }
  1427. ul {
  1428. width: 316px;
  1429. height: 324px;
  1430. list-style: none;
  1431. padding: 0;
  1432. margin: 0;
  1433. border: 1px solid rgba(230, 230, 230, 1);
  1434. box-sizing: border-box;
  1435. overflow: auto;
  1436. li {
  1437. display: flex;
  1438. justify-content: space-between;
  1439. padding-right: 17px;
  1440. align-items: center;
  1441. i {
  1442. cursor: pointer;
  1443. }
  1444. }
  1445. }
  1446. }
  1447. .el-dialog__footer {
  1448. padding: 24px 30px 0 0;
  1449. }
  1450. }
  1451. </style>
  1452. <style lang="scss">
  1453. .el-popover.popperOptions {
  1454. min-width: 0;
  1455. padding: 0;
  1456. height: 167px;
  1457. width: 70px;
  1458. .control-room {
  1459. width: 70px;
  1460. // height: 167px;
  1461. opacity: 1;
  1462. box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1);
  1463. display: flex;
  1464. flex-direction: column;
  1465. justify-content: space-around;
  1466. text-align: center;
  1467. font-size: 12px;
  1468. font-weight: 400;
  1469. letter-spacing: 0px;
  1470. line-height: 0px;
  1471. color: rgba(0, 0, 0, 1);
  1472. text-align: left;
  1473. vertical-align: top;
  1474. .el-button {
  1475. margin-left: 0;
  1476. height: 24px !important;
  1477. color: rgba(0, 0, 0, 1);
  1478. border: none;
  1479. border-radius: 0;
  1480. }
  1481. }
  1482. .popper__arrow {
  1483. top: 35px !important;
  1484. }
  1485. }
  1486. .el-message-box__wrapper {
  1487. .el-button--primary {
  1488. background-color: #296de3;
  1489. }
  1490. }
  1491. </style>