src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
@@ -5,27 +5,36 @@
      <div class="table-page-search-wrapper">
        <a-form layout="inline" @keyup.enter.native="searchQuery">
          <a-row :gutter="24">
            <a-col :md="4" :sm="4" :xs="4">
            <a-col :md="5" :sm="5" :xs="5">
              <a-form-item label="设备类型">
                <a-select
                  :value="queryParams.equipmentType"
                  mode="multiple"
                  placeholder="请选择设备类型"
                  allow-clear
                  :maxTagCount="1"
                  @change="selectChange($event,'equipmentType')"
                >
                  <a-select-option v-for="(item,index) in equipmentTypeList" :value="item.value" :key="index">
                    {{item.label}}
                  </a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :md="6" :sm="6" :xs="6">
              <a-form-item label="驱动类型">
                <a-auto-complete
                  v-model="queryParam.driveType"
                  :data-source="driveTypeList"
                <a-select
                  :value="queryParams.driveType"
                  mode="multiple"
                  placeholder="请选择驱动类型"
                  :filter-option="filterOption"
                  :allowClear="true"
                />
              </a-form-item>
            </a-col>
            <a-col :md="4" :sm="4" :xs="4">
              <a-form-item label="设备级别">
                <j-dict-select-tag placeholder="请选择设备级别" dictCode="device_level" v-model="queryParam.deviceLevel"
                                   allow-clear/>
              </a-form-item>
            </a-col>
            <a-col :md="4" :sm="4" :xs="4">
              <a-form-item label="设备种类">
                <j-dict-select-tag placeholder="请选择设备种类" dictCode="device_category" v-model="queryParam.deviceCategory"
                                   allow-clear/>
                  allow-clear
                  :maxTagCount="1"
                  @change="selectChange($event,'driveType')"
                >
                  <a-select-option v-for="(item,index) in driveTypeList" :value="item.value" :key="index">
                    {{item.label}}
                  </a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :md="5" :sm="5" :xs="5">
