From f360cde8ff0b28ba677a4693cf45f47f206dd746 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期三, 21 五月 2025 17:52:54 +0800
Subject: [PATCH] 1、设备管理中设备属性的字段显隐权限调整到设备状态字段 2、设备日志添加批量导出功能

---
 src/views/mdc/base/modules/WorkshopSignage/DeviceDragLayout.vue |  283 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 187 insertions(+), 96 deletions(-)

diff --git a/src/views/mdc/base/modules/WorkshopSignage/DeviceDragLayout.vue b/src/views/mdc/base/modules/WorkshopSignage/DeviceDragLayout.vue
index bce41c4..8e27e76 100644
--- a/src/views/mdc/base/modules/WorkshopSignage/DeviceDragLayout.vue
+++ b/src/views/mdc/base/modules/WorkshopSignage/DeviceDragLayout.vue
@@ -1,7 +1,5 @@
 <template>
   <div>
-    <div class="guideline guidelineX" :style="{top:guidelineXTop+'px',display:showGuideline}"></div>
-    <div class="guideline guidelineY" :style="{left:guidelineYLeft+'px',display:showGuideline}"></div>
     <VueDragResize
       v-for="(item, index) in deviceList"
       :key="item.equipmentId"
@@ -14,136 +12,229 @@
       :parentLimitation="true"
       :parentH="1065"
       :parentW="1500"
-      :minw="70"
-      :minh="70"
-      :isDraggable="true"
-      :isResizable="true"
+      :minw="50"
+      :minh="50"
+      :isDraggable="isSwitchChecked"
+      :isResizable="isSwitchChecked"
       :stickSize="6"
-      @deactivated="showGuideline = 'none'"
+      @deactivated="isShowGuideline = false"
     >
       <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/default.png')})` }"
+            :style="{ backgroundImage: `url(${getImgView(item.equipmentImage) || require('@/assets/WorskhopSignage/default.png')})` }"
             class="device-image"
-          ></div>
+          >
+            <div
+              :style="{ backgroundImage: `url(${getCurrentDeviceStatusImage(item.oporation)})` }"
+              class="status-image"
+            ></div>
+          </div>
         </div>
-        <div
-          :style="{ color:workshopDetails.equipmentIdColor?workshopDetails.equipmentIdColor:'#fff',marginTop:'10px' }">
-          {{ item.equipmentId }}
-        </div>
+        <div :style="{backgroundColor:item.equipmentStatus!==0?'#f00':'rgba(0,0,0,.4)'}">{{ item.equipmentId }}</div>
       </div>
     </VueDragResize>
+
+    <template v-if="isShowGuideline">
+      <div class="guideline guidelineX" :style="{top:guidelineXTop+'px'}"></div>
+      <div class="guideline guidelineY" :style="{left:guidelineYLeft+'px'}"></div>
+    </template>
+
+    <a-form layout="inline" v-has="'isCanDragAndResize'">
+      <a-form-item label="鍔熻兘寮�鍏�">
+        <a-switch checked-children="寮�" un-checked-children="鍏�" v-model="isSwitchChecked" @change="handleSwitchChange"
+                  :disabled="isHasResizeOrDragDevice"/>
+      </a-form-item>
+
+      <a-form-item label="淇濆瓨鍧愭爣">
+        <a-button type="primary" icon="save" @click="saveDevicePositionAndSizeByApi"
+                  :disabled="!isHasResizeOrDragDevice">淇濆瓨
+        </a-button>
+      </a-form-item>
+    </a-form>
   </div>
 </template>
 
 <script>
