equipmentOperation.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  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="getSalesFinishList('xdjList')"
  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="getSalesFinishList('byList')"
  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="getSalesFinishList('gzwxList')"
  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="getSalesFinishList('jhwxList')"
  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" style="font-size: 1.3rem;">${item[i]}</div>`;
  164. list[0] = div;
  165. }
  166. if (i === 'repairUserName') {
  167. div = `<div class="white" style="font-size: 1.3rem;">${item[i]}</div>`;
  168. list[1] = div;
  169. }
  170. if (i === 'delayTime') {
  171. div = `<div class="white" style="font-size: 1.3rem;">${item[i]}</div>`;
  172. list[3] = 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[2] = div;
  179. }
  180. }
  181. return list;
  182. }) ?? [],
  183. align: ['center', 'center', 'center', 'center', 'center', 'center'],
  184. headerBGC: '#031d42',
  185. columnWidth: [140, 250, 130, 200],
  186. headerHeight: 30,
  187. oddRowBGC: '#031d42',
  188. evenRowBGC: '#031d42',
  189. waitTime: 5000,
  190. rowNum: 8
  191. };
  192. };
  193. }
  194. },
  195. watch: {
  196. isFullscreen: {
  197. handler() {
  198. this.isFlag = false;
  199. this.$nextTick(() => {
  200. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  201. document.documentElement;
  202. let eleAdminHeaderHeight =
  203. (!this.isFullscreen &&
  204. document.getElementsByClassName('ele-admin-header')[0]
  205. ?.offsetHeight) ||
  206. 0;
  207. let eleAdminSidebarWidth =
  208. (!this.isFullscreen &&
  209. document.getElementsByClassName('ele-admin-sidebar')[0]
  210. ?.offsetWidth) ||
  211. 0;
  212. let eleAdminTabsWidth =
  213. (!this.isFullscreen &&
  214. document.getElementsByClassName('ele-admin-tabs')[0]
  215. ?.offsetHeight) ||
  216. 0;
  217. const setContainerSize = (item) => {
  218. item.style.height =
  219. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  220. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  221. };
  222. let boxContainer = [
  223. ...document.getElementsByClassName('box-container')
  224. ];
  225. boxContainer.forEach(setContainerSize);
  226. document.documentElement.style.fontSize = this.isFullscreen
  227. ? '18px'
  228. : '16px';
  229. this.isFlag = true;
  230. });
  231. },
  232. immediate: true
  233. },
  234. contentWidth: {
  235. handler() {
  236. this.isFlag = false;
  237. this.$nextTick(() => {
  238. let { clientWidth: deviceWidth, clientHeight: deviceHeight } =
  239. document.documentElement;
  240. let eleAdminHeaderHeight =
  241. (!this.isFullscreen &&
  242. document.getElementsByClassName('ele-admin-header')[0]
  243. ?.offsetHeight) ||
  244. 0;
  245. let eleAdminSidebarWidth =
  246. (!this.isFullscreen &&
  247. document.getElementsByClassName('ele-admin-sidebar')[0]
  248. ?.offsetWidth) ||
  249. 0;
  250. let eleAdminTabsWidth =
  251. (!this.isFullscreen &&
  252. document.getElementsByClassName('ele-admin-tabs')[0]
  253. ?.offsetHeight) ||
  254. 0;
  255. const setContainerSize = (item) => {
  256. item.style.height =
  257. deviceHeight - eleAdminHeaderHeight - eleAdminTabsWidth + 'px';
  258. item.style.width = deviceWidth - eleAdminSidebarWidth + 'px';
  259. };
  260. let boxContainer = [
  261. ...document.getElementsByClassName('box-container')
  262. ];
  263. boxContainer.forEach(setContainerSize);
  264. document.documentElement.style.fontSize = this.isFullscreen
  265. ? '18px'
  266. : '16px';
  267. this.isFlag = true;
  268. });
  269. },
  270. immediate: true
  271. }
  272. },
  273. deactivated() {
  274. clearInterval(this.updateTimer);
  275. },
  276. data() {
  277. return {
  278. totalData: {},
  279. isFullscreen: false, // 是否是全屏
  280. isFlag: false, // 是否展示图表
  281. date: '',
  282. time: '',
  283. week: '',
  284. signedTotal: 0,
  285. deliveryTotal: 0,
  286. salesTotal: 0,
  287. WeightGainTotal: 0,
  288. WeightStorageTotal: 0,
  289. salesChart: null,
  290. outputChart: null,
  291. tableHeader: ['工单号', '负责人', '状态', '响应时间']
  292. };
  293. },
  294. created() {
  295. // window.isFullscreen = false
  296. this.updateTimer = setInterval(this.updateTime, 1000);
  297. },
  298. mounted() {
  299. // this.getSalesFinishList();
  300. // setInterval(() => {
  301. // this.getSalesFinishList();
  302. // }, 3600000);
  303. screenSubstanceGroupQuery().then((data) => {
  304. this.totalData = data;
  305. // this.getSalesFinishList()
  306. });
  307. },
  308. methods: {
  309. getColor(val) {
  310. // 0: '待接收',
  311. // 1: '已接收',
  312. // 2: '执行中',
  313. // 3: '待验收',
  314. // 4: '已完成'
  315. if (val == '待接收') {
  316. return 'white';
  317. }
  318. if (val == '已接收') {
  319. return 'yellow';
  320. }
  321. if (val == '执行中') {
  322. return 'green';
  323. }
  324. if (val == '待验收') {
  325. return 'red';
  326. }
  327. },
  328. fomatFloat(num, n) {
  329. var f = parseFloat(num);
  330. if (isNaN(f)) {
  331. return false;
  332. }
  333. f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); // n 幂
  334. var s = f.toString();
  335. var rs = s.indexOf('.');
  336. //判定如果是整数,增加小数点再补0
  337. if (rs < 0) {
  338. rs = s.length;
  339. s += '.';
  340. }
  341. while (s.length <= rs + n) {
  342. s += '0';
  343. }
  344. return s;
  345. },
  346. /* 全屏切换 */
  347. onFullscreen() {
  348. this.isFullscreen = !this.isFullscreen;
  349. },
  350. //
  351. // async getSalesFinishList() {
  352. // this.totalData
  353. // this.config = {
  354. // };
  355. // },
  356. //实时更新日期
  357. updateTime() {
  358. let now = new Date();
  359. let hours = now.getHours();
  360. let minutes = now.getMinutes();
  361. let seconds = now.getSeconds();
  362. this.time =
  363. hours.toString().padStart(2, '0') +
  364. ':' +
  365. minutes.toString().padStart(2, '0') +
  366. ':' +
  367. seconds.toString().padStart(2, '0');
  368. let year = now.getFullYear();
  369. let month = now.getMonth() + 1;
  370. let day = now.getDate();
  371. this.date = year + '年' + month + '月' + day + '日';
  372. let weekInfo = {
  373. 1: '一',
  374. 2: '二',
  375. 3: '三',
  376. 4: '四',
  377. 5: '五',
  378. 6: '六',
  379. 0: '日'
  380. };
  381. this.week = '星期' + weekInfo[now.getDay()];
  382. }
  383. }
  384. };
  385. </script>
  386. <style lang="scss" scoped>
  387. .box-container {
  388. font-size: 16px;
  389. font-family: 'AlibabaPuHuiTi';
  390. background: #031d42;
  391. display: flex;
  392. flex-direction: column;
  393. .box-header {
  394. background-image: url('@/assets/border2.png');
  395. background-repeat: no-repeat;
  396. background-size: 100% 100%;
  397. display: flex;
  398. width: 100% !important;
  399. height: 10%;
  400. justify-content: space-between;
  401. .title {
  402. font-family: '优设标题黑';
  403. font-size: 2.75rem;
  404. flex: 1;
  405. display: flex;
  406. justify-content: center;
  407. align-items: center;
  408. color: #fff;
  409. transform: translateY(-10%);
  410. letter-spacing: 0.4rem;
  411. }
  412. .logo {
  413. display: inline-block;
  414. width: 20%;
  415. display: flex;
  416. align-items: center;
  417. > img {
  418. width: 6.48rem;
  419. height: 3rem;
  420. }
  421. > span {
  422. color: #fff;
  423. font-size: 1rem;
  424. font-weight: bold;
  425. }
  426. }
  427. .time {
  428. width: 20%;
  429. display: flex;
  430. align-items: center;
  431. justify-content: space-around;
  432. flex-direction: column;
  433. align-items: flex-end;
  434. justify-content: flex-start;
  435. font-size: 0.8rem;
  436. }
  437. }
  438. .top_bar {
  439. height: 8.625rem;
  440. width: 100%;
  441. position: relative;
  442. display: flex;
  443. justify-content: space-around;
  444. > div {
  445. width: 25.77rem;
  446. height: 6.27rem;
  447. background-size: 100% 100%;
  448. background-repeat: no-repeat;
  449. line-height: 6.27rem;
  450. display: flex;
  451. align-items: center;
  452. justify-content: center;
  453. > div {
  454. font-family: '优设标题黑';
  455. font-size: 2.3rem;
  456. color: #fff;
  457. > span {
  458. color: #00c1fd;
  459. }
  460. }
  461. }
  462. .runDeviceInfo {
  463. background-image: url('@/assets/successInfo.png');
  464. }
  465. .repaireInfo {
  466. background-image: url('@/assets/runDevice.png');
  467. }
  468. .repaireInfo1 {
  469. background-image: url('@/assets/runDevice.png');
  470. }
  471. .faultDeviceInfo {
  472. background-image: url('@/assets/faultDevice.png');
  473. > div {
  474. span {
  475. color: #f26e6c;
  476. }
  477. }
  478. }
  479. }
  480. .list_item {
  481. flex: 1;
  482. display: flex;
  483. .table_bar {
  484. flex: 1;
  485. display: flex;
  486. flex-direction: column;
  487. overflow: hidden;
  488. .title {
  489. background: linear-gradient(90deg, #1f385e 0%, #021f4b 55%);
  490. height: 2.2rem;
  491. > div {
  492. height: 2.2rem;
  493. line-height: 2.2rem;
  494. width: 17.3125rem;
  495. padding-left: 2.8rem;
  496. background-image: url('@/assets/title_bg.png');
  497. background-repeat: no-repeat;
  498. background-size: 100% 100%;
  499. > span {
  500. font-size: 1.3rem;
  501. font-weight: bold;
  502. color: #fff;
  503. }
  504. }
  505. }
  506. .table {
  507. flex: 1;
  508. }
  509. }
  510. }
  511. .margin-bt20 {
  512. margin-bottom: 1rem;
  513. }
  514. }
  515. [v-cloak] {
  516. display: none;
  517. }
  518. </style>
  519. <style>
  520. .white {
  521. color: #ffffff;
  522. }
  523. .yellow {
  524. color: #ffd16c;
  525. }
  526. .green {
  527. color: green;
  528. }
  529. .red {
  530. color: red;
  531. }
  532. .blue {
  533. color: #0577ff !important;
  534. }
  535. .row-item {
  536. margin-bottom: 0.3rem;
  537. }
  538. </style>