qushaowei
2023-11-22 f409a5ea59614945ecd7196e2255ef61bbb8ec3c
Merge branch 'master' of http://117.34.109.166:18448/r/vue_mdc_430 into develop
已添加2个文件
已修改8个文件
25052 ■■■■■ 文件已修改
package-lock.json 24226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/WorkshopSignage.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/OEEAnalysis.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/WorkshopSignage/EquipmentDetailModal.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/WorkshopSignageManagement.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/modules/WorkshopModal.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/user/Login.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
ÎļþÌ«´ó
package.json
@@ -12,6 +12,7 @@
  "dependencies": {
    "@antv/data-set": "^0.11.4",
    "@jeecg/antd-online-mini": "3.0.0-RC",
    "@jiaminghi/data-view": "^2.10.0",
    "@tinymce/tinymce-vue": "2.1.0",
    "@toast-ui/editor": "^2.1.2",
    "ali-oss": "^6.17.1",
@@ -126,4 +127,4 @@
    "last 2 versions",
    "not ie <= 8"
  ]
}
}
src/main.js
@@ -69,8 +69,8 @@
})
// å°†è‡ªåŠ¨æ³¨å†Œæ‰€æœ‰ç»„ä»¶ä¸ºå…¨å±€ç»„ä»¶
// import dataV from '@jiaminghi/data-view'
// Vue.use(dataV)
import dataV from '@jiaminghi/data-view'
Vue.use(dataV)
import VueDragResize from "vue-drag-resize"
Vue.component('vue-drag-resize', VueDragResize)
src/views/WorkshopSignage.vue
@@ -2,7 +2,7 @@
  <dv-full-screen-container class="full-screen-container">
    <header class="page-header">
      {{ 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">
        <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>
    </header>
@@ -30,14 +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' }"
               @mouseenter="openDetail(item)">
               @click="openDetail(item)">
            <div class="device-status">
              <div
                v-if="item.equipmentStatus == 2 || item.equipmentStatus == 1"
@@ -64,18 +71,13 @@
                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>
@@ -183,6 +185,8 @@
          this.$refs.deviceContainerRef.style.backgroundImage = `url(${this.getImgView(
            this.workshopDetails.backgroundImage
          )})`
        })
      },