-  export default {
-    name: 'DeviceDragLayout',
-    components: {},
-    props: {
-      deviceList: {
-        type: Array
-      }
+import signageApi from '@/api/signage'
+import VueDragResize from 'vue-drag-resize'
+
+export default {
+  name: 'DeviceDragLayout',
+  components: {
+    VueDragResize
+  },
+  props: {
+    currentProductionId: {
+      type: String
     },
-    data() {
-      return {
-        showGuideline: 'none',
-        guidelineXTop: 0,
-        guidelineYLeft: 0
-      }
+    getImgView: {
+      type: Function
     },
-    methods: {
-      /**
-       * 璁惧鎷栨嫿鎴栫缉鏀炬椂瑙﹀彂浜嬩欢
-       * @param newRect 鎷栨嫿鎴栫缉鏀惧悗鐨勫昂瀵稿強璺濈
-       * @param index 鎷栨嫿璁惧鍦ㄦ暟缁勪腑鐨勪笅鏍�
-       */
-      resize(newRect, index) {
-        this.showGuideline = 'block'
-        this.deviceList[index].vw = newRect.width
-        this.deviceList[index].vh = newRect.height
-        this.deviceList[index].coordinateTop = newRect.top
-        this.deviceList[index].coordinateLeft = newRect.left
-        this.guidelineXTop = newRect.top + newRect.height / 2
-        this.guidelineYLeft = newRect.left + newRect.width / 2
+    equipmentStatusList: {
+      type: Array
+    }
+  },
+  data() {
+    return {
+      deviceList: [],
+      isShowGuideline: false,
+      guidelineXTop: 0,
+      guidelineYLeft: 0,
+      isSwitchChecked: false,
+      isHasResizeOrDragDevice: false
+    }
+  },
+  created() {
+    if (!this.currentProductionId) return
+    this.getDeviceListByApi()
+  },
+  methods: {
+    // 閫氳繃杞﹂棿Id璋冪敤鎺ュ彛鑾峰彇璁惧淇℃伅鍒楄〃
+    getDeviceListByApi() {
+      const that = this
+      signageApi.getDeviceListInWorkshopSignagePageApi(that.currentProductionId)
+        .then((res) => {
+          if (res.success && res.result && res.result.length > 0) that.deviceList = res.result
+        })
+    },
+
+    handleSwitchChange(checked) {
+      console.log('checked--------', checked)
+      this.$emit('handleTimeIntervalForShortOpen', checked)
+    },
+
+    /**
+     * 璁惧鎷栨嫿鎴栫缉鏀炬椂瑙﹀彂浜嬩欢
+     * @param newRect 鎷栨嫿鎴栫缉鏀惧悗鐨勫昂瀵稿強璺濈
+     * @param index 鎷栨嫿璁惧鍦ㄦ暟缁勪腑鐨勪笅鏍�
+     */
+    resize(newRect, index) {
+      this.isShowGuideline = true
+      // 褰撹澶囩缉鏀炬垨鎷栨嫿鍚庣鐢╯witch缁勪欢骞跺紑鏀句繚瀛樻寜閽姛鑳斤紙閬垮厤鏃犳晥璇锋眰锛�
+      if (!this.isHasResizeOrDragDevice) {
+        if (this.deviceList[index].vw !== newRect.width || this.deviceList[index].vh !== newRect.height || this.deviceList[index].coordinateTop !== newRect.top || this.deviceList[index].coordinateLeft !== newRect.left) {
+          this.isHasResizeOrDragDevice = true
+        }
       }
+      // this.isHasResizeOrDragDevice = true
+      this.deviceList[index].vw = newRect.width
+      this.deviceList[index].vh = newRect.height
+      this.deviceList[index].coordinateTop = newRect.top
+      this.deviceList[index].coordinateLeft = newRect.left
+      this.guidelineXTop = newRect.top + newRect.height / 2
+      this.guidelineYLeft = newRect.left + newRect.width / 2
+    },
+
+    // 鐐瑰嚮淇濆瓨鎸夐挳璋冪敤鎺ュ彛淇濆瓨鎷栨嫿鍚庣殑浣嶇疆涓庤澶囧浘鏍囧昂瀵�
+    saveDevicePositionAndSizeByApi() {
+      const that = this
+      signageApi.saveDevicePositionAndSizeApi(that.deviceList)
+        .then((res) => {
+          if (!res.success) return
+          that.$notification.success({
+            message: '娑堟伅',
+            description: res.message
+          })
+          that.isSwitchChecked = that.isHasResizeOrDragDevice = false
+          that.getDeviceListByApi(that.currentProductionId)
+        })
+    },
+
+    /**
+     * 鑾峰彇褰撳墠璁惧鐘舵�佸浘鐗�
+     * @param oporation 鐘舵�佺爜
+     * @returns {any} 璁惧鐘舵�佸浘鐗囪祫婧�
+     */
+    getCurrentDeviceStatusImage(oporation) {
+      const currentStatus = this.equipmentStatusList.find(item => item.value.includes(oporation))
+      return currentStatus.statusImage
     }
   }
+}
 </script>
 
 <style scoped lang="less">
-  .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;
+    -webkit-align-items: flex-end;
+    -moz-align-items: flex-end;
+    -ms-align-items: flex-end;
 
-    &:active {
-      border: 1px solid #1890ff;
-    }
-
-    .device-status {
+    .device-image {
+      background-size: 100% 100%;
+      background-repeat: no-repeat;
       width: 100%;
       height: 100%;
-      display: flex;
-      -webkit-align-items: flex-end;
-      -moz-align-items: flex-end;
-      -ms-align-items: flex-end;
+      position: relative;
+      margin-bottom: 2px;
 
       .status-image {
+        position: absolute;
+        top: 25%;
+        left: 25%;
         background-size: 100% 100%;
         background-repeat: no-repeat;
-        width: 10px;
-        height: 80%;
-        margin-right: 5px;
-      }
-
-      .device-image {
-        background-size: 100% 100%;
-        background-repeat: no-repeat;
-        width: 100%;
-        height: 100%;
+        width: 50%;
+        height: 50%;
       }
     }
   }
 
-  .guideline {
-    position: absolute;
-    border: 1px dashed #ccc;
+  & > div:last-child {
+    color: #fff;
+    font-weight: bold;
+    font-size: 0.6vw;
+  }
+}
+
+.guideline {
+  position: absolute;
+  border: 1px dashed rgba(255,255,255,.7);
+}
+
+.guidelineX {
+  width: 9999px;
+  left: 0;
+}
+
+.guidelineY {
+  top: 0;
+  height: 9999px;
+}
+
+form {
+  position: absolute;
+  right: 0;
+  bottom: 0.5%;
+
+  /deep/.ant-form-item-label > label{
+    color: #fff;
   }
 
-  .guidelineX {
-    width: 9999px;
-    left: 0;
+  .ant-switch {
+    background-color: #999;
   }
 
-  .guidelineY {
-    top: 0;
-    height: 9999px;
+  .ant-switch-checked {
+    background-color: #1890FF;
   }
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.3