1、基本实现大屏车间管理页所有功能
2、使用后台数据基本实现车间看板页面所有功能
已修改5个文件
357 ■■■■■ 文件已修改
src/api/mdc.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config/router.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/WorkshopSignage.vue 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/Analysis.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/WorkshopSignageManagement.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mdc.js
@@ -5,10 +5,16 @@
  // 获取控制系统类型
  getDriveTypeApi: () => getAction('/mdc/mdcDriveTypeParamConfig/getDriveParamOptions'),
  // -------------------------------------车间看板页面----------------------------------------
  // 首页获取大屏入口车间列表
  getWorkshopListInHomePageApi: () => getAction('/mdc/mdcWorkshopInfo/getWorkshopList'),
  // 根据车间id查询设备列表
  getDeviceListByWorkshopIdApi: params => getAction('/mdc/mdcWorkshopInfo/workshopEquipmentList', params),
  // 根据车间id查询车间详细信息
  getWorkshopDetailByWorkshopIdApi: id => getAction('/mdc/mdcWorkshopInfo/queryById', { id }),
  // 根据车间id查询大屏信息
  getDeviceListInWorkshopSignagePageApi: workshopId => getAction('/mdc/mdcWorkshopInfo/getBigScreenInfo', { workshopId }),
  // 保存大屏车间设备坐标大小信息
  saveDevicePositionAndSizeApi: params => putAction('/mdc/mdcWorkshopInfo/saveEquipmentCoordinate', params),
  // 查询车间列表
  getWorkshopListApi: params => getAction('/mdc/mdcWorkshopInfo/list', params),
  // 新增车间信息
src/config/router.config.js
@@ -372,7 +372,7 @@
    ]
  },
  {
    path:'/workshopSignage/:workshopId',
    path:'/workshopSignage/:id',
    component:()=>import('@/views/WorkshopSignage.vue')
  },
  {
src/views/WorkshopSignage.vue
@@ -1,49 +1,60 @@
<template>
  <dv-full-screen-container class="full-screen-container">
    <header class="page-header">
      {{getWorkshopName}}
      <div class="header-right">
      {{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"
                  v-has="'home:saveDevicePositionAndSize'">保存位置
        >保存位置
        </a-button>
      </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="100"
                       :minh="100"
                       :isDraggable="isDraggable"
                       :isResizable="isResizable"
                       :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.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>
      </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>
    </dv-border-box-8>
@@ -52,6 +63,8 @@
<script>
  import VueDragResize from 'vue-drag-resize'
  import api from '@/api/mdc'
  import { getFileAccessHttpUrl } from '@/api/manage'
  export default {
    components: {
@@ -59,69 +72,33 @@
    },
    data() {
      return {
        // 设备信息列表
        //  车间详细信息,
        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 +108,147 @@
          },
          {
            label: '报警',
            value: 1,
            value: 22,
            color: '#FF0000'
          }
        ]
        ] // 设备状态指示灯列表
      }
    },
    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)})`
        })
      },
      /**
       * 图片预览
       * @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
              }
            }
          })
        } 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状态,是否开启,初始为false
       */
      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
    },
    created() {
      if (this.$route.params.workshopId) {
        this.getDeviceListByApi(this.$route.params.workshopId)
      }
    beforeDestroy() {
      clearInterval(this.timingAcquisition)
      this.timingAcquisition = null
    }
  }
</script>
@@ -222,14 +266,23 @@
      position: relative;
      .header-right {
        width: 450px;
        position: absolute;
        right: 200px;
        top: 0;
        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;
src/views/dashboard/Analysis.vue
@@ -12,7 +12,7 @@
    <!--&lt;!&ndash;</a-radio-group>&ndash;&gt;-->
    <!--</div>-->
    <a-button type="primary" size="large" v-for="item in workshopList" :key="item.workshopId"
              @click="navigateToWorkshopSignage(item.workshopId)">{{item.workshopName}}
              @click="navigateToWorkshopSignage(item.id)">{{item.workshopName}}
    </a-button>
  </div>
</template>
@@ -21,6 +21,7 @@
  import IndexChart from './IndexChart'
  import IndexTask from './IndexTask'
  import IndexBdc from './IndexBdc'
  import api from '@/api/mdc'
  export default {
    name: 'Analysis',
@@ -35,30 +36,45 @@
        workshopList: [
          {
            workshopName: '长沙车间',
            workshopId: '5321'
            id: '5321'
          },
          {
            workshopName: '天津车间',
            workshopId: '6312'
            id: '6312'
          },
          {
            workshopName: '武汉车间',
            workshopId: '3463'
            id: '3463'
          },
          {
            workshopName: '北京车间',
            workshopId: '8421'
            id: '8421'
          }
        ]
      }
    },
    created() {
      this.getWorkshopListByApi()
    },
    methods: {
      navigateToWorkshopSignage(workshopId) {
        const url = this.$router.resolve(`/workshopSignage/${workshopId}`).href
      /**
       * 通过车间Id跳转至相应车间大屏看板
       * @param id 车间Id
       */
      navigateToWorkshopSignage(id) {
        const url = this.$router.resolve(`/workshopSignage/${id}`).href
        window.open(url, '_blank')
      },
      /**
       * 获取车间列表
       */
      getWorkshopListByApi() {
        api.getWorkshopListInHomePageApi().then(res => {
          console.log('res', res)
          if (res.result && res.result.length > 0) {
            this.workshopList = res.result
          }
        })
      }
    }
  }
src/views/system/WorkshopSignageManagement.vue
@@ -9,7 +9,7 @@
            <a-row :gutter="24">
              <a-col :md="12" :sm="8">
                <a-form-item label="车间名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
                  <a-input placeholder="" v-model="queryParam.roleName"></a-input>
                  <a-input placeholder="" v-model="queryParam.workshopName"></a-input>
                </a-form-item>
              </a-col>
              <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
@@ -264,7 +264,7 @@
        superQueryMatchType2: 'and',
        url: {
          list: '/mdc/mdcWorkshopInfo/list',
          delete: '/sys/role/delete',
          delete: '/mdc/mdcWorkshopInfo/delete',
          list2: '/mdc/mdcWorkshopInfo/workshopEquipmentList',
          addDeviceInWorkshop: '/mdc/mdcWorkshopInfo/addWorkshopEquipment',
          delete2: '/mdc/mdcWorkshopInfo/deleteWorkshopEquipment',