zhuzhuanzhuan
2023-11-14 302eb7f456f90b2b2b3fa9e2489f7619563fc10b
新增设备综合效率分析页面
已添加2个文件
701 ■■■■■ 文件已修改
src/views/mdc/base/OEEAnalysis.vue 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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: 'shiftSubId'
          },
          {
            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>