From 577f56ea7c23952ab132c7473d174fb4598791b5 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期四, 23 一月 2025 10:06:19 +0800
Subject: [PATCH] 新增设备故障停机时长和设备维修时长页面及完成相关功能

---
 src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeModal.vue        |   64 ++
 src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeForm.vue                     |  153 ++++++
 src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeForm.vue         |  153 ++++++
 src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue                                     |    4 
 src/api/mdc.js                                                                                 |    6 
 src/views/mdc/base/modules/EquipmentFailureCloseTime/ComputeEquipmentFailureCloseTimeModal.vue |   77 +++
 src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeList.vue         |  279 ++++++++++++
 src/views/mdc/base/EquipmentRepairTime.vue                                                     |   82 +++
 src/views/mdc/base/modules/EquipmentRepairTime/ComputeEquipmentRepairTimeModal.vue             |   77 +++
 src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeList.vue                     |  279 ++++++++++++
 src/views/mdc/base/EquipmentFailureCloseTime.vue                                               |   82 +++
 src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeModal.vue                    |   64 ++
 12 files changed, 1,316 insertions(+), 4 deletions(-)

diff --git a/src/api/mdc.js b/src/api/mdc.js
index 587c235..4518a4e 100644
--- a/src/api/mdc.js
+++ b/src/api/mdc.js
@@ -43,5 +43,9 @@
   deleteBatchParamThresholdApi: ids => deleteAction('/mdc/mdcEquipmentThreshold/deleteBatch', { ids }),
   // -------------------------------------OEE椤甸潰--------------------------------------------
   // 璁$畻OEE
-  computeOeeApi: params => postAction('/mdc/mdcOeeInfo/computeOee', params)
+  computeOeeApi: params => postAction('/mdc/mdcOeeInfo/computeOee', params),
+  // 璁$畻MTBF
+  computeMTBFApi: params => postAction('/mdc/mdcDownTime/computeMtbf', params),
+  // 璁$畻MTTR
+  computeMTTRApi: params => postAction('/mdc/mdcRepairInfo/computeMttr', params)
 }
