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>宸查�夋嫨 <a style="font-weight: 600">{{ + selectedRowKeys.length }}</a>椤� + <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>宸查�夋嫨 <a style="font-weight: 600">{{ + selectedRowKeys.length }}</a>椤� + <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