@@ -40,6 +49,87 @@
                />
              </a-form-item>
            </a-col>
            <a-col :md="5" :sm="5" :xs="5">
              <a-form-item label="设备种类">
                <a-select
                  :value="queryParams.deviceCategory"
                  mode="multiple"
                  placeholder="请选择设备种类"
                  allow-clear
                  :maxTagCount="1"
                  @change="selectChange($event,'deviceCategory')"
                >
                  <a-select-option v-for="(item,index) in device_category_list" :value="item.value" :key="index">
                    {{item.label}}
                  </a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :md="2" :sm="2">
              <a
                @click="toggleSearchStatus=!toggleSearchStatus"
                @selectstart="$event.preventDefault()"
                style="display: inline-block;height: 32px;line-height: 32px"
              >
                {{ toggleSearchStatus ? '收起' : '展开' }}
                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
              </a>
            </a-col>
          </a-row>
          <a-row :gutter="24" v-if="toggleSearchStatus">
            <a-col :md="5" :sm="5" :xs="5">
              <a-form-item label="设备级别">
                <a-select
                  :value="queryParams.deviceLevel"
                  mode="multiple"
                  placeholder="请选择设备级别"
                  allow-clear
                  :maxTagCount="1"
                  @change="selectChange($event,'deviceLevel')"
                >
                  <a-select-option v-for="(item,index) in device_level_list" :value="item.value" :key="index">
                    {{item.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-->
                  <!--:value="queryParams.deviceLevel"-->
                  <!--mode="multiple"-->
                  <!--placeholder="请选择数据分布"-->
                  <!--allow-clear-->
                  <!--:maxTagCount="1"-->
                  <!--@change="selectChange($event,'deviceLevel')"-->
                <!--&gt;-->
                  <!--<a-select-option v-for="(item,index) in device_level_list" :value="item.value" :key="index">-->
                    <!--{{item.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
                  :value="queryParams.deviceImportanceLevel"
                  mode="multiple"
                  placeholder="请选择设备重要程度"
                  allow-clear
                  :maxTagCount="1"
                  @change="selectChange($event,'deviceImportanceLevel')"
                >
                  <a-select-option v-for="(item,index) in device_importance_level_list" :value="item.value"
                                   :key="index">
                    {{item.label}}
                  </a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
          </a-row>
          <a-row :gutter="24" style="margin-bottom: 20px">
            <a-col :md="4" :sm="4" :xs="4">
              <a-space>
                <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
@@ -56,9 +146,14 @@
      </div>
    </div>
    <div id="EfficiencyShift" style="flex:1;overflow: hidden">
      <a-table :columns="columns" rowKey="id" :dataSource="dataSource.records" :loading="tableLoading"
               :pagination="false" :scroll="{x:'max-content',y:scrollY}" bordered></a-table>
    <div id="EfficiencyShift" style="flex:1;overflow: hidden;height: inherit">
      <a-table :columns="columns" rowKey="id" :dataSource="dataSource.records?dataSource.records:[]"
               :loading="tableLoading"
               :pagination="false" :scroll="{x:'max-content',y:scrollY}" bordered>
        <!--<template slot="equipmentModel" slot-scope="text, record">-->
        <!--<editable-cell :text="text" @change="onCellChange(record.id, 'equipmentModel', $event)"/>-->
        <!--</template>-->
      </a-table>
    </div>
    <!--<div class="pagination">-->
    <!--<a-pagination-->
@@ -84,6 +179,8 @@
  import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api'
  import api from '@api/mdc'
  // import EditableCell from './EditableCell.vue'
  export default {
    name: 'OEEAnalysisList',
    components: {},
@@ -94,28 +191,38 @@
          pageSize: 10000,
          pageNo: 1
        },
        queryParams: {
          equipmentType: [],
          driveType: [],
          deviceLevel: [],
          deviceCategory: [],
          deviceImportanceLevel: []
        },
        queryParamEquip: {},
        queryParamPeople: {},
        url: {
          list: '/mdc/mdcOverallEquipmentEfficiency/list',
          initShiftList: '/mdc/mdcMdcShift/initShiftList',
          initShiftSubList: '/mdc/mdcShiftSub/initShiftSubList'
          queryEquipmentType: '/mdc/mdcEquipmentType/queryEquipmentType'
        },
        shiftList: [],
        shiftSubList: [],
        columns: [
          {
            title: '序号',
            dataIndex: '',
            key: 'rowIndex',
            width: 70,
            width: 60,
            align: 'center',
            customRender: function(t, r, index) {
              return parseInt(index) + 1
            }
          },
          {
            title: '设备统一编号',
            title: '车间',
            align: 'center',
            dataIndex: 'productionName',
            width: 110
          },
          {
            title: '设备编号',
            align: 'center',
            dataIndex: 'equipmentId',
            width: 120
@@ -123,14 +230,15 @@
          {
            title: '设备名称',
            align: 'center',
            width: 200,
            width: 120,
            dataIndex: 'equipmentName'
          },
          {
            title: '设备型号',
            align: 'center',
            width: 110,
            dataIndex: 'equipmentModel'
            width: 120,
            dataIndex: 'equipmentModel',
            scopedSlots: { customRender: 'equipmentModel' }
          },
          {
            title: '日期',
@@ -142,32 +250,31 @@
            title: '班次',
            align: 'center',
            width: 100,
            dataIndex: 'shift',
            ellipsis: true
            dataIndex: 'shift'
          },
          {
            title: '每班小时',
            dataIndex: 'shiftTimeCount',
            align: 'center',
            width: 110
            width: 100
          },
          {
            title: '加班时间(分钟)',
            dataIndex: 'overtime',
            align: 'center',
            width: 110
            width: 100
          },
          {
            title: '实际班产天数',
            dataIndex: 'actualWorkDayCount',
            align: 'center',
            width: 120
            width: 100
          },
          {
            title: '月度实际班产总时间(分钟)',
            dataIndex: 'monthActualWorkDayTimeCount',
            align: 'center',
            width: 110
            width: 100
          },
          {
            title: '非计划停机损失(分钟)(一个月)',
@@ -194,7 +301,7 @@
                title: '计划等任务',
                dataIndex: 'plannedTaskDuration',
                align: 'center',
                width: 110
                width: 100
              },
              {
                title: '检验',
@@ -223,45 +330,45 @@
                title: '会议/培训',
                dataIndex: 'conferenceTrainingDuration',
                align: 'center',
                width: 110
                width: 100
              },
              {
                title: '其他休息等',
                dataIndex: 'otherRestDuration',
                align: 'center',
                width: 110
                width: 100
              }]
          },
          {
            title: '负荷时间(小时)',
            dataIndex: 'loadTime',
            align: 'center',
            width: 110
            width: 100
          },
          {
            title: '时间开动率',
            dataIndex: 'timeActuationRate',
            align: 'center',
            width: 110,
            width: 100,
            customRender: text => text != 0 ? parseFloat((text * 100).toFixed(2)) + '%' : 0
          },
          {
            title: '加工零件数(件)',
            dataIndex: 'processQuantity',
            align: 'center',
            width: 120
          },
          {
            title: '标准加工时间(分钟)',
            dataIndex: 'standardProcessDuration',
            align: 'center',
            width: 120
          },
          // {
          //   title: '加工零件数(件)',
          //   dataIndex: 'processQuantity',
          //   align: 'center',
          //   width: 120
          // },
          // {
          //   title: '标准加工时间(分钟)',
          //   dataIndex: 'standardProcessDuration',
          //   align: 'center',
          //   width: 120
          // },
          {
            title: '性能开动率',
            dataIndex: 'performanceRate',
            align: 'center',
            width: 110,
            width: 100,
            customRender: text => text != 0 ? parseFloat((text * 100).toFixed(2)) + '%' : 0
          },
          {
@@ -281,14 +388,18 @@
            title: '设备综合效率',
            dataIndex: 'overallEquipmentEfficiency',
            align: 'center',
            width: 120,
            width: 100,
            customRender: text => text != 0 ? parseFloat((text * 100).toFixed(2)) + '%' : 0
          }
        ],
        dataSource: [],
        driveTypeList: [],
        equipmentTypeList: [],
        device_level_list: [],
        device_category_list: [],
        scrollY: 465,
        tableLoading: false
        tableLoading: false,
        toggleSearchStatus: false
      }
    },
    props: { nodeTree: '', Type: '', nodePeople: '' },
@@ -306,10 +417,14 @@
      this.queryParam.typeTree = '1'
      this.loadData()
      this.getDriveTypeByApi()
      this.queryGroup()
      this.initDictData('device_level')
      this.initDictData('device_category')
      this.initDictData('device_importance_level')
    },
    mounted() {
      window.addEventListener('resize', this.handleWindowResize)
      this.handleWindowResize()
      // this.handleWindowResize()
    },
    beforeDestroy() {
      window.removeEventListener('resize', this.handleWindowResize)
@@ -345,22 +460,31 @@
        }
      }
    },
    filters: {
      numFilter(value) {
        if (value) {
          return parseFloat((value * 100).toFixed(2))
        } else {
          return '0'
        }
      }
    },
    methods: {
      initDictData(dictCode) {
        // //优先从缓存中读取字典配置
        if (getDictItemsFromCache(dictCode)) {
          this[dictCode + '_list'] = getDictItemsFromCache(dictCode)
          return
        }
        //根据字典Code, 初始化字典数组
        ajaxGetDictItems(dictCode, null).then((res) => {
          if (res.success) {
            this[dictCode + '_list'] = res.result
            return
          }
        })
      },
      selectChange(value, key) {
        this.queryParams[key] = value
      },
      dateParamChange(value) {
        console.log('dateParamChangeValue', value)
        this.dates = value
        this.queryParam.startTime = moment(this.dates[0]).format('YYYY-MM')
        this.queryParam.endTime = moment(this.dates[1]).format('YYYY-MM')
      },
      handleDateChange(value) {
        console.log('handleDateChangeValue', value)
        if (!value.length) {
@@ -368,31 +492,6 @@
          delete this.queryParam.endTime
          this.dates = []
        }
      },
      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() {
@@ -415,16 +514,25 @@
          this.queryParam.parentId = this.queryParamPeople.parentId
          this.queryParam.equipmentId = ''
        }
        this.queryParam.pageNo = 1
        Object.keys(this.queryParams).forEach(item => {
          this.queryParam[item] = this.queryParams[item].join()
          // 此处为保证接口参数不多余,可省略
          if (this.queryParams[item].length === 0) delete this.queryParam[item]
        })
        this.loadData()
      },
      searchReset() {
        this.queryParam = {
          pageSize: 10000,
          pageNo: 1
          pageNo: 1,
          typeTree: 1
        }
        this.queryParams = {
          equipmentType: [],
          driveType: [],
          deviceLevel: [],
          deviceCategory: []
        }
        this.dates = []
        this.loadData()
@@ -435,7 +543,25 @@
       */
      getDriveTypeByApi() {
        api.getDriveTypeApi().then((res) => {
          this.driveTypeList = res.result.map(item => item.value)
          if (res.success) this.driveTypeList = res.result
        })
      },
      queryGroup() {
        getAction(this.url.queryEquipmentType).then(res => {
          if (res.success) {
            this.equipmentTypeList = res.result.map(item => {
              return {
                label: item.equipmentTypeName,
                value: item.equipmentTypeName
              }
            })
          } else {
            this.$notification.warning({
              message: '消息',
              description: res.message
            })
          }
        })
      },
@@ -443,13 +569,14 @@
        this.tableLoading = true
        getAction(this.url.list, this.queryParam)
          .then(res => {
            if (res.success) {
            if (res.success && res.result) {
              this.dataSource = res.result
              this.tableLoading = false
            }
          })
          .finally(() => {
            this.tableLoading = false
            this.handleWindowResize()
          })
      },
@@ -472,16 +599,9 @@
        this.queryParam.pageSize = size
        this.loadData()
      },
      /**
       * 联想输入框筛选功能
       * @param input 输入的内容
       * @param option 配置
       * @returns {boolean} 判断是否筛选
       */
      filterOption(input, option) {
        return (
          option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
        )
      onCellChange(key, dataIndex, value) {
        console.log('触发onCellChange', key, dataIndex, value)
      },
      /**
@@ -489,16 +609,31 @@
       */
      handleWindowResize() {
        const devicePixelRatio = window.devicePixelRatio // 浏览器缩放比
        console.log('devicePixelRatio', devicePixelRatio)
        if (devicePixelRatio < 1) return // 缩放比小于1时不进行高度重新设置,因为scrollY变大后表格超出部分会被隐藏导致滚动条不可见
        const clientHeight = document.body.clientHeight // 浏览器可视区域高度
        const clientHeight = document.body.clientHeight || document.documentElement.clientHeight// 浏览器可视区域高度
        console.log('clientHeight', clientHeight)
        const containerTopToClientTopHeight = document.getElementById('EfficiencyShift').getBoundingClientRect().top // 表格容器顶部到浏览器可视区域顶部的间距
        const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0, -2) // 表格表头高度
        this.scrollY = clientHeight - containerTopToClientTopHeight - tableHeadHeight  // 表格垂直滚动条高度
        console.log('containerTopToClientTopHeight', containerTopToClientTopHeight)
        // const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0, -2) // 表格表头高度
        const tableHeadHeight = document.querySelector('.ant-table-thead th').offsetHeight // 表格表头高度
        console.log('tableHeadHeight', tableHeadHeight)
        // this.scrollY = clientHeight - containerTopToClientTopHeight - tableHeadHeight
        const tableSuitableScrollY = clientHeight - containerTopToClientTopHeight - tableHeadHeight // 表格垂直滚动条合适高度(表格水平滚动条刚好在可视区域最下方)
        // const tableSuitableScrollY = 600
        console.log('tableSuitableScrollY', tableSuitableScrollY)
        const tableContainerHeight = document.getElementById('EfficiencyShift').offsetHeight
        console.log('tableContainerHeight', tableContainerHeight)
        const tableMaxScrollY = tableContainerHeight - tableHeadHeight // 表格垂直滚动条最大高度(若超出则水平滚动条被遮挡)
        console.log('tableMaxScrollY', tableMaxScrollY)
        if (tableSuitableScrollY && tableSuitableScrollY < tableMaxScrollY) this.scrollY = tableSuitableScrollY
        else this.scrollY = tableMaxScrollY
        console.log('scrollY', this.scrollY)
      }
    }
  }
</script>
<style scoped>
<style scoped lang="less">
  .pagination {
    display: flex;
    justify-content: end;
@@ -541,4 +676,10 @@
    }
  }
  /deep/ .ant-table-body {
    &::-webkit-scrollbar {
      height: 12px;
    }
  }
</style>