From 302eb7f456f90b2b2b3fa9e2489f7619563fc10b Mon Sep 17 00:00:00 2001 From: zhuzhuanzhuan Date: 星期二, 14 十一月 2023 16:03:03 +0800 Subject: [PATCH] 新增设备综合效率分析页面 --- src/views/mdc/base/modules/OEEAnalysis/OEEAnalysisList.vue | 562 ++++++++++++++++++++++++++++++++++++++++++++++ src/views/mdc/base/OEEAnalysis.vue | 139 +++++++++++ 2 files changed, 701 insertions(+), 0 deletions(-) diff --git a/src/views/mdc/base/OEEAnalysis.vue b/src/views/mdc/base/OEEAnalysis.vue new file mode 100644 index 0000000..d75d4e4 --- /dev/null +++ b/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> \ 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 new file mode 100644 index 0000000..d922463 --- /dev/null +++ b/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> \ No newline at end of file -- Gitblit v1.9.3