From ec68cffd70d2a2788f7c74af55a11563aaf611d1 Mon Sep 17 00:00:00 2001 From: zhuzhuanzhuan Date: 星期三, 06 十二月 2023 15:47:38 +0800 Subject: [PATCH] 1、登录页面优化首次登录会出现404字样,需要明确用户登录后显示页面是否为首页/消息页或者角色中可设置 2、驱动参数管理页面新增或修改控制系统中英文名称规则限制字符数最少6位调整为2位 3、效率段管理页面效率段颜色可自定义 4、设备利用率、设备开动率、班次利用率页面增加可按照设备类型筛选查询 5、对比分析页面增加通过选择设备来对比 6、设备日利用率和设备日利用率对比页面优化选择树节点后查询区域的设备名称字段不会更新问题 --- src/views/WorkshopSignage.vue | 465 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 313 insertions(+), 152 deletions(-) diff --git a/src/views/WorkshopSignage.vue b/src/views/WorkshopSignage.vue index fc8a61f..5dc5cb2 100644 --- a/src/views/WorkshopSignage.vue +++ b/src/views/WorkshopSignage.vue @@ -1,127 +1,138 @@ <template> <dv-full-screen-container class="full-screen-container"> - <header class="page-header"> - {{getWorkshopName}} - <div class="header-right"> - <a-button type="primary" icon="save" size="large" @click="saveDevicePositionAndSizeByApi" - v-has="'home:saveDevicePositionAndSize'">淇濆瓨浣嶇疆 - </a-button> + <header class="page-header" :style="{height: pageHeaderHeight+'px'}"> + {{ workshopDetails.workshopName }} + <div class="header-left" v-has="'home:saveDevicePositionAndSize'"> + <a-space> + <span v-if="!isSwitchChecked">寮�鍚姛鑳�</span> + <span v-else>鍏抽棴鍔熻兘</span> + <a-switch + checked-children="寮�" + un-checked-children="鍏�" + @change="handleSwitchChange" + v-model="isSwitchChecked" + :disabled="isSwitchChecked" + /> + </a-space> + <a-button type="primary" icon="save" size="large" @click="saveDevicePositionAndSizeByApi">淇濆瓨浣嶇疆</a-button> + </div> + <div class="device-status-info"> + <a-space v-for="item in deviceStatusList" :key="item.value" class="single-status-info"> + <div>{{ item.label }}</div> + <div class="status-square" :style="{ backgroundColor: item.color }"></div> + <div>{{ getDeviceNumberByStatus(item.value) }}</div> + </a-space> </div> </header> - <dv-border-box-8 class="content-container"> - <VueDragResize v-for="(item,index) in deviceList" :key="item.equipmentId" :w="item.vw" - :h="item.vh" :x="item.left" :y="item.top" - v-on:resizing="resize($event,index)" - v-on:dragging="resize($event,index)" - :parentLimitation="true" - :minw="100" - :minh="100" - :id="item.equipmentId" - :stickSize="6" - > - <div class="single-device" - :style="{width: item.vw+ 'px',height:item.vh+'px'}"> - <div class="device-status"> - <div v-if="item.status==0" - :style="{backgroundImage:`url(${require('@/assets/yellow.png')})`}" class="status-image"></div> - <div v-if="item.status==1" :style="{backgroundImage:`url(${require('@/assets/red.png')})`}" - class="status-image"></div> - <div v-if="item.status==2" :style="{backgroundImage:`url(${require('@/assets/gray.png')})`}" - class="status-image"></div> - <div v-if="item.status==3" :style="{backgroundImage:`url(${require('@/assets/green.png')})`}" - class="status-image"></div> - <div - :style="{backgroundImage:`url(${item.equipmentImageUrl})`}" class="device-image"></div> + <dv-border-box-8> + <div class="content-container" ref="deviceContainerRef"> + <VueDragResize + v-for="(item, index) in deviceList" + :key="item.equipmentId" + :w="item.vw" + :h="item.vh" + :x="item.coordinateLeft" + :y="item.coordinateTop" + v-on:resizing="resize($event, index)" + v-on:dragging="resize($event, index)" + :parentLimitation="true" + :minw="70" + :minh="70" + :isDraggable="isDraggable" + :isResizable="isResizable" + :stickSize="6" + > + <div class="single-device" :style="{ width: item.vw + 'px', height: item.vh + 'px' }" + @click="openDetail(item)"> + <div class="device-status"> + <div + v-if="item.equipmentStatus == 2 || item.equipmentStatus == 1" + :style="{ backgroundImage: `url(${require('@/assets/yellow.png')})` }" + class="status-image" + ></div> + <div + v-if="item.equipmentStatus == 22" + :style="{ backgroundImage: `url(${require('@/assets/red.png')})` }" + class="status-image" + ></div> + <div + v-if="item.equipmentStatus == 0" + :style="{ backgroundImage: `url(${require('@/assets/gray.png')})` }" + class="status-image" + ></div> + <div + v-if="item.equipmentStatus == 3" + :style="{ backgroundImage: `url(${require('@/assets/green.png')})` }" + class="status-image" + ></div> + <div + :style="{ backgroundImage: `url(${getImgView(item.equipmentImage) || require('@/assets/8.png')})` }" + class="device-image" + ></div> + </div> + <div class="device-id" id="deviceId" + :style="{ fontSize: item.fontSize + 'px',color:workshopDetails.equipmentIdColor }"> + {{ item.equipmentId }} + </div> </div> - <div class="device-id" :style="{fontSize: item.fontSize+'px'}"> - {{item.equipmentId}} - </div> - </div> - </VueDragResize> - <div class="device-status-info"> - <div v-for="item in deviceStatusList" :key="item.value" class="single-status-info"> - <div>{{item.label}}</div> - <div class="status-square" :style="{backgroundColor:item.color}"></div> - <div>{{getDeviceNumberByStatus(item.value)}}</div> - </div> + </VueDragResize> </div> </dv-border-box-8> + + <EquipmentDetailModal ref="EquipmentDetailModal"></EquipmentDetailModal> </dv-full-screen-container> </template> <script> import VueDragResize from 'vue-drag-resize' + import api from '@/api/mdc' + import { getFileAccessHttpUrl } from '@/api/manage' + import EquipmentDetailModal from './mdc/base/modules/WorkshopSignage/EquipmentDetailModal' + import { message } from 'ant-design-vue' + + message.config({ + maxCount: 3 + }) export default { components: { - VueDragResize + VueDragResize, + EquipmentDetailModal }, data() { return { - // 璁惧淇℃伅鍒楄〃 + pageHeaderHeight: 80,// 椤靛ご楂樺害 + taskBarHeight: window.screen.height - window.screen.availHeight,// 灞忓箷搴曢儴浠诲姟鏍忛珮搴� + utilsBarHeight: window.outerHeight - window.innerHeight,// 娴忚鍣ㄥ伐鍏锋爮楂樺害 + normalPageHeight: 0, + fullScreenPageHeight: 0, + workshopDetails: {}, // 杞﹂棿璇︾粏淇℃伅, + isDraggable: false, // 鏄惁寮�鍚嫋鎷� + isResizable: false, // 鏄惁寮�鍚缉鏀� + isSwitchChecked: false, // 鏄惁寮�鍚姛鑳� + timingAcquisition: null, // 瀹氭椂鍒锋柊鏄惁寮�鍚� deviceList: [ - { - equipmentId: '123213213123232',// 璁惧ID - equipmentImageUrl: require('@/assets/8.png'), // 璁惧鍥剧墖 - top: 200, // 鎷栨嫿鍏冪礌璺濈洅瀛愰《璺濈 - left: 100, // 鎷栨嫿鍏冪礌璺濈洅瀛愬乏渚ц窛绂� - vw: 100, // 缂╂斁鍏冪礌瀹藉害 - vh: 100, // 缂╂斁鍏冪礌楂樺害 - fontSize: 12, // 缂╂斁鍏冪礌瀛椾綋澶у皬 - status: 1 // 璁惧鐘舵�� 0:寰呮満 1:鎶ヨ 2:鍏虫満 3:杩愯 - }, - { - equipmentId: '512346789561232', - equipmentImageUrl: require('@/assets/8.png'), - top: 500, - left: 753, - vw: 100, - vh: 100, - fontSize: 12, - status: 0 - }, - { - equipmentId: '64746965647653', - equipmentImageUrl: require('@/assets/8.png'), - top: 300, - left: 860, - vw: 100, - vh: 100, - fontSize: 12, - status: 2 - }, - { - equipmentId: '33548976965462', - equipmentImageUrl: require('@/assets/8.png'), - top: 100, - left: 380, - vw: 100, - vh: 100, - fontSize: 12, - status: 3 - }, - { - equipmentId: '85484913549253', - equipmentImageUrl: require('@/assets/8.png'), - top: 200, - left: 1500, - vw: 100, - vh: 100, - fontSize: 12, - status: 2 - } - ], - // 璁惧鐘舵�佹寚绀虹伅鍒楄〃 + // { + // equipmentId: '123213213123232',// 璁惧ID + // equipmentImage: require('@/assets/8.png'), // 璁惧鍥剧墖 + // coordinateTop: 200, // 鎷栨嫿鍏冪礌璺濈洅瀛愰《璺濈 + // coordinateLeft: 100, // 鎷栨嫿鍏冪礌璺濈洅瀛愬乏渚ц窛绂� + // vw: 100, // 缂╂斁鍏冪礌瀹藉害 + // vh: 100, // 缂╂斁鍏冪礌楂樺害 + // fontSize: 12, // 缂╂斁鍏冪礌瀛椾綋澶у皬 + // equipmentStatus: 1 // 璁惧鐘舵�� 0:鍏虫満 22:鎶ヨ 2:寰呮満 3:杩愯 寮�鏈�:1锛堟病鏈夊洓鑹茬伅鏍囪瘑褰掍负寰呮満锛� + // } + ], // 璁惧淇℃伅鍒楄〃 deviceStatusList: [ { label: '鍏虫満', - value: 2, + value: 0, color: '#A8A8A8' }, { label: '寰呮満', - value: 0, + value: 2, color: '#FFFF00' }, { @@ -131,80 +142,221 @@ }, { label: '鎶ヨ', - value: 1, + value: 22, color: '#FF0000' } - ] + ],// 璁惧鐘舵�佹寚绀虹伅鍒楄〃锛� + isFullscreen: false } }, - computed: { - getWorkshopName() { - switch (this.$route.params.workshopId) { - case '5321': - return '闀挎矙杞﹂棿' - case '6312': - return '澶╂触杞﹂棿' - case '3463': - return '姝︽眽杞﹂棿' - case '8421': - return '鍖椾含杞﹂棿' - default: - return '娴嬭瘯杞﹂棿' - } + watch: { + isSwitchChecked: { + handler(newVal) { + if (!newVal) { + console.log('瀹氭椂鍣ㄥ紑鍚腑') + this.timingAcquisition = setInterval(() => { + this.getDeviceListByApi(this.$route.params.id) + }, 2000) + } else { + console.log('鍏抽棴瀹氭椂鍣�') + clearInterval(this.timingAcquisition) + this.timingAcquisition = null + } + }, + immediate: true } }, methods: { /** * 閫氳繃杞﹂棿Id璋冪敤鎺ュ彛鑾峰彇璁惧淇℃伅鍒楄〃 - * @param workshopId 杞﹂棿Id + * @param id 杞﹂棿Id */ - getDeviceListByApi(workshopId) { - console.log('杞﹂棿Id', workshopId) + getDeviceListByApi(id) { + console.log('閲嶆柊鍒锋柊') + api.getDeviceListInWorkshopSignagePageApi(id).then((res) => { + if (res.result && res.result.length > 0) { + this.deviceList = res.result + } + }) }, + + /** + * 閫氳繃杞﹂棿Id璋冪敤鎺ュ彛鑾峰彇杞﹂棿璇︾粏淇℃伅 + * @param id 杞﹂棿Id + */ + getWorkshopDetailsByApi(id) { + api.getWorkshopDetailByWorkshopIdApi(id).then((res) => { + this.workshopDetails = res.result + this.$refs.deviceContainerRef.style.backgroundImage = `url(${this.getImgView( + this.workshopDetails.backgroundImage + )})` + + this.fullScreenPageHeight = `calc(100% - ${this.pageHeaderHeight}px)` + this.normalPageHeight = `calc(100% - ${this.pageHeaderHeight}px - ${this.taskBarHeight}px - ${this.utilsBarHeight}px)` + + if (this.isFullscreen) { + this.$refs.deviceContainerRef.style.height = this.fullScreenPageHeight + } else { + this.$refs.deviceContainerRef.style.height = this.normalPageHeight + } + }) + }, + + /** + * 鍥剧墖棰勮 + * @param text 鍥剧墖鍦板潃 + */ + getImgView(text) { + if (text && text.indexOf(',') > 0) { + text = text.substring(0, text.indexOf(',')) + } + return getFileAccessHttpUrl(text) + }, + /** * 鐐瑰嚮淇濆瓨鎸夐挳璋冪敤鎺ュ彛淇濆瓨鎷栨嫿鍚庣殑浣嶇疆涓庤澶囧浘鏍囧昂瀵� */ saveDevicePositionAndSizeByApi() { - console.log('淇濆瓨浣嶇疆') + console.log('瑙﹀彂淇濆瓨') + if (this.isOperatingDevice) { + api.saveDevicePositionAndSizeApi(this.deviceList).then((res) => { + if (res.code === 200) { + this.$notification.success({ + message: '娑堟伅', + description: res.message + }) + this.isOperatingDevice = false + if (this.isSwitchChecked) { + this.isSwitchChecked = false + this.isResizable = !this.isResizable + this.isDraggable = !this.isDraggable + } + this.getDeviceListByApi(this.$route.params.id) + } + }) + } else { + this.$notification.warning({ + message: '娑堟伅', + description: '璇峰紑鍚姛鑳藉悗鍐嶈繘琛屼繚瀛�' + }) + } }, + /** * 璁惧鎷栨嫿鎴栫缉鏀炬椂瑙﹀彂浜嬩欢 * @param newRect 鎷栨嫿鎴栫缉鏀惧悗鐨勫昂瀵稿強璺濈 * @param index 鎷栨嫿璁惧鍦ㄦ暟缁勪腑鐨勪笅鏍� */ resize(newRect, index) { - console.log('newRect', newRect) - if (newRect.width > 100) { - if (newRect.width / newRect.height < 2) { - this.deviceList[index].fontSize = newRect.width / 10 - } else { - this.deviceList[index].fontSize = newRect.height / 5 - } - } else { - this.deviceList[index].fontSize = 12 - } + // if (newRect.width > 100) { + // if (newRect.width / newRect.height < 2) { + // this.deviceList[index].fontSize = newRect.width / 10 + // } else { + // this.deviceList[index].fontSize = newRect.height / 5 + // } + // } else { + // this.deviceList[index].fontSize = 12 + // } this.deviceList[index].vw = newRect.width this.deviceList[index].vh = newRect.height - this.deviceList[index].top = newRect.top - this.deviceList[index].left = newRect.left + this.deviceList[index].coordinateTop = newRect.top + this.deviceList[index].coordinateLeft = newRect.left }, + /** * 鏍规嵁璁惧鐘舵�佸�艰幏鍙栧搴旇澶囨暟閲� * @param value 璁惧鐘舵�佸�� * @returns {number} 璁惧鏁伴噺 */ getDeviceNumberByStatus(value) { - return this.deviceList.filter(item => item.status === value).length + return this.deviceList.filter((item) => item.equipmentStatus === value).length + }, + + /** + * 寮�鍚姛鑳借Е鍙戜簨浠� + * @param checked 褰撳墠switch鐘舵�侊紝鏄惁寮�鍚紝鍒濆涓篺alse + */ + handleSwitchChange(checked) { + this.isOperatingDevice = true + this.isResizable = !this.isResizable + this.isDraggable = !this.isDraggable + }, + + openDetail(item) { + if (!this.isSwitchChecked) { + if (item.equipmentStatus == 0) { + // this.$message.warn("璁惧澶勪簬鍏虫満鐘舵�侊紒"); + this.$message.warning('璁惧澶勪簬鍏虫満鐘舵�侊紒') + return false + } + console.log(item) + console.log(this.$refs.EquipmentDetailModal) + this.$refs.EquipmentDetailModal.initData(item.equId) + this.$refs.EquipmentDetailModal.timerModel(item.equId) + // this.equipMessageTimer = setInterval(() => { + // setTimeout( this.$refs.equmentDetaiModel.initData(item.equipmentId),0) + // },1000*10) + } + }, + + onResize() { + // 鍒╃敤灞忓箷鍒嗚鲸鐜囧拰window瀵硅薄鐨勫唴楂樺害鏉ュ垽鏂吋瀹笽E + let winFlag = window.innerHeight === window.screen.height + // 鍒╃敤window鍏ㄥ睆鏍囪瘑鏉ュ垽鏂� -- IE鏃犳晥 + let isFull = window.fullScreen || document.webkitIsFullScreen + + if (isFull === undefined) { + this.isFullscreen = winFlag + } else { + this.isFullscreen = winFlag || isFull + } + console.log(winFlag) // true鍏ㄥ睆 false涓嶆槸鍏ㄥ睆 + console.log('浠诲姟鏍忛珮搴�', this.taskBarHeight) + console.log('宸ュ叿鏍忛珮搴�', this.utilsBarHeight) + + //鍏ㄥ睆鍒欏浘绾哥洅瀛愬彲瑙嗛珮搴﹀噺鍘婚〉澶撮珮搴︼紝姝e父绐楀彛鍒欏噺鍘婚〉澶淬�佸睆骞曞簳閮ㄤ换鍔℃爮浠ュ強娴忚鍣ㄥ伐鍏锋爮楂樺害 + if (winFlag) { + console.log('瑙﹀彂鍏ㄥ睆') + this.$refs.deviceContainerRef.style.height = this.fullScreenPageHeight + + } else { + console.log('鍏抽棴鍏ㄥ睆') + // 濡傛灉鍒锋柊椤甸潰閲嶆柊鍔犺浇鍚庨粯璁ゅ浜庡叏灞忔ā寮忥紝鍒欏伐鍏锋爮楂樺害涓鸿礋鏁帮紝鍥犳闇�瑕侀��鍑哄叏灞忔ā寮忔椂閲嶇疆宸ュ叿鏍忛珮搴� + this.utilsBarHeight = window.outerHeight - window.innerHeight + this.normalPageHeight = `calc(100% - ${this.pageHeaderHeight}px - ${this.taskBarHeight}px - ${this.utilsBarHeight}px)` + this.$refs.deviceContainerRef.style.height = this.normalPageHeight + } } + + }, + created() { + if (this.$route.params.id) { + this.getDeviceListByApi(this.$route.params.id) + this.getWorkshopDetailsByApi(this.$route.params.id) + } + + + let winFlag = window.innerHeight === window.screen.height + // 鍒╃敤window鍏ㄥ睆鏍囪瘑鏉ュ垽鏂� -- IE鏃犳晥 + let isFull = window.fullScreen || document.webkitIsFullScreen + + if (isFull === undefined) { + this.isFullscreen = winFlag + } else { + this.isFullscreen = winFlag || isFull + } + + // window.addEventListener('resize', this.onResize) }, mounted() { // 绂佹鐢ㄦ埛閫変腑鍐呭 document.onselectstart = () => false }, - created() { - if (this.$route.params.workshopId) { - this.getDeviceListByApi(this.$route.params.workshopId) - } + beforeDestroy() { + // 纭繚閿�姣佸畾鏃跺櫒銆佷簨浠跺強鍥炴敹璧勬簮 + clearInterval(this.timingAcquisition) + this.timingAcquisition = null + // window.removeEventListener('resize', this.onResize) } } </script> @@ -216,35 +368,36 @@ color: #fff; .page-header { - height: 80px; font-size: 50px; text-align: center; position: relative; - .header-right { + .header-left { + width: 450px; position: absolute; - right: 200px; - top: 0; + left: 0px; + top: 35px; + display: flex; + justify-content: space-evenly; + align-items: center; + font-size: 16px; } - } - - .content-container { - position: relative; .device-status-info { + font-size: 16px; width: 400px; position: absolute; - top: 5px; - right: 5px; + top: 40px; + right: 40px; display: flex; align-items: center; justify-content: space-between; .single-status-info { - width: 60px; - display: flex; - align-items: center; - justify-content: space-between; + /*width: 70px;*/ + /*display: flex;*/ + /*align-items: center;*/ + /*justify-content: space-between;*/ .status-square { width: 14px; @@ -254,6 +407,14 @@ } } } + } + + .content-container { + width: 100%; + /*height: calc(100% - 200px);*/ + /*height: 100%;*/ + background-repeat: no-repeat; + background-size: 100% 100%; .single-device { position: absolute; @@ -273,13 +434,14 @@ width: 100%; height: 100%; display: flex; - justify-content: space-between; + align-items: end; .status-image { background-size: 100% 100%; background-repeat: no-repeat; - width: 45px; - margin-right: 10px; + width: 10px; + height: 60%; + margin-right: 5px; } .device-image { @@ -290,7 +452,6 @@ } } } - } } </style> \ No newline at end of file -- Gitblit v1.9.3