From 50706e13d5df93ceb541d39810df5845b5af7d71 Mon Sep 17 00:00:00 2001
From: “linengliang” <vanSuperEnergy@163.com>
Date: 星期日, 29 十月 2023 23:29:30 +0800
Subject: [PATCH] 消息加台账导入
---
src/views/WorkshopSignage.vue | 630 ++++++++++++++++++++++++++++++--------------------------
1 files changed, 336 insertions(+), 294 deletions(-)
diff --git a/src/views/WorkshopSignage.vue b/src/views/WorkshopSignage.vue
index d77fc20..c566a50 100644
--- a/src/views/WorkshopSignage.vue
+++ b/src/views/WorkshopSignage.vue
@@ -1,327 +1,369 @@
<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="saveDevicePositionByApi">淇濆瓨浣嶇疆</a-button>
+ {{ workshopDetails.workshopName }}
+ <div class="header-right" 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>
</header>
- <dv-border-box-8 class="content-container">
- <!--<div v-for="item in deviceList" :key="item.equipmentId" class="single-device"-->
- <!--:style="{top:item.top+'px',left:item.left+'px',height:'135px',width:'175px'}" @mousedown="handleMouseDown"-->
- <!--:id="item.equipmentId">-->
- <!--<div class="device-status">-->
- <!--<img v-if="item.status==0" src="@/assets/yellow.png" draggable="false">-->
- <!--<img v-if="item.status==1" src="@/assets/red.png" draggable="false">-->
- <!--<img v-if="item.status==2" src="@/assets/gray.png" draggable="false">-->
- <!--<img v-if="item.status==3" src="@/assets/green.png" draggable="false">-->
- <!--<img :src="item.equipmentImageUrl" draggable="false">-->
- <!--</div>-->
- <!--<div class="device-id">{{item.equipmentId}}</div>-->
- <!--<!–<div draggable="false" class="device-info">–>-->
- <!--<!–<div v-if="item.status==0" class="status-square" style="background-color: gray"></div>–>-->
- <!--<!–<div v-if="item.status==1" class="status-square" style="background-color: red"></div>–>-->
- <!--<!–<div v-if="item.status==2" class="status-square" style="background-color: green"></div>–>-->
- <!--<!–<div v-if="item.status==3" class="status-square" style="background-color: yellow"></div>–>-->
- <!--<!–<div class="device-id">{{item.equipmentId}}</div>–>-->
- <!--<!–</div>–>-->
- <!--<!–</div>–>-->
- <!--</div>-->
- <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="175"
- :minh="135"
- :id="item.equipmentId"
-
- >
- <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="100"
+ :minh="100"
+ :isDraggable="isDraggable"
+ :isResizable="isResizable"
+ :stickSize="6"
+ >
+ <div class="single-device" :style="{ width: item.vw + 'px', height: item.vh + 'px' }">
+ <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" :style="{ fontSize: item.fontSize + 'px' }">
+ {{ item.equipmentId }}
+ </div>
</div>
- <div class="device-id" :style="{fontSize: item.fontSize+'px'}">
- {{item.equipmentId}}
+ </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>
- <!--<div draggable="false" class="device-info">-->
- <!--<div v-if="item.status==0" class="status-square" style="background-color: gray"></div>-->
- <!--<div v-if="item.status==1" class="status-square" style="background-color: red"></div>-->
- <!--<div v-if="item.status==2" class="status-square" style="background-color: green"></div>-->
- <!--<div v-if="item.status==3" class="status-square" style="background-color: yellow"></div>-->
- <!--<div class="device-id">{{item.equipmentId}}</div>-->
- <!--</div>-->
</div>
- </VueDragResize>
+ </div>
</dv-border-box-8>
</dv-full-screen-container>
</template>
<script>
- import VueDragResize from 'vue-drag-resize'
+import VueDragResize from 'vue-drag-resize'
+import api from '@/api/mdc'
+import { getFileAccessHttpUrl } from '@/api/manage'
- export default {
- components: {
- VueDragResize
- },
- data() {
- return {
- mouseX: 0, // 榧犳爣鍦ㄥ厓绱犲唴鐨刋鍧愭爣
- mouseY: 0, // 榧犳爣鍦ㄥ厓绱犲唴鐨刌鍧愭爣,
- dragging: false, //鏄惁鍦ㄦ嫋鎷戒腑
- elementId: '',// 琚嫋鎷藉厓绱犵殑id灞炴�у��
- elementWidth: '',
- elementHeight: '',
- deviceList: [
- {
- equipmentId: '123213213123232',
- equipmentImageUrl: require('@/assets/8.png'),
- top: 200,
- left: 100,
- vw: 175,
- vh: 135,
- fontSize: 20,
- status: 1
- },
- {
- equipmentId: '512346789561232',
- equipmentImageUrl: require('@/assets/8.png'),
- top: 500,
- left: 753,
- vw: 175,
- vh: 135,
- fontSize: 20,
- status: 0
- },
- {
- equipmentId: '64746965647653',
- equipmentImageUrl: require('@/assets/8.png'),
- top: 300,
- left: 860,
- vw: 175,
- vh: 135,
- fontSize: 20,
- status: 2
- },
- {
- equipmentId: '33548976965462',
- equipmentImageUrl: require('@/assets/8.png'),
- top: 100,
- left: 380,
- vw: 175,
- vh: 135,
- fontSize: 20,
- status: 3
- },
- {
- equipmentId: '85484913549253',
- equipmentImageUrl: require('@/assets/8.png'),
- top: 200,
- left: 1500,
- vw: 175,
- vh: 135,
- fontSize: 20,
- status: 2
- }
- ]
- }
- },
- computed: {
- getWorkshopName() {
- switch (this.$route.params.workshopId) {
- case '5321':
- return '闀挎矙杞﹂棿'
- case '6312':
- return '澶╂触杞﹂棿'
- case '3463':
- return '姝︽眽杞﹂棿'
- case '8421':
- return '鍖椾含杞﹂棿'
- default:
- return '娴嬭瘯杞﹂棿'
- }
- }
- },
- methods: {
- /**
- * 閫氳繃杞﹂棿Id璋冪敤鎺ュ彛鑾峰彇璁惧鍒楄〃
- * @param workshopId 杞﹂棿Id
- */
- getDeviceListByApi(workshopId) {
- console.log('杞﹂棿Id', workshopId)
- },
- /**
- * 鎷栨嫿瀵硅薄榧犳爣鎸夐敭鎸変笅浜嬩欢
- * @param event
- */
- handleMouseDown(event) {
- this.dragging = true
- this.mouseX = event.clientX
- this.mouseY = event.clientY
- this.elementId = event.currentTarget.id
- this.top = event.currentTarget.offsetTop
- this.left = event.currentTarget.offsetLeft
- document.addEventListener('mousemove', this.handleMouseMove)
- document.addEventListener('mouseup', this.handleMouseUp)
- this.elementWidth = +event.currentTarget.style.width.replace('px', '')
- this.elementHeight = +event.currentTarget.style.height.replace('px', '')
- },
- /**
- * 鏂囨。瀵硅薄榧犳爣绉诲姩浜嬩欢
- * @param event
- */
- handleMouseMove(event) {
- if (this.dragging) {
- // x鏂瑰悜榧犳爣鍋忕Щ閲�
- const deltaX = event.clientX - this.mouseX
- // y鏂瑰悜榧犳爣鍋忕Щ閲�
- const deltaY = event.clientY - this.mouseY
- this.left += deltaX
- this.top += deltaY
- this.deviceList.forEach(item => {
- if (item.equipmentId === this.elementId) {
- item.top = this.top
- item.left = this.left
- // 闄愬埗鎷栨嫿瓒呭嚭鍖哄煙(缂╂斁娴忚鍣ㄧ獥鍙e悗璺濆洓鍛ㄨ窛绂诲嚭鐜伴棶棰�)
- if (item.top < 0) {
- item.top = 0
- } else if (item.top + this.elementHeight + 80 > window.innerHeight) {
- item.top = window.innerHeight - this.elementHeight
- }
- if (item.left < 0) {
- item.left = 0
- } else if (item.left + this.elementWidth > window.innerWidth) {
- item.left = window.innerWidth - this.elementWidth
- }
- }
- })
- this.mouseX = event.clientX
- this.mouseY = event.clientY
- }
- },
- /**
- * 鏂囨。瀵硅薄榧犳爣鎸夐敭寮硅捣浜嬩欢
- * @param event
- */
- handleMouseUp(event) {
- this.dragging = false
- document.removeEventListener('mousemove', this.handleMouseMove)
- document.removeEventListener('mouseup', this.handleMouseUp)
- },
- /**
- * 鐐瑰嚮淇濆瓨鎸夐挳璋冪敤鎺ュ彛淇濆瓨鎷栨嫿鍚庣殑浣嶇疆
- */
- saveDevicePositionByApi() {
- console.log('淇濆瓨浣嶇疆')
- },
- /**
- * 璁惧鎷栨嫿鎴栫缉鏀炬椂瑙﹀彂浜嬩欢
- * @param newRect 鎷栨嫿鎴栫缉鏀惧悗鐨勫昂瀵稿強璺濈
- * @param index 鎷栨嫿璁惧鍦ㄦ暟缁勪腑鐨勪笅鏍�
- */
- resize(newRect, index) {
- console.log('newRect', newRect)
- if (newRect.width > 200) {
- this.deviceList[index].fontSize = newRect.width / 10
- } else {
- this.deviceList[index].fontSize = 20
- }
- this.deviceList[index].top = newRect.top
- this.deviceList[index].left = newRect.left
- this.deviceList[index].vw = newRect.width
- this.deviceList[index].vh = newRect.height
- }
- },
- mounted() {
- // 绂佹鐢ㄦ埛閫変腑鍐呭
- document.onselectstart = () => false
- },
- created() {
- if (this.$route.params.workshopId) {
- this.getDeviceListByApi(this.$route.params.workshopId)
- }
+export default {
+ components: {
+ VueDragResize,
+ },
+ data() {
+ return {
+ workshopDetails: {}, // 杞﹂棿璇︾粏淇℃伅,
+ isDraggable: false, // 鏄惁寮�鍚嫋鎷�
+ isResizable: false, // 鏄惁寮�鍚缉鏀�
+ isSwitchChecked: false, // 鏄惁寮�鍚姛鑳�
+ timingAcquisition: null, // 瀹氭椂鍒锋柊鏄惁寮�鍚�
+ deviceList: [
+ // {
+ // 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: 0,
+ color: '#A8A8A8',
+ },
+ {
+ label: '寰呮満',
+ value: 2,
+ color: '#FFFF00',
+ },
+ {
+ label: '杩愯',
+ value: 3,
+ color: '#00EE00',
+ },
+ {
+ label: '鎶ヨ',
+ value: 22,
+ color: '#FF0000',
+ },
+ ], // 璁惧鐘舵�佹寚绀虹伅鍒楄〃
}
- }
+ },
+ 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 id 杞﹂棿Id
+ */
+ 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
+ )})`
+ })
+ },
+
+ /**
+ * 鍥剧墖棰勮
+ * @param text 鍥剧墖鍦板潃
+ */
+ getImgView(text) {
+ if (text && text.indexOf(',') > 0) {
+ text = text.substring(0, text.indexOf(','))
+ }
+ return getFileAccessHttpUrl(text)
+ },
+
+ /**
+ * 鐐瑰嚮淇濆瓨鎸夐挳璋冪敤鎺ュ彛淇濆瓨鎷栨嫿鍚庣殑浣嶇疆涓庤澶囧浘鏍囧昂瀵�
+ */
+ saveDevicePositionAndSizeByApi() {
+ 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) {
+ // 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].coordinateTop = newRect.top
+ this.deviceList[index].coordinateLeft = newRect.left
+ },
+
+ /**
+ * 鏍规嵁璁惧鐘舵�佸�艰幏鍙栧搴旇澶囨暟閲�
+ * @param value 璁惧鐘舵�佸��
+ * @returns {number} 璁惧鏁伴噺
+ */
+ getDeviceNumberByStatus(value) {
+ 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
+ },
+ },
+ created() {
+ if (this.$route.params.id) {
+ this.getDeviceListByApi(this.$route.params.id)
+ this.getWorkshopDetailsByApi(this.$route.params.id)
+ }
+ },
+ mounted() {
+ // 绂佹鐢ㄦ埛閫変腑鍐呭
+ document.onselectstart = () => false
+ },
+ beforeDestroy() {
+ // 纭繚閿�姣佸畾鏃跺櫒鍙婂洖鏀惰祫婧�
+ clearInterval(this.timingAcquisition)
+ this.timingAcquisition = null
+ },
+}
</script>
<style scoped lang="less">
- .full-screen-container {
- background-image: url('../assets/Bj.jpg');
- background-size: 100% 100%;
- color: #fff;
+.full-screen-container {
+ background-image: url('../assets/Bj.jpg');
+ background-size: 100% 100%;
+ color: #fff;
- .page-header {
- height: 80px;
- font-size: 50px;
- text-align: center;
- position: relative;
- .header-right {
- position: absolute;
- right: 200px;
- top: 0;
+ .page-header {
+ height: 80px;
+ font-size: 50px;
+ text-align: center;
+ position: relative;
+
+ .header-right {
+ width: 450px;
+ position: absolute;
+ right: 0px;
+ top: 35px;
+ display: flex;
+ justify-content: space-evenly;
+ align-items: center;
+ font-size: 16px;
+ }
+ }
+
+ .content-container {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+
+ .device-status-info {
+ width: 400px;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ .single-status-info {
+ width: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ .status-square {
+ width: 14px;
+ height: 14px;
+ border: 1px solid #fff;
+ border-radius: 2px;
+ }
}
}
- .content-container {
- position: relative;
- .single-device {
- position: absolute;
- border: 1px solid transparent;
- padding: 10px;
+ .single-device {
+ position: absolute;
+ border: 1px solid transparent;
+ padding: 10px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ cursor: default;
+
+ &:active {
+ border: 1px solid #1890ff;
+ }
+
+ .device-status {
+ width: 100%;
+ height: 100%;
display: flex;
- flex-direction: column;
- align-items: center;
justify-content: space-between;
- cursor: default;
- &:active {
- border: 1px solid #1890ff;
+
+ .status-image {
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ width: 45px;
+ margin-right: 10px;
}
- .device-status {
+
+ .device-image {
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
width: 100%;
height: 100%;
- display: flex;
- justify-content: space-between;
- .status-image {
- background-size: 100% 100%;
- background-repeat: no-repeat;
- width: 45px;
- margin-right: 10px;
- }
- .device-image {
- background-size: 100% 100%;
- background-repeat: no-repeat;
- width: 100%;
- height: 100%;
- }
}
- .device-id {
- /*font-size: 20px;*/
- }
- /*.device-info {*/
- /*width: 100%;*/
- /*display: flex;*/
- /*align-items: center;*/
- /*justify-content: space-between;*/
- /*.status-square {*/
- /*width: 14px;*/
- /*height: 14px;*/
- /*border: 1px solid #fff;*/
- /*border-radius: 2px;*/
- /*}*/
- /*}*/
}
}
}
+}
</style>
\ No newline at end of file
--
Gitblit v1.9.3