qushaowei
2023-12-13 41d50b20c975faeaa9e5277bdcff13b5acecb575
src/views/WorkshopSignage.vue
@@ -1,8 +1,8 @@
<template>
  <dv-full-screen-container class="full-screen-container">
    <header class="page-header">
    <header class="page-header" :style="{height: pageHeaderHeight+'px'}">
      {{ workshopDetails.workshopName }}
      <div class="header-right" v-has="'home:saveDevicePositionAndSize'">
      <div class="header-left" v-has="'home:saveDevicePositionAndSize'">
        <a-space>
          <span v-if="!isSwitchChecked">开启功能</span>
          <span v-else>关闭功能</span>
@@ -14,7 +14,14 @@
            :disabled="isSwitchChecked"
          />
        </a-space>
        <a-button type="primary" icon="save" size="large" @click="saveDevicePositionAndSizeByApi">保存位置 </a-button>
        <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>
@@ -30,13 +37,14 @@
          v-on:resizing="resize($event, index)"
          v-on:dragging="resize($event, index)"
          :parentLimitation="true"
          :minw="100"
          :minh="100"
          :minw="70"
          :minh="70"
          :isDraggable="isDraggable"
          :isResizable="isResizable"
          :stickSize="6"
        >
          <div class="single-device" :style="{ width: item.vw + 'px', height: item.vh + 'px' }">
          <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"
@@ -63,307 +71,387 @@
                class="device-image"
              ></div>
            </div>
            <div class="device-id" :style="{ fontSize: item.fontSize + 'px' }">
            <div class="device-id" id="deviceId"
                 :style="{ fontSize: item.fontSize + 'px',color:workshopDetails.equipmentIdColor }">
              {{ 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>
        </div>
      </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 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'
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
        }
      })
    },
  message.config({
    maxCount: 3
  })
    /**
     * 通过车间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
        )})`
      })
  export default {
    components: {
      VueDragResize,
      EquipmentDetailModal
    },
    /**
     * 图片预览
     * @param text 图片地址
     */
    getImgView(text) {
      if (text && text.indexOf(',') > 0) {
        text = text.substring(0, text.indexOf(','))
    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
          //   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'
          }
        ],// 设备状态指示灯列表,
        isFullscreen: false
      }
      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)
    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
          }
        })
      } else {
        this.$notification.warning({
          message: '消息',
          description: '请开启功能后再进行保存',
      },
      /**
       * 通过车间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('触发保存')
        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状态,是否开启,初始为false
       */
      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对象的内高度来判断兼容IE
        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)
        //全屏则图纸盒子可视高度减去页头高度,正常窗口则减去页头、屏幕底部任务栏以及浏览器工具栏高度
        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
        }
      }
    },
    /**
     * 设备拖拽或缩放时触发事件
     * @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
    },
    created() {
      if (this.$route.params.id) {
        this.getDeviceListByApi(this.$route.params.id)
        this.getWorkshopDetailsByApi(this.$route.params.id)
      }
    /**
     * 根据设备状态值获取对应设备数量
     * @param value 设备状态值
     * @returns {number} 设备数量
     */
    getDeviceNumberByStatus(value) {
      return this.deviceList.filter((item) => item.equipmentStatus === value).length
    },
    /**
     * 开启功能触发事件
     * @param checked 当前switch状态,是否开启,初始为false
     */
    handleSwitchChange(checked) {
      this.isOperatingDevice = true
      this.isResizable = !this.isResizable
      this.isDraggable = !this.isDraggable
      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)
    },
  },
  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
      // window.removeEventListener('resize', this.onResize)
    }
  },
  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;
  .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;
  .full-screen-container {
    background-image: url('../assets/Bj.jpg');
    background-size: 100% 100%;
    color: #fff;
    .device-status-info {
      width: 400px;
      position: absolute;
      top: 5px;
      right: 5px;
      display: flex;
      align-items: center;
      justify-content: space-between;
    .page-header {
      font-size: 50px;
      text-align: center;
      position: relative;
      .single-status-info {
        width: 60px;
      .header-left {
        width: 450px;
        position: absolute;
        left: 0px;
        top: 35px;
        display: flex;
        justify-content: space-evenly;
        align-items: center;
        font-size: 16px;
      }
      .device-status-info {
        font-size: 16px;
        width: 400px;
        position: absolute;
        top: 40px;
        right: 40px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        .status-square {
          width: 14px;
          height: 14px;
          border: 1px solid #fff;
          border-radius: 2px;
        .single-status-info {
          /*width: 70px;*/
          /*display: flex;*/
          /*align-items: center;*/
          /*justify-content: space-between;*/
          .status-square {
            width: 14px;
            height: 14px;
            border: 1px solid #fff;
            border-radius: 2px;
          }
        }
      }
    }
    .single-device {
      position: absolute;
      border: 1px solid transparent;
      padding: 10px;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: space-between;
      cursor: default;
    .content-container {
      width: 100%;
      /*height: calc(100% - 200px);*/
      /*height: 100%;*/
      background-repeat: no-repeat;
      background-size: 100% 100%;
      &:active {
        border: 1px solid #1890ff;
      }
      .device-status {
        width: 100%;
        height: 100%;
      .single-device {
        position: absolute;
        border: 1px solid transparent;
        padding: 10px;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: space-between;
        cursor: default;
        .status-image {
          background-size: 100% 100%;
          background-repeat: no-repeat;
          width: 45px;
          margin-right: 10px;
        &:active {
          border: 1px solid #1890ff;
        }
        .device-image {
          background-size: 100% 100%;
          background-repeat: no-repeat;
        .device-status {
          width: 100%;
          height: 100%;
          display: flex;
          align-items: end;
          .status-image {
            background-size: 100% 100%;
            background-repeat: no-repeat;
            width: 10px;
            height: 60%;
            margin-right: 5px;
          }
          .device-image {
            background-size: 100% 100%;
            background-repeat: no-repeat;
            width: 100%;
            height: 100%;
          }
        }
      }
    }
  }
}
</style>