@@ -267,19 +271,21 @@
      },
      openDetail(item) {
        if (item.equipmentStatus == 0) {
          // this.$message.warn("设备处于关机状态!");
          this.$message.warning('设备处于关机状态!')
          return false
        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)
        }
        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)
      },
      }
    },
    created() {
@@ -312,30 +318,23 @@
      text-align: center;
      position: relative;
      .header-right {
      .header-left {
        width: 450px;
        position: absolute;
        right: 0px;
        left: 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 {
        font-size: 16px;
        width: 400px;
        position: absolute;
        top: 5px;
        right: 5px;
        top: 40px;
        right: 40px;
        display: flex;
        align-items: center;
        justify-content: space-between;
@@ -354,6 +353,14 @@
          }
        }
      }
    }
    .content-container {
      width: 100%;
      height: calc(100% - 80px);
      background-repeat: no-repeat;
      background-size: 100% 100%;
      .single-device {
        position: absolute;
@@ -373,13 +380,15 @@
          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 {
src/views/mdc/base/OEEAnalysis.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
<template>
  <div style="width: 100%; height: 100%;">
    <a-card :bordered="false">
      <a-row type="flex" :gutter="16">
        <a-col :md="5">
          <a-tabs :activeKey="activeKey" @change="tabChange">
            <a-tab-pane key="1" tab="车间层级" force-render>
              <base-tree @getCurrSelected="changeSelectionNode"></base-tree>
            </a-tab-pane>
            <a-tab-pane v-if="isDepartType == 0" key="2" tab="部门层级">
              <depart-tree @getCurrSelectedDD="changeSelectionNodedd"></depart-tree>
            </a-tab-pane>
          </a-tabs>
        </a-col>
        <a-col :md="19">
          <OEEAnalysisList ref="deviceList" :nodeTree='selectEquement' :nodePeople='selectPeople'
                           :Type="slectTypeTree"/>
        </a-col>
      </a-row>
    </a-card>
  </div>
</template>
<script>
  import { putAction, getAction } from '@/api/manage'
  import { frozenBatch } from '@/api/api'
  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  import JInput from '@/components/jeecg/JInput'
  import BaseTree from '../common/BaseTree'
  import EfficiencyShiftList from './modules/efficiencyShiftReport/EfficiencyShiftList'
  import JSuperQuery from '@/components/jeecg/JSuperQuery'
  import JThirdAppButton from '@/components/jeecgbiz/thirdApp/JThirdAppButton'
  import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
  import { mapActions } from 'vuex'
  import OEEAnalysisList from './modules/OEEAnalysis/OEEAnalysisList'
  export default {
    name: 'OEEAnalysis',
    components: {
      OEEAnalysisList,
      JThirdAppButton,
      JInput,
      BaseTree,
      JSuperQuery,
      DepartTree,
      EfficiencyShiftList
    },
    data() {
      return {
        activeKey: '1',
        description: '设备信息',
        selectEquementId: '',
        selectEquement: {},
        slectTypeTree: '',
        selectPeople: {},
        url: {
          equipmentStatistics: '/mdc/equipment/equipmentStatistics'
        },
        isDepartType: ''
      }
    },
    created() {
      this.queryTreeData()
    },
    methods: {
      ...mapActions(['QueryDepartTree']),
      queryTreeData() {
        this.QueryDepartTree().then(res => {
          if (res.success) {
            this.isDepartType = res.result[0].value
          } else {
            // this.$message.warn(res.message)
            this.$notification.warning({
              message: '消息',
              description: res.message
            })
          }
        }).finally(() => {
        })
      },
      tabChange(val) {
        // console.log(val);
        this.activeKey = val
        this.slectTypeTree = val
      },
      changeSelectionNode(val) {
        this.selectEquement = val
        this.slectTypeTree = '1'
      },
      changeSelectionNodedd(val) {
        this.selectPeople = val
        this.slectTypeTree = '2'
      }
    }
  }
</script>
<style scoped>
  @import '~@assets/less/common.less';
  .equipMessage {
    width: 100%;
    height: 10%;
  }
  .equipMessage table {
    width: 60%;
    height: 100%;
    line-height: 50%;
  }
  .equipMessage table td {
    text-align: center;
  }
  .equipMessage table td span {
    display: inline-block;
    width: 15px;
    height: 15px;
  }
  .equipMessage table td .equipShutdown {
    background-color: #808080;
  }
  .equipMessage table td .equipStandby {
    background-color: #ffbf37;
  }
  .equipMessage table td .equipRun {
    background-color: #19FE01;
  }
  .equipMessage table td .equipAlarm {
    background-color: #FD0008;
  }
</style>
src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,562 @@
<template>
  <div style="width: 100%;">
    <div :bordered="false">
      <!-- æŸ¥è¯¢åŒºåŸŸ -->
      <div class="seach-content">
        <div class="table-page-search-wrapper">
          <a-form layout="inline" @keyup.enter.native="searchQuery">
            <a-row :gutter="24">
              <a-col :md="5" :sm="5" :xs="5">
                <a-form-item label="时间">
                  <a-range-picker
                    :placeholder="['开始时间', '结束时间']"
                    format="YYYY-MM"
                    :value="dates"
                    :mode="['month', 'month']"
                    @panelChange="dateParamChange"
                  />
                </a-form-item>
              </a-col>
              <a-col :md="5" :sm="5" :xs="5">
                <a-form-item label="班制">
                  <a-select v-model="queryParam.shiftId" placeholder="请选择班制"
                            @change="initShiftSubList" :allowClear="allowClear">
                    <a-select-option v-for="(em,index) in shiftList" :key="index" :value="em.value">
                      {{ em.label }}
                    </a-select-option>
                  </a-select>
                </a-form-item>
              </a-col>
              <a-col :md="5" :sm="5" :xs="5">
                <a-form-item label="班次">
                  <a-select v-model="queryParam.shiftSubId" placeholder="请选择班次" @change="initShiftSubListChange"
                            :allowClear="allowClearSu">
                    <a-select-option v-for="(em,index) in shiftSubList" :key="index" :value="em.value">
                      {{ em.label }}
                    </a-select-option>
                  </a-select>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="8" :xs="8">
                <a-space>
                  <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
                  <a-button type="primary" @click="searchReset" icon="reload">重置</a-button>
                  <a-button type="primary" @click="exportExcel" icon="download">导出</a-button>
                </a-space>
              </a-col>
            </a-row>
          </a-form>
        </div>
      </div>
      <div class="container" id="EfficiencyShift" style="margin-top: 20px;">
        <div class="table2">
          <a-table :columns="columns" :dataSource="dataSource.records" :pagination="false" bordered
                   :scroll="{ x: 1500, y: false }">
          </a-table>
        </div>
      </div>
      <div class="pagination">
        <a-pagination
          :total=dataSource.total
          :show-total="(total, range) => `${range[0]}-${range[1]} å…± ${total} æ¡`"
          :page-size="+queryParam.pageSize"
          :default-current="1"
          :current=+queryParam.pageNo
          show-size-changer
          :pageSizeOptions="['10','15','20','25']"
          @change="handlePageNoChange"
          @showSizeChange="handlePageSizeChange"
        />
      </div>
    </div>
  </div>
</template>
<script>
  import moment from 'moment'
  import { putAction, getAction } from '@/api/manage'
  import $ from 'jquery'
  import '@/components/table2excel/table2excel'
  import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api'
  export default {
    name: 'OEEAnalysisList',
    components: {},
    data() {
      return {
        typeTree: '',
        typeParent: 1,
        typeEquipment: 1,
        allowClear: true,
        allowClearSu: true,
        dates: [moment().subtract('month', 1), moment().subtract('month', 1)],
        identifying: [],
        queryParam: {
          pageSize: 10,
          pageNo: 1
        },
        queryParamEquip: {},
        queryParamPeople: {},
        url: {
          list: '/mdc/mdcOverallEquipmentEfficiency/list',
          initShiftList: '/mdc/mdcMdcShift/initShiftList',
          initShiftSubList: '/mdc/mdcShiftSub/initShiftSubList'
        },
        shiftList: [],
        shiftSubList: [],
        columns: [
          {
            title: '序号',
            dataIndex: '',
            key: 'rowIndex',
            width: 70,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            },
            fixed: 'left'
          },
          {
            title: '设备统一编号',
            align: 'center',
            dataIndex: 'equipmentId',
            width: 120,
            fixed: 'left'
          },
          {
            title: '设备名称',
            align: 'center',
            width: 150,
            dataIndex: 'equipmentName',
            fixed: 'left'
          },
          {
            title: '设备型号',
            align: 'center',
            width: 110,
            dataIndex: 'equipmentModel'
          },
          {
            title: '日期',
            align: 'center',
            width: 100,
            dataIndex: 'validDate'
          },
          {
            title: '班次',
            align: 'center',
            width: 80,
            dataIndex: 'shift'
          },
          {
            title: '每班小时',
            dataIndex: 'shiftTimeCount',
            align: 'center',
            width: 110
          },
          {
            title: '加班时间(分钟)',
            dataIndex: 'overtime',
            align: 'center',
            width: 110
          },
          {
            title: '实际班产天数',
            dataIndex: 'actualWorkDayCount',
            align: 'center',
            width: 120
          },
          {
            title: '月度实际班产总时间(分钟)',
            dataIndex: 'monthActualWorkDayTimeCount',
            align: 'center',
            width: 110
          },
          {
            title: '非计划停机损失(分钟)(一个月)',
            children: [
              {
                title: '故障停机',
                dataIndex: 'breakdownDownDuration',
                align: 'center',
                width: 100
              },
              {
                title: '换型调试',
                dataIndex: 'conversionDebugDuration',
                align: 'center',
                width: 100
              },
              {
                title: '物料短缺',
                dataIndex: 'materialShortageDuration',
                align: 'center',
                width: 100
              },
              {
                title: '计划等任务',
                dataIndex: 'plannedTaskDuration',
                align: 'center',
                width: 110
              },
              {
                title: '检验',
                dataIndex: 'inspectDuration',
                align: 'center',
                width: 100
              },
              {
                title: '其他',
                dataIndex: 'otherDuration',
                align: 'center',
                width: 100
              }
            ]
          },
          {
            title: '计划停机时间(分钟)(一个月)',
            children: [
              {
                title: '计划保养',
                dataIndex: 'plannedMaintenanceDuration',
                align: 'center',
                width: 100
              },
              {
                title: '会议/培训',
                dataIndex: 'conferenceTrainingDuration',
                align: 'center',
                width: 110
              },
              {
                title: '其他休息等',
                dataIndex: 'otherRestDuration',
                align: 'center',
                width: 110
              }]
          },
          {
            title: '负荷时间(小时)',
            dataIndex: 'loadTime',
            align: 'center',
            width: 110
          },
          {
            title: '时间开动率',
            dataIndex: 'timeActuationRate',
            align: 'center',
            width: 110,
            customRender: text => text != 0 ? text * 100 + '%' : 0
          },
          {
            title: '加工零件数(件)',
            dataIndex: 'processQuantity',
            align: 'center',
            width: 120
          },
          {
            title: '标准加工时间(分钟)',
            dataIndex: 'standardProcessDuration',
            align: 'center',
            width: 120
          },
          {
            title: '性能开动率',
            dataIndex: 'performanceRate',
            align: 'center',
            width: 110,
            customRender: text => text != 0 ? text * 100 + '%' : 0
          },
          {
            title: '废品数',
            dataIndex: 'unqualifiedQuantity',
            align: 'center',
            width: 100
          },
          {
            title: '合格率',
            dataIndex: 'passRate',
            align: 'center',
            width: 100,
            customRender: text => text != 0 ? text * 100 + '%' : 0
          },
          {
            title: '设备综合效率',
            dataIndex: 'overallEquipmentEfficiency',
            align: 'center',
            width: 120,
            customRender: text => text != 0 ? text * 100 + '%' : 0
          }
        ],
        dataSource: []
      }
    },
    props: { nodeTree: '', Type: '', nodePeople: '' },
    created() {
      this.initShiftList()
      this.queryParam.startTime = moment(this.dates[0]).format('YYYY-MM')
      this.queryParam.endTime = moment(this.dates[1]).format('YYYY-MM')
      this.queryParam.typeTree = '1'
      this.loadData()
    },
    watch: {
      Type(valmath) {
        this.dataList = []
        this.queryParam.typeTree = valmath
      },
      nodeTree(val) { //监听currSelected å˜åŒ–,将变化后的数值传递给 getCurrSelected äº‹ä»¶
        console.log(val)
        if (JSON.stringify(val) != '{}') {
          if (val.equipmentId != null) {
            this.queryParamEquip.parentId = ''
            this.queryParamEquip.equipmentId = val.equipmentId
          } else {
            this.queryParamEquip.parentId = val.key
            this.queryParamEquip.equipmentId = ''
          }
          this.searchQuery()
        }
      },
      nodePeople(val) {
        if (JSON.stringify(val) != '{}') {
          if (val.equipmentId != null) {
            this.queryParamPeople.parentId = val.equipmentId
            this.queryParamPeople.equipmentId = ''
          } else {
            this.queryParamPeople.parentId = val.key
            this.queryParamPeople.equipmentId = ''
          }
          this.searchQuery()
        }
      }
    },
    filters: {
      numFilter(value) {
        if (value) {
          return parseFloat((value * 100).toFixed(2))
        } else {
          return '0'
        }
      }
    },
    methods: {
      dateParamChange(value) {
        this.dates = value
        this.queryParam.startTime = moment(this.dates[0]).format('YYYY-MM')
        this.queryParam.endTime = moment(this.dates[1]).format('YYYY-MM')
      },
      initShiftList() {
        getAction(this.url.initShiftList).then((res) => {
          if (res.success) {
            this.shiftList = res.result
          }
        })
      },
      initShiftSubList(val) {
        //每次重新选择班制时班次清空且显示placeholder内容
        this.queryParam.shiftSubId = undefined
        getAction(this.url.initShiftSubList, { shiftId: val }).then((res) => {
          if (res.success) {
            this.shiftSubList = res.result
          }
        })
      },
      initShiftSubListChange() {
        getAction(this.url.initShiftSubList, { shiftId: this.queryParam.shiftId }).then((res) => {
          if (res.success) {
            this.shiftSubList = res.result
          }
        })
      },
      exportExcel() {
        $('#EfficiencyShift').table2excel({
          exclude: '.noExl',
          name: 'Excel Document Name',
          filename: '设备综合效率分析',
          exclude_img: true,
          fileext: '.xls',
          exclude_links: true,
          exclude_inputs: true
        })
      },
      searchQuery() {
        if (this.dates != '') {
          if (this.queryParam.typeTree == '1') {
            this.queryParam.parentId = this.queryParamEquip.parentId
            this.queryParam.equipmentId = this.queryParamEquip.equipmentId
          } else {
            this.queryParam.parentId = this.queryParamPeople.parentId
            this.queryParam.equipmentId = ''
          }
          this.queryParam.pageNo = 1
          this.loadData()
        } else {
          // this.$message.warning("请选择时间")
          this.$notification.warning({
            message: '消息',
            description: '请选择时间'
          })
        }
        // this.onClearSelected()
      },
      searchReset() {
        this.typeTree = this.queryParam.typeTree
        this.typeParent = this.queryParam.parentId
        this.typeEquipment = this.queryParam.equipmentId
        this.queryParam = {
          pageSize: 10,
          pageNo: 1
        }
        this.dates = []
        this.shiftSubList = []
        this.queryParam.typeTree = this.typeTree
        this.queryParam.parentId = this.typeParent
        this.queryParam.equipmentId = this.typeEquipment
        this.loadData()
      },
      loadData() {
        getAction(this.url.list, this.queryParam).then(res => {
          if (res.success) {
            this.dataSource = res.result
          }
        })
      },
      /**
       * åˆ†é¡µå™¨é¡µæ•°å‘生改变时触发
       * @param page æ”¹å˜åŽé¡µæ•°
       * @param pageSize æ”¹å˜åŽæ¯é¡µå±•示数据条数
       */
      handlePageNoChange(page, pageSize) {
        this.queryParam.pageNo = page
        this.loadData()
      },
      /**
       * åˆ†é¡µå™¨æ¯é¡µå±•示数据条数发生改变时触发
       * @param current æ”¹å˜åŽé¡µæ•°
       * @param size æ”¹å˜åŽæ¯é¡µå±•示数据条数
       */
      handlePageSizeChange(current, size) {
        this.queryParam.pageSize = size
        this.loadData()
      }
    }
  }
</script>
<style scoped>
  .table2 {
    width: 100%;
    height: 100%;
    overflow: auto;
  }
  .pagination {
    display: flex;
    justify-content: end;
    margin: 20px 0;
  }
  @media screen and (min-width: 1920px) {
    #EfficiencyShift {
      height: 670px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1680px) and (max-width: 1920px) {
    #EfficiencyShift {
      height: 670px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1400px) and (max-width: 1680px) {
    #EfficiencyShift {
      height: 522px !important;
      overflow: scroll;
    }
  }
  @media screen and (min-width: 1280px) and (max-width: 1400px) {
    #EfficiencyShift {
      height: 414px !important;
      overflow: scroll;
    }
  }
  @media screen and (max-width: 1280px) {
    #EfficiencyShift {
      height: 414px !important;
      overflow: scroll;
    }
  }
  .identifyingclass {
    width: 55px;
    height: 15px;
    display: inline-block
  }
  .dataContent {
    white-space: nowrap;
    /*margin: 0;*/
    /*border: none;*/
    border-collapse: separate;
    border-spacing: 0;
    /*table-layout: fixed;*/
    border: 1px solid #ccc;
    /*border: 1px solid #ccc;*/
    width: 100%;
    /*height: 100%;*/
    /*overflow: hidden;*/
    /*overflow-y: auto;*/
    text-align: center;
  }
  .dataContent .fixed th {
    width: 50px;
  }
  .dataContent .thead th {
    background-color: #fafafa;
    text-align: center;
    height: 30px;
    padding: 5px;
  }
  .dataContent .notfixed th {
    width: auto;
  }
  /*.dataContent tr td {*/
  /*height: 35px*/
  /*}*/
  .dataContent .mathData td {
    padding: 10px;
    /*display: none;*/
  }
  .dataContent .mathData .td {
    /*background-color: #ff9bd2;*/
    display: inline-block;
    padding: 10px;
  }
  .dataContent .mathData .tdd {
    /*display: none;*/
  }
