equipmentOperation.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. <template>
  2. <vue-fullscreen
  3. class="box-container"
  4. v-model="isFullscreen"
  5. fullscreenClass="box-container"
  6. :exit-on-click-wrapper="false"
  7. v-cloak
  8. >
  9. <div class="box-container">
  10. <div class="box-header">
  11. <div class="logo">
  12. <!-- <img src="../../../assets/logo_1.png" alt="" />
  13. <span>株硬集团型材分公司</span> -->
  14. </div>
  15. <div class="title"> 设备运维看板 </div>
  16. <div class="time">
  17. <span
  18. style="color: #7fa7ce; margin: 5px 10px 15px 0; cursor: pointer"
  19. @click.passive="onFullscreen"
  20. >
  21. <i
  22. v-if="isFullscreen"
  23. title="取消全屏"
  24. class="el-icon-_screen-restore"
  25. ></i>
  26. <i v-else title="全屏" class="el-icon-_screen-full"></i>
  27. </span>
  28. <div style="margin-right: 10px">
  29. <span style="color: #7fa7ce">{{ date }}</span>
  30. <span style="color: rgb(210 215 221); padding: 0 5px">{{
  31. time
  32. }}</span>
  33. <span style="color: #7fa7ce">{{ week }} </span>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="top_bar">
  38. <div class="runDeviceInfo">
  39. <div
  40. >运行<span style="">{{ totalData.runNum }}</span
  41. >台</div
  42. >
  43. </div>
  44. <div class="repaireInfo">
  45. <div
  46. >计划维修<span style="">{{ totalData.planMaintenanceNum }}</span
  47. >台</div
  48. >
  49. </div>
  50. <div class="repaireInfo1">
  51. <div
  52. >保养<span style="">{{ totalData.maintenanceNum }}</span
  53. >台</div
  54. >
  55. </div>
  56. <div class="faultDeviceInfo">
  57. <div
  58. >故障维修<span>{{ totalData.malfunctionNum }}</span
  59. >台</div
  60. >
  61. </div>
  62. </div>
  63. <div class="list_item margin-bt20">
  64. <div class="table_bar">
  65. <div class="title">
  66. <div>
  67. <span>巡点检:</span>
  68. <span class="blue">{{
  69. getSalesFinishListLength('xdjList')
  70. }}</span>
  71. </div>
  72. </div>
  73. <div class="table"> </div>
  74. <dv-scroll-board
  75. v-if="isFlag"
  76. :config="xdjListConfig"
  77. style="width: 90%; height: 87%; transform: translate(5%, 1%)"
  78. />
  79. </div>
  80. <div class="table_bar">
  81. <div class="title">
  82. <div>
  83. <span>保养:</span>
  84. <span class="blue">{{ getSalesFinishListLength('byList') }}</span>
  85. </div>
  86. </div>
  87. <div class="table"> </div>
  88. <dv-scroll-board
  89. v-if="isFlag"
  90. :config="byListConfig"
  91. style="width: 90%; height: 87%; transform: translate(5%, 1%)"
  92. />
  93. </div>
  94. </div>
  95. <div class="list_item">
  96. <div class="table_bar">
  97. <div class="title">
  98. <div>
  99. <span>故障维修:</span>
  100. <span class="blue">{{
  101. getSalesFinishListLength('gzwxList')
  102. }}</span>
  103. </div>
  104. </div>
  105. <div class="table"> </div>
  106. <dv-scroll-board
  107. v-if="isFlag"
  108. :config="gzwxListConfig"
  109. style="width: 90%; height: 87%; transform: translate(5%, 1%)"
  110. />
  111. </div>
  112. <div class="table_bar">
  113. <div class="title">
  114. <div>
  115. <span>计划性维修:</span>
  116. <span class="blue">{{
  117. getSalesFinishListLength('jhwxList')
  118. }}</span>
  119. </div>
  120. </div>
  121. <div class="table"> </div>
  122. <dv-scroll-board
  123. v-if="isFlag"
  124. :config="jhwxListConfig"
  125. style="width: 90%; height: 87%; transform: translate(5%, 1%)"
  126. />
  127. </div>
  128. </div>
  129. </div>
  130. <!-- <button type="button" @click="toggle">{{ fullscreen?"退出":"进入" }}全屏</button>-->
  131. </vue-fullscreen>
  132. </template>
  133. <script>
  134. import dvBorderContent from './dv-border-content.vue';
  135. import { component } from 'vue-fullscreen';
  136. import { screenSubstanceGroupQuery } from '@/api/equipment';
  137. export default {
  138. name: 'index',
  139. components: {
  140. dvBorderContent,
  141. VueFullscreen: component
  142. },
  143. computed: {
  144. contentWidth() {
  145. return this.$store.state.theme.contentWidth;
  146. },
  147. getSalesFinishListLength() {
  148. return (key) => this.totalData[key]?.length;
  149. },
  150. getSalesFinishList() {
  151. return (key) => {
  152. return {
  153. header: this.tableHeader.map(
  154. (item) =>
  155. `<div style="color: #0577FF;font-size: 1.3rem;font-weight: bold">${item}</div>`
  156. ),
  157. data:
  158. this.totalData[key]?.map((item) => {
  159. let list = [];
  160. for (let i in item) {
  161. let div = '';
  162. if (i === 'workOrderNo') {
  163. div = `<div class="white ellipsis" style="font-size: 1.3rem;" title='${item[i]}'>${item[i]}</div>`;
  164. list[0] = div;
  165. }
  166. if (i === 'deviceName') {
  167. div = `<div class="white ellipsis" style="font-size: 1.3rem;" title='${item[i]}'>${item[i]}</div>`;
  168. list[1] = div;
  169. }
  170. if (i === 'repairUserName') {
  171. div = `<div class="white" style="font-size: 1.3rem;">${item[i]}</div>`;
  172. list[2] = div;
  173. }
  174. if (i === 'orderStatusString') {
  175. div = `<div class="${this.getColor(
  176. item[i]
  177. )}" style="font-size: 1.3rem;">${item[i]}</div>`;
  178. list[3] = div;
  179. }
  180. if (i === 'delayTime') {
  181. div = `<div class="white" style="font-size: 1.3rem;">${item[i]}</div>`;
  182. list[4] = div;
  183. }
  184. }
  185. return list;
  186. }) ?? []
  187. };
  188. };
  189. }
  190. },
  191. watch: {
  192. isFullscreen: {
  193. handler() {
  194. this.isFlag = false;
  195. this.$nextTick(() => {
  196. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  197. document.documentElement;
  198. let eleAdminHeaderHeight =
  199. (!this.isFullscreen &&
  200. document.getElementsByClassName('ele-admin-header')[0]
  201. ?.offsetHeight) ||
  202. 0;
  203. let eleAdminSidebarWidth =
  204. (!this.isFullscreen &&
  205. document.getElementsByClassName('ele-admin-sidebar')[0]
  206. ?.offsetWidth) ||
  207. 0;
  208. let eleAdminTabsWidth =
  209. (!this.isFullscreen &&
  210. document.getElementsByClassName('ele-admin-tabs')[0]
  211. ?.offsetHeight) ||
  212. 0;
  213. const setContainerSize = (item) => {
  214. item.style.height =
  215. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  216. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  217. };
  218. let boxContainer = [
  219. ...document.getElementsByClassName('box-container')
  220. ];
  221. boxContainer.forEach(setContainerSize);
  222. document.documentElement.style.fontSize = this.isFullscreen
  223. ? '18px'
  224. : '16px';
  225. this.isFlag = true;
  226. });
  227. },
  228. immediate: true
  229. },
  230. contentWidth: {
  231. handler() {
  232. this.isFlag = false;
  233. this.$nextTick(() => {
  234. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  235. document.documentElement;
  236. let eleAdminHeaderHeight =
  237. (!this.isFullscreen &&
  238. document.getElementsByClassName('ele-admin-header')[0]
  239. ?.offsetHeight) ||
  240. 0;
  241. let eleAdminSidebarWidth =
  242. (!this.isFullscreen &&
  243. document.getElementsByClassName('ele-admin-sidebar')[0]
  244. ?.offsetWidth) ||
  245. 0;
  246. let eleAdminTabsWidth =
  247. (!this.isFullscreen &&
  248. document.getElementsByClassName('ele-admin-tabs')[0]
  249. ?.offsetHeight) ||
  250. 0;
  251. const setContainerSize = (item) => {
  252. item.style.height =
  253. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  254. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  255. };
  256. let boxContainer = [
  257. ...document.getElementsByClassName('box-container')
  258. ];
  259. boxContainer.forEach(setContainerSize);
  260. document.documentElement.style.fontSize = this.isFullscreen
  261. ? '18px'
  262. : '16px';
  263. this.isFlag = true;
  264. });
  265. },
  266. immediate: true
  267. }
  268. },
  269. deactivated() {
  270. clearInterval(this.updateTimer);
  271. },
  272. data() {
  273. return {
  274. totalData: {},
  275. isFullscreen: false, // 是否是全屏
  276. isFlag: false, // 是否展示图表
  277. date: '',
  278. time: '',
  279. week: '',
  280. signedTotal: 0,
  281. deliveryTotal: 0,
  282. salesTotal: 0,
  283. WeightGainTotal: 0,
  284. WeightStorageTotal: 0,
  285. salesChart: null,
  286. outputChart: null,
  287. tableHeader: ['工单号', '设备名称', '负责人', '状态', '响应时间'],
  288. config: {
  289. align: ['center', 'center', 'center', 'center', 'center', 'center'],
  290. headerBGC: '#031d42',
  291. columnWidth: [220, 250, 150, 100, 200],
  292. headerHeight: 30,
  293. oddRowBGC: '#031d42',
  294. evenRowBGC: '#031d42',
  295. waitTime: 5000,
  296. rowNum: 8
  297. },
  298. xdjListConfig: {},
  299. byListConfig: {},
  300. gzwxListConfig: {},
  301. jhwxListConfig: {}
  302. };
  303. },
  304. created() {
  305. // window.isFullscreen = false
  306. this.updateTimer = setInterval(this.updateTime, 1000);
  307. },
  308. mounted() {
  309. // this.getSalesFinishList();
  310. // setInterval(() => {
  311. // this.getSalesFinishList();
  312. // }, 3600000);
  313. screenSubstanceGroupQuery().then((data) => {
  314. this.totalData = data;
  315. this.xdjListConfig = {
  316. ...this.config,
  317. ...this.getSalesFinishList('xdjList')
  318. };
  319. this.byListConfig = {
  320. ...this.config,
  321. ...this.getSalesFinishList('byList')
  322. };
  323. this.gzwxListConfig = {
  324. ...this.config,
  325. ...this.getSalesFinishList('gzwxList')
  326. };
  327. this.jhwxListConfig = {
  328. ...this.config,
  329. ...this.getSalesFinishList('jhwxList')
  330. };
  331. // { ..., ...config }
  332. });
  333. },
  334. methods: {
  335. getColor(val) {
  336. // 0: '待接收',
  337. // 1: '已接收',
  338. // 2: '执行中',
  339. // 3: '待验收',
  340. // 4: '已完成'
  341. if (val == '待接收') {
  342. return 'white';
  343. }
  344. if (val == '已接收') {
  345. return 'yellow';
  346. }
  347. if (val == '执行中') {
  348. return 'green';
  349. }
  350. if (val == '待验收') {
  351. return 'red';
  352. }
  353. },
  354. fomatFloat(num, n) {
  355. var f = parseFloat(num);
  356. if (isNaN(f)) {
  357. return false;
  358. }
  359. f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); // n 幂
  360. var s = f.toString();
  361. var rs = s.indexOf('.');
  362. //判定如果是整数,增加小数点再补0
  363. if (rs < 0) {
  364. rs = s.length;
  365. s += '.';
  366. }
  367. while (s.length <= rs + n) {
  368. s += '0';
  369. }
  370. return s;
  371. },
  372. /* 全屏切换 */
  373. onFullscreen() {
  374. this.isFullscreen = !this.isFullscreen;
  375. },
  376. //
  377. // async getSalesFinishList() {
  378. // this.totalData
  379. // this.config = {
  380. // };
  381. // },
  382. //实时更新日期
  383. updateTime() {
  384. let now = new Date();
  385. let hours = now.getHours();
  386. let minutes = now.getMinutes();
  387. let seconds = now.getSeconds();
  388. this.time =
  389. hours.toString().padStart(2, '0') +
  390. ':' +
  391. minutes.toString().padStart(2, '0') +
  392. ':' +
  393. seconds.toString().padStart(2, '0');
  394. let year = now.getFullYear();
  395. let month = now.getMonth() + 1;
  396. let day = now.getDate();
  397. this.date = year + '年' + month + '月' + day + '日';
  398. let weekInfo = {
  399. 1: '一',
  400. 2: '二',
  401. 3: '三',
  402. 4: '四',
  403. 5: '五',
  404. 6: '六',
  405. 0: '日'
  406. };
  407. this.week = '星期' + weekInfo[now.getDay()];
  408. }
  409. }
  410. };
  411. </script>
  412. <style lang="scss" scoped>
  413. .box-container {
  414. font-size: 16px;
  415. font-family: 'AlibabaPuHuiTi';
  416. background: #031d42;
  417. display: flex;
  418. flex-direction: column;
  419. .box-header {
  420. background-image: url('@/assets/border2.png');
  421. background-repeat: no-repeat;
  422. background-size: 100% 100%;
  423. display: flex;
  424. width: 100% !important;
  425. height: 10%;
  426. justify-content: space-between;
  427. .title {
  428. font-family: '优设标题黑';
  429. font-size: 2.75rem;
  430. flex: 1;
  431. display: flex;
  432. justify-content: center;
  433. align-items: center;
  434. color: #fff;
  435. transform: translateY(-10%);
  436. letter-spacing: 0.4rem;
  437. }
  438. .logo {
  439. display: inline-block;
  440. width: 20%;
  441. display: flex;
  442. align-items: center;
  443. > img {
  444. width: 6.48rem;
  445. height: 3rem;
  446. }
  447. > span {
  448. color: #fff;
  449. font-size: 1rem;
  450. font-weight: bold;
  451. }
  452. }
  453. .time {
  454. width: 20%;
  455. display: flex;
  456. align-items: center;
  457. justify-content: space-around;
  458. flex-direction: column;
  459. align-items: flex-end;
  460. justify-content: flex-start;
  461. font-size: 0.8rem;
  462. }
  463. }
  464. .top_bar {
  465. height: 8.625rem;
  466. width: 100%;
  467. position: relative;
  468. display: flex;
  469. justify-content: space-around;
  470. > div {
  471. width: 25.77rem;
  472. max-width: 24%;
  473. height: 6.27rem;
  474. background-size: 100% 100%;
  475. background-repeat: no-repeat;
  476. line-height: 6.27rem;
  477. display: flex;
  478. align-items: center;
  479. justify-content: center;
  480. > div {
  481. font-family: '优设标题黑';
  482. font-size: 2.3rem;
  483. color: #fff;
  484. > span {
  485. color: #00c1fd;
  486. }
  487. }
  488. }
  489. .runDeviceInfo {
  490. background-image: url('@/assets/successInfo.png');
  491. }
  492. .repaireInfo {
  493. background-image: url('@/assets/runDevice.png');
  494. }
  495. .repaireInfo1 {
  496. background-image: url('@/assets/runDevice.png');
  497. }
  498. .faultDeviceInfo {
  499. background-image: url('@/assets/faultDevice.png');
  500. > div {
  501. span {
  502. color: #f26e6c;
  503. }
  504. }
  505. }
  506. }
  507. .list_item {
  508. flex: 1;
  509. display: flex;
  510. .table_bar {
  511. flex: 1;
  512. display: flex;
  513. flex-direction: column;
  514. overflow: hidden;
  515. .title {
  516. background: linear-gradient(90deg, #1f385e 0%, #021f4b 55%);
  517. height: 2.2rem;
  518. > div {
  519. height: 2.2rem;
  520. line-height: 2.2rem;
  521. width: 17.3125rem;
  522. padding-left: 2.8rem;
  523. background-image: url('@/assets/title_bg.png');
  524. background-repeat: no-repeat;
  525. background-size: 100% 100%;
  526. > span {
  527. font-size: 1.3rem;
  528. font-weight: bold;
  529. color: #fff;
  530. }
  531. }
  532. }
  533. .table {
  534. flex: 1;
  535. }
  536. }
  537. }
  538. .margin-bt20 {
  539. margin-bottom: 1rem;
  540. }
  541. }
  542. [v-cloak] {
  543. display: none;
  544. }
  545. </style>
  546. <style>
  547. .white {
  548. color: #ffffff;
  549. }
  550. .yellow {
  551. color: #ffd16c;
  552. }
  553. .green {
  554. color: green;
  555. }
  556. .red {
  557. color: red;
  558. }
  559. .blue {
  560. color: #0577ff !important;
  561. }
  562. .row-item {
  563. margin-bottom: 0.3rem;
  564. }
  565. .ellipsis {
  566. white-space: nowrap; /* 禁止换行 */
  567. overflow: hidden; /* 隐藏溢出内容 */
  568. text-overflow: ellipsis; /* 显示省略号 */
  569. }
  570. </style>