\ No newline at end of file
diff --git a/src/views/mdc/base/EquipmentFailureCloseTime.vue b/src/views/mdc/base/EquipmentFailureCloseTime.vue
new file mode 100644
index 0000000..388a97f
--- /dev/null
+++ b/src/views/mdc/base/EquipmentFailureCloseTime.vue
@@ -0,0 +1,82 @@
+<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">
+          <EquipmentFailureCloseTimeList :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/>
+        </a-col>
+      </a-row>
+    </a-card>
+  </div>
+
+</template>
+
+<script>
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import BaseTree from '../common/BaseTree'
+  import EquipmentFailureCloseTimeList from './modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeList'
+  import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
+  import { mapActions } from 'vuex'
+
+  export default {
+    name: 'EquipmentFailureCloseTime',
+    components: {
+      BaseTree,
+      DepartTree,
+      EquipmentFailureCloseTimeList
+    },
+    data() {
+      return {
+        activeKey: '1',
+        selectEquipmentId: '',
+        selectEquipment: {},
+        selectPeople: {},
+        selectTypeTree: '',
+        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) {
+        this.activeKey = val
+        this.selectTypeTree = val
+      },
+      changeSelectionNode(val) {
+        this.selectEquipment = val
+        this.selectTypeTree = '1'
+      },
+      changeSelectionNodedd(val) {
+        this.selectPeople = val
+        this.selectTypeTree = '2'
+      }
+    }
+
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/EquipmentRepairTime.vue b/src/views/mdc/base/EquipmentRepairTime.vue
new file mode 100644
index 0000000..3018edc
--- /dev/null
+++ b/src/views/mdc/base/EquipmentRepairTime.vue
@@ -0,0 +1,82 @@
+<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">
+          <EquipmentRepairTimeList :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/>
+        </a-col>
+      </a-row>
+    </a-card>
+  </div>
+
+</template>
+
+<script>
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import BaseTree from '../common/BaseTree'
+  import EquipmentRepairTimeList from './modules/EquipmentRepairTime/EquipmentRepairTimeList'
+  import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
+  import { mapActions } from 'vuex'
+
+  export default {
+    name: 'EquipmentRepairTime',
+    components: {
+      BaseTree,
+      DepartTree,
+      EquipmentRepairTimeList
+    },
+    data() {
+      return {
+        activeKey: '1',
+        selectEquipmentId: '',
+        selectEquipment: {},
+        selectPeople: {},
+        selectTypeTree: '',
+        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) {
+        this.activeKey = val
+        this.selectTypeTree = val
+      },
+      changeSelectionNode(val) {
+        this.selectEquipment = val
+        this.selectTypeTree = '1'
+      },
+      changeSelectionNodedd(val) {
+        this.selectPeople = val
+        this.selectTypeTree = '2'
+      }
+    }
+
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentFailureCloseTime/ComputeEquipmentFailureCloseTimeModal.vue b/src/views/mdc/base/modules/EquipmentFailureCloseTime/ComputeEquipmentFailureCloseTimeModal.vue
new file mode 100644
index 0000000..9a9a25a
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentFailureCloseTime/ComputeEquipmentFailureCloseTimeModal.vue
@@ -0,0 +1,77 @@
+<template>
+  <a-modal title="璁$畻MTBF" :visible="visible" :width="400" @cancel="handleModalClose" @ok="handleComputeMTBF"
+           :maskClosable="false">
+    <a-form-model :model="model" :labelCol="labelColLong" :wrapperCol="wrapperColLong" :rules="validateRules">
+      <a-row>
+        <a-col :span="24">
+          <a-form-model-item label="鏈堜唤" prop="month">
+            <a-month-picker v-model="model.month" style="width: 100%" value-format="YYYY-MM"
+                            placeholder="璇烽�夋嫨鏈堜唤"></a-month-picker>
+          </a-form-model-item>
+        </a-col>
+      </a-row>
+    </a-form-model>
+  </a-modal>
+</template>
+
+<script>
+  import mdcApi from '@/api/mdc'
+
+  export default {
+    name: 'ComputeEquipmentFailureCloseTimeModal',
+    components: {},
+    data() {
+      return {
+        visible: false,
+        model: {},
+        validateRules: {
+          month: [
+            { required: true, message: '璇烽�夋嫨鏈堜唤!' }
+          ]
+        },
+        labelColLong: {
+          xs: { span: 24 },
+          sm: { span: 4 }
+        },
+        wrapperColLong: {
+          xs: { span: 24 },
+          sm: { span: 20 }
+        }
+      }
+    },
+    methods: {
+      handleComputeMTBF() {
+        mdcApi.computeMTBFApi(this.model)
+          .then(res => {
+            if (res.success) {
+              this.$notification.success({
+                message: '娑堟伅',
+                description: res.message
+              })
+              this.handleModalClose()
+            } else {
+              this.$notification.error({
+                message: '娑堟伅',
+                description: '璁$畻澶辫触'
+              })
+            }
+          })
+          .catch(err => {
+            this.$notification.error({
+              message: '娑堟伅',
+              description: '璁$畻澶辫触'
+            })
+          })
+      },
+
+      handleModalClose() {
+        this.visible = false
+        this.model = {}
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeForm.vue b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeForm.vue
new file mode 100644
index 0000000..a110828
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeForm.vue
@@ -0,0 +1,153 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail" :labelCol="labelCol"
+                    :wrapperCol="wrapperCol">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="璁惧缁�" prop="equipmentIds">
+              <a-input-search :readOnly="true" v-model="model.equipmentIds"
+                              @search="deviceSearch" :disabled="disableSelectDevice" enter-button
+                              placeholder="璇烽�夋嫨璁惧"></a-input-search>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鏃ユ湡" prop="theDate">
+              <a-date-picker v-model="model.theDate" :disabled="disabled" format="YYYY-MM-DD"
+                             value-format="YYYY-MM-DD" style="width: 100%"></a-date-picker>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鏁呴殰鍋滄満鏃堕暱(min)" prop="downLong">
+              <a-input-number :min="0" v-model="model.downLong" placeholder="璇疯緭鍏ユ晠闅滃仠鏈烘椂闀�(min)"></a-input-number>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+
+    <select-device-drawer ref="selectDeviceDrawer" @selectFinished="selectOK" :title="'閫夋嫨璁惧'"/>
+  </a-spin>
+</template>
+
+<script>
+  import { httpAction, getAction } from '@/api/manage'
+  import SelectDeviceDrawer from '@/views/system/modules/SelectDeviceDrawer'
+
+  export default {
+    name: 'EquipmentFailureCloseTimeForm',
+    components: { SelectDeviceDrawer },
+    props: {
+      //琛ㄥ崟绂佺敤
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      },
+      disableSelectDevice: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data() {
+      return {
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 }
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 }
+        },
+        confirmLoading: false,
+        validatorRules: {
+          equipmentIds: [
+            { required: true, message: '璇烽�夋嫨璁惧!', trigger: 'blur' }
+          ],
+          theDate: [
+            { required: true, message: '璇烽�夋嫨鏃ユ湡!' }
+          ],
+          downLong: [
+            { required: true, message: '璇疯緭鍏ユ晠闅滃仠鏈烘椂闀�!' }
+          ]
+        },
+        url: {
+          add: '/mdc/mdcDownTime/add',
+          edit: '/mdc/mdcDownTime/edit'
+        }
+      }
+    },
+    computed: {
+      formDisabled() {
+        return this.disabled
+      }
+    },
+    created() {
+      //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model))
+    },
+    methods: {
+      add() {
+        this.edit(this.modelDefault)
+      },
+      edit(record) {
+        this.model = Object.assign({}, { equipmentIds: record.equipmentId }, record)
+        console.log('model', this.model)
+        this.visible = true
+      },
+      submitForm() {
+        const that = this
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true
+            let httpUrl = ''
+            let method = 'post'
+            if (!this.model.id) {
+              httpUrl += this.url.add
+            } else {
+              httpUrl += this.url.edit
+            }
+            httpAction(httpUrl, this.model, method).then((res) => {
+              if (res.success) {
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+                that.$emit('ok')
+              } else {
+                that.$notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              }
+            }).finally(() => {
+              that.confirmLoading = false
+            })
+          }
+
+        })
+      },
+      deviceSearch() {
+        this.$refs.selectDeviceDrawer.visible = true
+        this.$refs.selectDeviceDrawer.selectedRowKeys = []
+        this.$refs.selectDeviceDrawer.selectedRows = []
+        this.$refs.selectDeviceDrawer.checkedKeys = this.model.equipmentIds ? this.model.equipmentIds.split(',') : []
+      },
+      /**
+       * 閫夋嫨宸叉湁璁惧鍚庣偣鍑荤‘瀹氭椂瑙﹀彂
+       * @param data 宸查�夋嫨鐨勮澶�
+       */
+      selectOK(data) {
+        this.$set(this.model, 'equipmentIds', data.join(','))
+        if (this.model.equipmentIds) this.$refs.form.clearValidate('equipmentIds')
+      }
+    }
+  }
+</script>
+<style scoped lang="less">
+  /deep/ .ant-input-number {
+    width: 100% !important;
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeList.vue b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeList.vue
new file mode 100644
index 0000000..a2601f7
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeList.vue
@@ -0,0 +1,279 @@
+<template>
+  <div class="device_list">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="璁惧缂栧彿">
+              <a-input placeholder="璇疯緭鍏ヨ澶囩紪鍙�" v-model="queryParam.equipmentId"/>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鏃ユ湡">
+              <a-range-picker v-model="dates" style="width: 100%" @change="dateParamChange"></a-range-picker>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('璁惧鏁呴殰鍋滄満鏃堕暱')">瀵煎嚭</a-button>
+      <a-button type="primary" icon="edit" @click="handleComputeModalOpen">璁$畻</a-button>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay" @click="handleMenuClick">
+          <a-menu-item key="1">
+            <a-icon type="delete" @click="batchDel"/>
+            鍒犻櫎
+          </a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px">
+          鎵归噺鎿嶄綔
+          <a-icon type="down"/>
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+      <i class="anticon anticon-info-circle ant-alert-icon"></i>宸查�夋嫨&nbsp;<a style="font-weight: 600">{{
+      selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
+      <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div id="DeviceList" style="flex: 1;overflow: hidden">
+      <a-table
+        ref="table"
+        :scroll="{x:'max-content',y:scrollY}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}">
+        <template slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical"/>
+
+          <a-popconfirm
+            title="纭畾鍒犻櫎鍚�?"
+            @confirm="() => handleDelete(record.id)"
+          >
+            <a>鍒犻櫎</a>
+          </a-popconfirm>
+        </template>
+      </a-table>
+    </div>
+
+    <ComputeEquipmentFailureCloseTimeModal ref="computeEquipmentFailureCloseTimeModalRef"/>
+    <EquipmentFailureCloseTimeModal ref="modalForm" @ok="modalFormOk"/>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ComputeEquipmentFailureCloseTimeModal from './ComputeEquipmentFailureCloseTimeModal.vue'
+  import EquipmentFailureCloseTimeModal from './EquipmentFailureCloseTimeModal'
+
+  export default {
+    name: 'EquipmentFailureCloseTimeList',
+    mixins: [JeecgListMixin],
+    components: { EquipmentFailureCloseTimeModal, ComputeEquipmentFailureCloseTimeModal },
+    props: { nodeTree: '', Type: '', nodePeople: '' },
+    data() {
+      return {
+        disableMixinCreated: true,
+        /* 鍒嗛〉鍙傛暟 */
+        ipagination: {
+          current: 1,
+          pageSize: 30,
+          pageSizeOptions: ['30', '50', '100'],
+          showTotal: (total, range) => {
+            return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        dates: [moment(), moment()],
+        queryParam: {},
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
+          },
+          {
+            title: '璁惧缂栧彿',
+            align: 'center',
+            dataIndex: 'equipmentId',
+            width: 440
+          },
+          {
+            title: '鏃ユ湡',
+            align: 'center',
+            dataIndex: 'theDate',
+            width: 440
+          },
+          {
+            title: '鏁呴殰鍋滄満鏃堕暱(min)',
+            align: 'center',
+            dataIndex: 'downLong',
+            width: 300
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align: 'center',
+            width: 150,
+            fixed: 'right',
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        scrollY: 465,
+        url: {
+          list: '/mdc/mdcDownTime/list',
+          delete: '/mdc/mdcDownTime/delete',
+          deleteBatch: '/mdc/mdcDownTime/deleteBatch',
+          exportXlsUrl: '/mdc/mdcDownTime/exportXls'
+        }
+      }
+    },
+    watch: {
+      Type(valmath) {
+        this.dataList = []
+        this.queryParam.typeTree = valmath
+        // console.log(this.queryParam.typeTree)
+      },
+      nodeTree(val) { //鐩戝惉currSelected 鍙樺寲锛屽皢鍙樺寲鍚庣殑鏁板�间紶閫掔粰 getCurrSelected 浜嬩欢
+        if (JSON.stringify(val) != '{}') {
+          if (val.equipmentId) {
+            this.queryParam.parentId = ''
+            this.queryParam.equipmentId = val.equipmentId
+          } else {
+            this.queryParam.parentId = val.key
+            this.queryParam.equipmentId = ''
+          }
+          this.searchQuery()
+        }
+      },
+      nodePeople(val) {
+        if (JSON.stringify(val) != '{}') {
+          if (val.equipmentId) {
+            this.queryParam.parentId = ''
+            this.queryParam.equipmentId = val.equipmentId
+          } else {
+            this.queryParam.parentId = val.key
+            this.queryParam.equipmentId = ''
+          }
+          this.searchQuery()
+        }
+      }
+    },
+    methods: {
+      handleComputeModalOpen() {
+        this.$refs.computeEquipmentFailureCloseTimeModalRef.visible = true
+      },
+
+      dateParamChange(v1, v2) {
+        this.queryParam.startTime = v2[0]
+        this.queryParam.endTime = v2[1]
+        this.dates = [v1[0], v1[1]]
+      },
+
+      searchReset() {
+        this.dates = [moment(), moment()]
+        this.queryParam = {
+          startTime: this.dates[0].format('YYYY-MM-DD'),
+          endTime: this.dates[1].format('YYYY-MM-DD')
+        }
+        this.loadData(1)
+      },
+
+      handleMenuClick(e) {
+        if (e.key == 1) {
+          this.batchDel()
+        }
+      },
+
+      /**
+       * 褰撴祻瑙堝櫒鍙绐楀彛灏哄鍙戠敓鏀瑰彉鏃惰Е鍙�
+       */
+      handleWindowResize() {
+        const boxHeight = +window.getComputedStyle(document.getElementById('DeviceList')).height.slice(0, -2)
+        const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0, -2)
+        this.scrollY = boxHeight - tableHeadHeight - 50
+      }
+    },
+    created() {
+      this.queryParam.startTime = this.dates[0].format('YYYY-MM-DD')
+      this.queryParam.endTime = this.dates[1].format('YYYY-MM-DD')
+      this.loadData()
+    },
+    mounted() {
+      window.addEventListener('resize', this.handleWindowResize)
+      this.handleWindowResize()
+    },
+    beforeDestroy() {
+      window.removeEventListener('resize', this.handleWindowResize)
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+
+  .device_list {
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+
+  @media screen and (min-width: 1920px) {
+    .device_list {
+      height: 811px !important;
+    }
+  }
+
+  @media screen and (min-width: 1680px) and (max-width: 1920px) {
+    .device_list {
+      height: 811px !important;
+    }
+  }
+
+  @media screen and (min-width: 1400px) and (max-width: 1680px) {
+    .device_list {
+      height: 663px !important;
+    }
+  }
+
+  @media screen and (min-width: 1280px) and (max-width: 1400px) {
+    .device_list {
+      height: 564px !important;
+    }
+  }
+
+  @media screen and (max-width: 1280px) {
+    .device_list {
+      height: 564px !important;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeModal.vue b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeModal.vue
new file mode 100644
index 0000000..8bf6b3b
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentFailureCloseTime/EquipmentFailureCloseTimeModal.vue
@@ -0,0 +1,64 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <EquipmentFailureCloseTimeForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit"
+                      :disableSelectDevice="disableSelectDevice"/>
+  </j-modal>
+</template>
+
+<script>
+  import EquipmentFailureCloseTimeForm from './EquipmentFailureCloseTimeForm'
+
+  export default {
+    name: 'EquipmentFailureCloseTimeModal',
+    components: {
+      EquipmentFailureCloseTimeForm
+    },
+    data() {
+      return {
+        title: '',
+        width: 800,
+        visible: false,
+        disableSubmit: false,
+        disableSelectDevice: false
+      }
+    },
+    methods: {
+      add() {
+        this.visible = true
+        this.disableSelectDevice = false
+        this.$nextTick(() => {
+          this.$refs.realForm.add()
+        })
+      },
+      edit(record) {
+        this.visible = true
+        this.disableSelectDevice = true
+        this.$nextTick(() => {
+          this.$refs.realForm.edit(record)
+        })
+      },
+      close() {
+        this.$emit('close')
+        this.visible = false
+      },
+      handleOk() {
+        this.$refs.realForm.submitForm()
+      },
+      submitCallback() {
+        this.$emit('ok')
+        this.visible = false
+      },
+      handleCancel() {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentRepairTime/ComputeEquipmentRepairTimeModal.vue b/src/views/mdc/base/modules/EquipmentRepairTime/ComputeEquipmentRepairTimeModal.vue
new file mode 100644
index 0000000..53f0f11
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentRepairTime/ComputeEquipmentRepairTimeModal.vue
@@ -0,0 +1,77 @@
+<template>
+  <a-modal title="璁$畻MTTR" :visible="visible" :width="400" @cancel="handleModalClose" @ok="handleComputeMTTR"
+           :maskClosable="false">
+    <a-form-model :model="model" :labelCol="labelColLong" :wrapperCol="wrapperColLong" :rules="validateRules">
+      <a-row>
+        <a-col :span="24">
+          <a-form-model-item label="鏈堜唤" prop="month">
+            <a-month-picker v-model="model.month" style="width: 100%" value-format="YYYY-MM"
+                            placeholder="璇烽�夋嫨鏈堜唤"></a-month-picker>
+          </a-form-model-item>
+        </a-col>
+      </a-row>
+    </a-form-model>
+  </a-modal>
+</template>
+
+<script>
+  import mdcApi from '@/api/mdc'
+
+  export default {
+    name: 'ComputeEquipmentRepairTimeModal',
+    components: {},
+    data() {
+      return {
+        visible: false,
+        model: {},
+        validateRules: {
+          month: [
+            { required: true, message: '璇烽�夋嫨鏈堜唤!' }
+          ]
+        },
+        labelColLong: {
+          xs: { span: 24 },
+          sm: { span: 4 }
+        },
+        wrapperColLong: {
+          xs: { span: 24 },
+          sm: { span: 20 }
+        }
+      }
+    },
+    methods: {
+      handleComputeMTTR() {
+        mdcApi.computeMTTRApi(this.model)
+          .then(res => {
+            if (res.success) {
+              this.$notification.success({
+                message: '娑堟伅',
+                description: res.message
+              })
+              this.handleModalClose()
+            } else {
+              this.$notification.error({
+                message: '娑堟伅',
+                description: '璁$畻澶辫触'
+              })
+            }
+          })
+          .catch(err => {
+            this.$notification.error({
+              message: '娑堟伅',
+              description: '璁$畻澶辫触'
+            })
+          })
+      },
+
+      handleModalClose() {
+        this.visible = false
+        this.model = {}
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeForm.vue b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeForm.vue
new file mode 100644
index 0000000..9267fc8
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeForm.vue
@@ -0,0 +1,153 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail" :labelCol="labelCol"
+                    :wrapperCol="wrapperCol">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="璁惧缁�" prop="equipmentIds">
+              <a-input-search :readOnly="true" v-model="model.equipmentIds"
+                              @search="deviceSearch" :disabled="disableSelectDevice" enter-button
+                              placeholder="璇烽�夋嫨璁惧"></a-input-search>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="鏃ユ湡" prop="theDate">
+              <a-date-picker v-model="model.theDate" :disabled="disabled" format="YYYY-MM-DD"
+                             value-format="YYYY-MM-DD" style="width: 100%"></a-date-picker>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="缁翠慨鏃堕暱(min)" prop="repairLong">
+              <a-input-number :min="0" v-model="model.repairLong" placeholder="璇疯緭鍏ョ淮淇椂闀�(min)"></a-input-number>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+
+    <select-device-drawer ref="selectDeviceDrawer" @selectFinished="selectOK" :title="'閫夋嫨璁惧'"/>
+  </a-spin>
+</template>
+
+<script>
+  import { httpAction, getAction } from '@/api/manage'
+  import SelectDeviceDrawer from '@/views/system/modules/SelectDeviceDrawer'
+
+  export default {
+    name: 'EquipmentRepairTimeForm',
+    components: { SelectDeviceDrawer },
+    props: {
+      //琛ㄥ崟绂佺敤
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      },
+      disableSelectDevice: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data() {
+      return {
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 }
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 }
+        },
+        confirmLoading: false,
+        validatorRules: {
+          equipmentIds: [
+            { required: true, message: '璇烽�夋嫨璁惧!', trigger: 'blur' }
+          ],
+          theDate: [
+            { required: true, message: '璇烽�夋嫨鏃ユ湡!' }
+          ],
+          repairLong: [
+            { required: true, message: '璇疯緭鍏ョ淮淇椂闀�!' }
+          ]
+        },
+        url: {
+          add: '/mdc/mdcRepairInfo/add',
+          edit: '/mdc/mdcRepairInfo/edit'
+        }
+      }
+    },
+    computed: {
+      formDisabled() {
+        return this.disabled
+      }
+    },
+    created() {
+      //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model))
+    },
+    methods: {
+      add() {
+        this.edit(this.modelDefault)
+      },
+      edit(record) {
+        this.model = Object.assign({}, { equipmentIds: record.equipmentId }, record)
+        console.log('model', this.model)
+        this.visible = true
+      },
+      submitForm() {
+        const that = this
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true
+            let httpUrl = ''
+            let method = 'post'
+            if (!this.model.id) {
+              httpUrl += this.url.add
+            } else {
+              httpUrl += this.url.edit
+            }
+            httpAction(httpUrl, this.model, method).then((res) => {
+              if (res.success) {
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+                that.$emit('ok')
+              } else {
+                that.$notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              }
+            }).finally(() => {
+              that.confirmLoading = false
+            })
+          }
+
+        })
+      },
+      deviceSearch() {
+        this.$refs.selectDeviceDrawer.visible = true
+        this.$refs.selectDeviceDrawer.selectedRowKeys = []
+        this.$refs.selectDeviceDrawer.selectedRows = []
+        this.$refs.selectDeviceDrawer.checkedKeys = this.model.equipmentIds ? this.model.equipmentIds.split(',') : []
+      },
+      /**
+       * 閫夋嫨宸叉湁璁惧鍚庣偣鍑荤‘瀹氭椂瑙﹀彂
+       * @param data 宸查�夋嫨鐨勮澶�
+       */
+      selectOK(data) {
+        this.$set(this.model, 'equipmentIds', data.join(','))
+        if (this.model.equipmentIds) this.$refs.form.clearValidate('equipmentIds')
+      }
+    }
+  }
+</script>
+<style scoped lang="less">
+  /deep/ .ant-input-number {
+    width: 100% !important;
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeList.vue b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeList.vue
new file mode 100644
index 0000000..b1f97f1
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeList.vue
@@ -0,0 +1,279 @@
+<template>
+  <div class="device_list">
+    <!-- 鏌ヨ鍖哄煙 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="璁惧缂栧彿">
+              <a-input placeholder="璇疯緭鍏ヨ澶囩紪鍙�" v-model="queryParam.equipmentId"/>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="鏃ユ湡">
+              <a-range-picker v-model="dates" style="width: 100%" @change="dateParamChange"></a-range-picker>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 鏌ヨ鍖哄煙-END -->
+
+    <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">鏂板</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('璁惧缁翠慨鏃堕暱')">瀵煎嚭</a-button>
+      <a-button type="primary" icon="edit" @click="handleComputeModalOpen">璁$畻</a-button>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay" @click="handleMenuClick">
+          <a-menu-item key="1">
+            <a-icon type="delete" @click="batchDel"/>
+            鍒犻櫎
+          </a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px">
+          鎵归噺鎿嶄綔
+          <a-icon type="down"/>
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+      <i class="anticon anticon-info-circle ant-alert-icon"></i>宸查�夋嫨&nbsp;<a style="font-weight: 600">{{
+      selectedRowKeys.length }}</a>椤�&nbsp;&nbsp;
+      <a style="margin-left: 24px" @click="onClearSelected">娓呯┖</a>
+    </div>
+
+    <!-- table鍖哄煙-begin -->
+    <div id="DeviceList" style="flex: 1;overflow: hidden">
+      <a-table
+        ref="table"
+        :scroll="{x:'max-content',y:scrollY}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}">
+        <template slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">缂栬緫</a>
+
+          <a-divider type="vertical"/>
+
+          <a-popconfirm
+            title="纭畾鍒犻櫎鍚�?"
+            @confirm="() => handleDelete(record.id)"
+          >
+            <a>鍒犻櫎</a>
+          </a-popconfirm>
+        </template>
+      </a-table>
+    </div>
+
+    <ComputeEquipmentRepairTimeModal ref="computeEquipmentFailureCloseTimeModalRef"/>
+    <EquipmentRepairTimeModal ref="modalForm" @ok="modalFormOk"/>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ComputeEquipmentRepairTimeModal from './ComputeEquipmentRepairTimeModal.vue'
+  import EquipmentRepairTimeModal from './EquipmentRepairTimeModal'
+
+  export default {
+    name: 'EquipmentRepairTimeList',
+    mixins: [JeecgListMixin],
+    components: { EquipmentRepairTimeModal, ComputeEquipmentRepairTimeModal },
+    props: { nodeTree: '', Type: '', nodePeople: '' },
+    data() {
+      return {
+        disableMixinCreated: true,
+        /* 鍒嗛〉鍙傛暟 */
+        ipagination: {
+          current: 1,
+          pageSize: 30,
+          pageSizeOptions: ['30', '50', '100'],
+          showTotal: (total, range) => {
+            return range[0] + '-' + range[1] + ' 鍏�' + total + '鏉�'
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        dates: [moment(), moment()],
+        queryParam: {},
+        // 琛ㄥご
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: 'center',
+            customRender: function(t, r, index) {
+              return parseInt(index) + 1
+            }
+          },
+          {
+            title: '璁惧缂栧彿',
+            align: 'center',
+            dataIndex: 'equipmentId',
+            width: 440
+          },
+          {
+            title: '鏃ユ湡',
+            align: 'center',
+            dataIndex: 'theDate',
+            width: 440
+          },
+          {
+            title: '缁翠慨鏃堕暱(min)',
+            align: 'center',
+            dataIndex: 'repairLong',
+            width: 300
+          },
+          {
+            title: '鎿嶄綔',
+            dataIndex: 'action',
+            align: 'center',
+            width: 150,
+            fixed: 'right',
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        scrollY: 465,
+        url: {
+          list: '/mdc/mdcRepairInfo/list',
+          delete: '/mdc/mdcRepairInfo/delete',
+          deleteBatch: '/mdc/mdcRepairInfo/deleteBatch',
+          exportXlsUrl: '/mdc/mdcRepairInfo/exportXls'
+        }
+      }
+    },
+    watch: {
+      Type(valmath) {
+        this.dataList = []
+        this.queryParam.typeTree = valmath
+        // console.log(this.queryParam.typeTree)
+      },
+      nodeTree(val) { //鐩戝惉currSelected 鍙樺寲锛屽皢鍙樺寲鍚庣殑鏁板�间紶閫掔粰 getCurrSelected 浜嬩欢
+        if (JSON.stringify(val) != '{}') {
+          if (val.equipmentId) {
+            this.queryParam.parentId = ''
+            this.queryParam.equipmentId = val.equipmentId
+          } else {
+            this.queryParam.parentId = val.key
+            this.queryParam.equipmentId = ''
+          }
+          this.searchQuery()
+        }
+      },
+      nodePeople(val) {
+        if (JSON.stringify(val) != '{}') {
+          if (val.equipmentId) {
+            this.queryParam.parentId = ''
+            this.queryParam.equipmentId = val.equipmentId
+          } else {
+            this.queryParam.parentId = val.key
+            this.queryParam.equipmentId = ''
+          }
+          this.searchQuery()
+        }
+      }
+    },
+    methods: {
+      handleComputeModalOpen() {
+        this.$refs.computeEquipmentFailureCloseTimeModalRef.visible = true
+      },
+
+      dateParamChange(v1, v2) {
+        this.queryParam.startTime = v2[0]
+        this.queryParam.endTime = v2[1]
+        this.dates = [v1[0], v1[1]]
+      },
+
+      searchReset() {
+        this.dates = [moment(), moment()]
+        this.queryParam = {
+          startTime: this.dates[0].format('YYYY-MM-DD'),
+          endTime: this.dates[1].format('YYYY-MM-DD')
+        }
+        this.loadData(1)
+      },
+
+      handleMenuClick(e) {
+        if (e.key == 1) {
+          this.batchDel()
+        }
+      },
+
+      /**
+       * 褰撴祻瑙堝櫒鍙绐楀彛灏哄鍙戠敓鏀瑰彉鏃惰Е鍙�
+       */
+      handleWindowResize() {
+        const boxHeight = +window.getComputedStyle(document.getElementById('DeviceList')).height.slice(0, -2)
+        const tableHeadHeight = +window.getComputedStyle(document.querySelector('.ant-table-thead th')).height.slice(0, -2)
+        this.scrollY = boxHeight - tableHeadHeight - 50
+      }
+    },
+    created() {
+      this.queryParam.startTime = this.dates[0].format('YYYY-MM-DD')
+      this.queryParam.endTime = this.dates[1].format('YYYY-MM-DD')
+      this.loadData()
+    },
+    mounted() {
+      window.addEventListener('resize', this.handleWindowResize)
+      this.handleWindowResize()
+    },
+    beforeDestroy() {
+      window.removeEventListener('resize', this.handleWindowResize)
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+
+  .device_list {
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+
+  @media screen and (min-width: 1920px) {
+    .device_list {
+      height: 811px !important;
+    }
+  }
+
+  @media screen and (min-width: 1680px) and (max-width: 1920px) {
+    .device_list {
+      height: 811px !important;
+    }
+  }
+
+  @media screen and (min-width: 1400px) and (max-width: 1680px) {
+    .device_list {
+      height: 663px !important;
+    }
+  }
+
+  @media screen and (min-width: 1280px) and (max-width: 1400px) {
+    .device_list {
+      height: 564px !important;
+    }
+  }
+
+  @media screen and (max-width: 1280px) {
+    .device_list {
+      height: 564px !important;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeModal.vue b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeModal.vue
new file mode 100644
index 0000000..0099d0b
--- /dev/null
+++ b/src/views/mdc/base/modules/EquipmentRepairTime/EquipmentRepairTimeModal.vue
@@ -0,0 +1,64 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <EquipmentRepairTimeForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit"
+                      :disableSelectDevice="disableSelectDevice"/>
+  </j-modal>
+</template>
+
+<script>
+  import EquipmentRepairTimeForm from './EquipmentRepairTimeForm'
+
+  export default {
+    name: 'EquipmentRepairTimeModal',
+    components: {
+      EquipmentRepairTimeForm
+    },
+    data() {
+      return {
+        title: '',
+        width: 800,
+        visible: false,
+        disableSubmit: false,
+        disableSelectDevice: false
+      }
+    },
+    methods: {
+      add() {
+        this.visible = true
+        this.disableSelectDevice = false
+        this.$nextTick(() => {
+          this.$refs.realForm.add()
+        })
+      },
+      edit(record) {
+        this.visible = true
+        this.disableSelectDevice = true
+        this.$nextTick(() => {
+          this.$refs.realForm.edit(record)
+        })
+      },
+      close() {
+        this.$emit('close')
+        this.visible = false
+      },
+      handleOk() {
+        this.$refs.realForm.submitForm()
+      },
+      submitCallback() {
+        this.$emit('ok')
+        this.visible = false
+      },
+      handleCancel() {
+        this.close()
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue b/src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
index ebcf65f..b09a6a0 100644
--- a/src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
+++ b/src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue
@@ -222,9 +222,7 @@
     },
     methods: {
       handleComputeModalOpen() {
-        console.log('瑙﹀彂杩涘叆open')
-        const { $refs } = this
-        $refs.computeOeeModalRef.visible = true
+        this.$refs.computeOeeModalRef.visible = true
       },
 
       dateParamChange(v1, v2) {

--
Gitblit v1.9.3