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