</style>
src/views/mdc/base/modules/WorkshopSignage/EquipmentDetailModal.vue
@@ -1343,7 +1343,7 @@
      handleCancel() {
        this.$emit('close')
        this.visible = false
        this.modalNode.removeEventListener('mouseleave', this.closeModal)
        // this.modalNode.removeEventListener('mouseleave', this.closeModal)
        if(this.modalTimer){
          clearInterval(this.modalTimer)
          this.modalTimer = null
@@ -1390,11 +1390,11 @@
      },
      getModalNode() {
        console.log(document.querySelector('.ant-modal-content'))
        this.modalNode = document.querySelector('.ant-modal-content')
        this.timeout = setTimeout(() => {
          this.modalNode.addEventListener('mouseleave', this.closeModal)
        }, 100)
        // console.log(document.querySelector('.ant-modal-content'))
        // this.modalNode = document.querySelector('.ant-modal-content')
        // this.timeout = setTimeout(() => {
        //   this.modalNode.addEventListener('mouseleave', this.closeModal)
        // }, 100)
      },
      closeModal() {
src/views/system/WorkshopSignageManagement.vue
@@ -230,6 +230,11 @@
          scopedSlots: { customRender: 'backgroundImage' },
        },
        {
          title: '设备编号颜色',
          dataIndex: 'equipmentIdColor',
          align: 'center',
        },
        {
          title: '操作',
          dataIndex: 'action',
          align: 'center',
src/views/system/modules/WorkshopModal.vue
@@ -18,6 +18,9 @@
        <a-form-model-item label="车间背景图" required prop="backgroundImage">
          <j-image-upload class="avatar-uploader" text="上传" v-model="model.backgroundImage"></j-image-upload>
        </a-form-model-item>
        <a-form-model-item label="设备编号颜色">
          <a-input type="color" v-model="model.equipmentIdColor"></a-input>
        </a-form-model-item>
      </a-form-model>
    </a-spin>
  </a-modal>
@@ -28,6 +31,7 @@
  export default {
    name: 'WorkshopModal',
    components: {},
    data() {
      return {
        title: '操作',
@@ -49,7 +53,7 @@
            { min: 0, max: 64, message: '长度不超过 64 ä¸ªå­—符', trigger: 'blur' },
            { validator: this.validateRoleCode }
          ],
          backgroundImage:[
          backgroundImage: [
            { required: true, message: '请上传车间背景图!' }
          ]
        }
src/views/user/Login.vue
@@ -170,9 +170,9 @@
        duration: 4,
      });
      //账户密码登录错误后更新验证码
      if (this.customActiveKey === 'tab1' && description.indexOf('密码错误') > 0) {
        this.$refs.alogin.handleChangeCheckCode()
      }
      // if (this.customActiveKey === 'tab1' && description.indexOf('密码错误') > 0) {
      //   this.$refs.alogin.handleChangeCheckCode()
      // }
      this.loginBtn = false;
    },
    loginSelectOk() {