From fe470128a5432662cc3f394280c652c5ab023161 Mon Sep 17 00:00:00 2001 From: zhaowei <zhaowei> Date: 星期三, 28 五月 2025 09:22:59 +0800 Subject: [PATCH] 1、设备TEEP/设备开动率/班次利用率页面新增异常反馈功能 2、设备TEEP页面实现滚动加载(每次滚动加载15条) 3、异常反馈页面增加手动新增反馈异常功能 4、利用率分段与走势分析页面解决重置按钮后请求日期与显示日期不相等问题 --- src/views/mdc/base/modules/openRateTrendAnalysis/openRateTrendAnalysisMain.vue | 9 src/views/mdc/base/modules/efficiencyPOReport/EfficiencyPOList.vue | 26 + src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue | 4 src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue | 625 +++++++++++++++++++++++++++------------------------ src/views/mdc/base/modules/efficiencyShiftReport/EfficiencyShiftList.vue | 34 +- src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue | 9 6 files changed, 391 insertions(+), 316 deletions(-) diff --git a/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue b/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue index b6e0511..8aa81ba 100644 --- a/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue +++ b/src/views/mdc/base/modules/MdcMessageApproval/MdcMessageApprovalModal.vue @@ -63,13 +63,16 @@ type: Boolean }, title: { - type: String + type: String, + default: '鏂板' }, buttonId: { - type: Number + type: Number, + default: null }, disableSubmit: { - type: Boolean + type: Boolean, + default: false } }, data() { diff --git a/src/views/mdc/base/modules/efficiencyPOReport/EfficiencyPOList.vue b/src/views/mdc/base/modules/efficiencyPOReport/EfficiencyPOList.vue index f85f45e..a0e5f85 100644 --- a/src/views/mdc/base/modules/efficiencyPOReport/EfficiencyPOList.vue +++ b/src/views/mdc/base/modules/efficiencyPOReport/EfficiencyPOList.vue @@ -113,12 +113,12 @@ <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-button type="primary" @click="handleShowFeedbackModal" icon="plus" v-has="'EfficiencyPO:feedback'">寮傚父鍙嶉</a-button> <a-button type="primary" icon="printer" v-print="'#EfficiencyPO'" v-has="'EfficiencyPO:print'">鎵撳嵃 </a-button> </a-space> - <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" - @change="efficiencyOptionsOnChange"/> + </div> <table cellpadding="5" cellspacing="1" style="border: 1px solid darkgray;"> <tr> @@ -130,6 +130,13 @@ </td> </tr> </table> + </a-col> + </a-row> + + <a-row :gutter="24"> + <a-col> + <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" + @change="efficiencyOptionsOnChange"/> </a-col> </a-row> </a-form> @@ -230,6 +237,8 @@ </div> </a-spin> </div> + + <mdc-message-approval-modal ref="modalForm" :visible="modalVisible" @closeModal="modalVisible = false"/> </div> </template> @@ -240,10 +249,11 @@ import '@/components/table2excel/table2excel' import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api' import api from '@/api/mdc' + import MdcMessageApprovalModal from '../MdcMessageApproval/MdcMessageApprovalModal' export default { name: 'EfficiencyPOList', - components: {}, + components: { MdcMessageApprovalModal }, data() { return { typeTree: '', @@ -280,7 +290,8 @@ }, tableHeads: [], spinning: false, - toggleSearchStatus: false + toggleSearchStatus: false, + modalVisible: false// 寮傚父鍙嶉寮圭獥鏄惁寮瑰嚭 } }, props: { nodeTree: '', Type: '', nodePeople: '' }, @@ -586,6 +597,13 @@ this.spinning = false }) }, + + // 鎺у埗寮傚父鍙嶉寮圭獥寮瑰嚭 + handleShowFeedbackModal() { + this.$refs.modalForm.formParams = {} + this.modalVisible = true + }, + queryGroup() { getAction(this.url.queryEquipmentType).then(res => { if (res.success) { diff --git a/src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue b/src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue index d6a391d..8acbf86 100644 --- a/src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue +++ b/src/views/mdc/base/modules/efficiencyReport/EfficiencyList.vue @@ -1,251 +1,252 @@ <template> <div class="efficiency_list" style="width: 100%"> - <div :bordered="false"> - <!-- 鏌ヨ鍖哄煙 --> - <div> - <div class="table-page-search-wrapper"> - <a-form layout="inline" @keyup.enter.native="searchQuery"> - <a-row :gutter="24"> - <a-col :md="5" :sm="5"> - <a-form-item label="璁惧绫诲瀷"> - <a-select - :value="queryParams.equipmentType" - mode="multiple" - placeholder="璇烽�夋嫨璁惧绫诲瀷" - allow-clear - :maxTagCount="1" - @change="selectChange($event,'equipmentType')" - > - <a-select-option v-for="(item,index) in equipmentTypeList" :value="item.value" :key="index"> - {{item.label}} - </a-select-option> - </a-select> - </a-form-item> - </a-col> - <a-col :md="6" :sm="6"> - <a-form-item label="椹卞姩绫诲瀷"> - <a-select - :value="queryParams.driveType" - mode="multiple" - placeholder="璇烽�夋嫨椹卞姩绫诲瀷" - allow-clear - :maxTagCount="1" - @change="selectChange($event,'driveType')" - > - <a-select-option v-for="(item,index) in driveTypeList" :value="item.value" :key="index"> - {{item.label}} - </a-select-option> - </a-select> - </a-form-item> - </a-col> - <a-col :md="6" :sm="6"> - <a-form-item label="鏃堕棿"> - <a-range-picker @change="dateParamChange" :disabledDate="disabledDate" format="YYYYMMDD" - v-model="dates" :allowClear="false"/> - </a-form-item> - </a-col> - <a-col :md="5" :sm="5" :xs="5"> - <a-form-item label="璁惧绾у埆"> - <a-select - :value="queryParams.deviceLevel" - mode="multiple" - placeholder="璇烽�夋嫨璁惧绾у埆" - allow-clear - :maxTagCount="1" - @change="selectChange($event,'deviceLevel')" - > - <a-select-option v-for="(item,index) in device_level_list" :value="item.value" :key="index"> - {{item.label}} - </a-select-option> - </a-select> - </a-form-item> - </a-col> - <a-col :md="2" :sm="2"> - <a - @click="toggleSearchStatus=!toggleSearchStatus" - @selectstart="$event.preventDefault()" - style="display: inline-block;height: 32px;line-height: 32px" - > - {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }} - <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> - </a> - </a-col> - </a-row> + <!-- 鏌ヨ鍖哄煙 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline" @keyup.enter.native="searchQuery"> + <a-row :gutter="24"> + <a-col :md="5" :sm="5"> + <a-form-item label="璁惧绫诲瀷"> + <a-select + :value="queryParams.equipmentType" + mode="multiple" + placeholder="璇烽�夋嫨璁惧绫诲瀷" + allow-clear + :maxTagCount="1" + @change="selectChange($event,'equipmentType')" + > + <a-select-option v-for="(item,index) in equipmentTypeList" :value="item.value" :key="index"> + {{item.label}} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="6" :sm="6"> + <a-form-item label="椹卞姩绫诲瀷"> + <a-select + :value="queryParams.driveType" + mode="multiple" + placeholder="璇烽�夋嫨椹卞姩绫诲瀷" + allow-clear + :maxTagCount="1" + @change="selectChange($event,'driveType')" + > + <a-select-option v-for="(item,index) in driveTypeList" :value="item.value" :key="index"> + {{item.label}} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="6" :sm="6"> + <a-form-item label="鏃堕棿"> + <a-range-picker @change="dateParamChange" :disabledDate="disabledDate" format="YYYYMMDD" + v-model="dates" :allowClear="false"/> + </a-form-item> + </a-col> + <a-col :md="5" :sm="5" :xs="5"> + <a-form-item label="璁惧绾у埆"> + <a-select + :value="queryParams.deviceLevel" + mode="multiple" + placeholder="璇烽�夋嫨璁惧绾у埆" + allow-clear + :maxTagCount="1" + @change="selectChange($event,'deviceLevel')" + > + <a-select-option v-for="(item,index) in device_level_list" :value="item.value" :key="index"> + {{item.label}} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="2" :sm="2"> + <a + @click="toggleSearchStatus=!toggleSearchStatus" + @selectstart="$event.preventDefault()" + style="display: inline-block;height: 32px;line-height: 32px" + > + {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> + </a-col> + </a-row> - <a-row :gutter="24" v-if="toggleSearchStatus"> - <a-col :md="5" :sm="5" :xs="5"> - <a-form-item label="閲嶈绋嬪害"> - <a-select - v-model="queryParam.deviceImportanceLevel" - placeholder="璇烽�夋嫨璁惧閲嶈绋嬪害" - allow-clear - > - <a-select-option v-for="(item,index) in device_importance_level_list" :value="item.value" - :key="index"> - {{item.label}} - </a-select-option> - </a-select> - </a-form-item> - </a-col> - </a-row> + <a-row :gutter="24" v-if="toggleSearchStatus"> + <a-col :md="5" :sm="5" :xs="5"> + <a-form-item label="閲嶈绋嬪害"> + <a-select + v-model="queryParam.deviceImportanceLevel" + placeholder="璇烽�夋嫨璁惧閲嶈绋嬪害" + allow-clear + > + <a-select-option v-for="(item,index) in device_importance_level_list" :value="item.value" + :key="index"> + {{item.label}} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> - <a-row :gutter="24" type="flex" align="middle"> - <a-col :md="24" :sm="24" :xs="24" - style="display: flex;justify-content: space-between;align-items: flex-start"> - <div> - <a-space style="margin-right: 20px"> - <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-button type="primary" icon="printer" v-print="'#Efficiency'" - v-has="'efficiency:print'">鎵撳嵃 - </a-button> - </a-space> - <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" - @change="efficiencyOptionsOnChange"/> - </div> - <table cellpadding="5" cellspacing="1" style="border: 1px solid darkgray;"> - <tr> - <td v-for="(item, index) in identifying" - style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap">{{item.title}} - </td> - </tr> - <tr> - <td style="text-align:center;" v-for="(item, index) in identifying"> - <div class="identifyingclass" :style="{background: item.color}"></div> - </td> - </tr> - </table> - </a-col> - </a-row> - </a-form> + <a-row :gutter="24" type="flex" align="middle"> + <a-col :md="24" :sm="24" :xs="24" + style="display: flex;justify-content: space-between;align-items: flex-start"> + <div> + <a-space style="margin-right: 20px"> + <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-button type="primary" @click="exportOneYearExcel('璁惧TEEP')" icon="download">澶ф暟鎹鍑�</a-button>--> + <a-button type="primary" @click="handleShowFeedbackModal" icon="plus" v-has="'efficiency:feedback'">寮傚父鍙嶉</a-button> + <a-button type="primary" icon="printer" v-print="'#Efficiency'" + v-has="'efficiency:print'">鎵撳嵃 + </a-button> + </a-space> + + </div> + <table cellpadding="5" cellspacing="1" style="border: 1px solid darkgray;"> + <tr> + <td v-for="(item, index) in identifying" + style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap">{{item.title}} + </td> + </tr> + <tr> + <td style="text-align:center;" v-for="(item, index) in identifying"> + <div class="identifyingclass" :style="{background: item.color}"></div> + </td> + </tr> + </table> + </a-col> + </a-row> + + <a-row :gutter="24"> + <a-col> + <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" + @change="efficiencyOptionsOnChange"/> + </a-col> + </a-row> + </a-form> + </div> + + <a-spin :spinning="spinning"> + <div id="Efficiency" class="container" style="margin-top: 20px;"> + <div class="table2"> + <table class="dataContent table" border="1" cellspacing="0" cellpadding="0" style="white-space: nowrap" + v-if="dataList.length>0"> + <thead> + <tr class="thead fixed equipname"> + <th class="thgu dong1 name" rowspan="2" + style="min-width: 50px; max-width: 50px;width: 50px;height: 66px">鍏徃 + </th> + <th class="thgu dong2 name" rowspan="2" style="min-width: 50px; max-width: 50px;width: 50px;">杞﹂棿</th> + <th class="thgu dong3 name" rowspan="2" style="min-width: 50px; max-width: 50px;width: 50px;">宸ユ</th> + <th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">璁惧缂栧彿 + </th> + <th class="thgu dong5 name" rowspan="2" style="min-width: 162px; max-width: 162px;width: 162px;">璁惧鍚嶇О + </th> + <th class="thgu dong6 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">璁惧绫诲瀷 + </th> + <th class="thgu dong7 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">璁惧鍨嬪彿 + </th> + <!--<th rowspan="2">缁勫埆</th>--> + <template v-for="(tableHead, index) in tableHeads"> + <th class="timeth" :colspan="checkedList.length">{{tableHead}}</th> + </template> + </tr> + <tr class="thead notfixed gudingth"> + <template v-for="(tableHead, index) in tableHeads"> + <th v-if="checkedList.indexOf('lyl') > -1">TEEP(%)</th> + <th v-if="checkedList.indexOf('kjl') > -1">寮�鏈虹巼(%)</th> + <th v-if="checkedList.indexOf('kjsj') > -1">寮�鏈烘椂闂�(灏忔椂)</th> + <th v-if="checkedList.indexOf('jgsj') > -1">鍔犲伐鏃堕棿(灏忔椂)</th> + <th v-if="checkedList.indexOf('djsj') > -1">寰呮満鏃堕棿(灏忔椂)</th> + <th v-if="checkedList.indexOf('gjsj') > -1">鍏虫満鏃堕棿(灏忔椂)</th> + </template> + + </tr> + </thead> + + <tbody> + <tr class="mathData" v-for="(item, index) in dataList"> + <template v-if="item.level1!=='鍚堣'&&item.level1!=='骞冲潎鍊�'"> + <td class="tdgu kaitou" :rowspan="item.level1span" + :class="{hidden: item.level1dis,noExl:item.level1dis}" v-show="!item.level1dis"> + <div class="wenzi"> + {{item.level1}} + </div> + </td> + <td class="tdgu1 kaitou" :rowspan="item.level2span" + :class="{hidden: item.level2dis,noExl:item.level2dis}" v-show="!item.level2dis"> + <div class="wenzi"> + {{item.level2}} + </div> + </td> + <td class="tdgu2 kaitou wenzi" :rowspan="item.level3span" + :class="{hidden: item.level3dis,noExl:item.level3dis}" v-show="!item.level3dis"> + <div class="wenzi"> + {{item.level3}} + </div> + </td> + <td class="tdgu3 kaitou">{{item.equipmentId}}</td> + <td class="tdgu4 kaitou" style="min-width: 162px; max-width: 162px;width: 162px;"> + {{item.equipmentName}} + </td> + <td class="tdgu5 kaitou">{{item.equipmentType}}</td> + <td class="tdgu6 kaitou">{{item.equipmentModel}}</td> + </template> + + <!--鍚堣涓庡钩鍧囧�煎尯鍩�--> + <template v-else> + <td colspan="7" class="tdgu kaitou">{{item.level1}}</td> + </template> + + <template v-for="(tableHead, index) in item.dataList"> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('lyl') > -1"> + {{tableHead.utilizationRate | numFilter}} + </td> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('kjl') > -1"> + {{tableHead.openRate | numFilter}} + </td> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('kjsj') > -1"> + {{tableHead.openLong | getFormattedTime}} + </td> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('jgsj') > -1"> + {{tableHead.processLong | getFormattedTime}} + </td> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('djsj') > -1"> + {{tableHead.waitLong | getFormattedTime}} + </td> + <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('gjsj') > -1"> + {{tableHead.closeLong | getFormattedTime}} + </td> + </template> + </tr> + </tbody> + </table> </div> </div> + </a-spin> - <a-spin :spinning="spinning"> - <div id="Efficiency" class="container" style="margin-top: 20px;"> - <div class="table2"> - <table class="dataContent table" border="1" cellspacing="0" cellpadding="0" style="white-space: nowrap" - v-if="dataList.length>0"> - <thead> - <tr class="thead fixed equipname"> - <th class="thgu dong1 name" rowspan="2" - style="min-width: 50px; max-width: 50px;width: 50px;height: 66px">鍏徃 - </th> - <th class="thgu dong2 name" rowspan="2" style="min-width: 50px; max-width: 50px;width: 50px;">杞﹂棿</th> - <th class="thgu dong3 name" rowspan="2" style="min-width: 50px; max-width: 50px;width: 50px;">宸ユ</th> - <th class="thgu dong4 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">璁惧缂栧彿 - </th> - <th class="thgu dong5 name" rowspan="2" style="min-width: 162px; max-width: 162px;width: 162px;">璁惧鍚嶇О - </th> - <th class="thgu dong6 name" rowspan="2" style="min-width: 100px; max-width: 100px;width: 100px;">璁惧绫诲瀷 - </th> - <th class="thgu dong7 name" rowspan="2" style="min-width: 150px; max-width: 150px;width: 150px;">璁惧鍨嬪彿 - </th> - <!--<th rowspan="2">缁勫埆</th>--> - <template v-for="(tableHead, index) in tableHeads"> - <th class="timeth" :colspan="checkedList.length">{{tableHead}}</th> - </template> - </tr> - <tr class="thead notfixed gudingth"> - <template v-for="(tableHead, index) in tableHeads"> - <th v-if="checkedList.indexOf('lyl') > -1">TEEP(%)</th> - <th v-if="checkedList.indexOf('kjl') > -1">寮�鏈虹巼(%)</th> - <th v-if="checkedList.indexOf('kjsj') > -1">寮�鏈烘椂闂�(灏忔椂)</th> - <th v-if="checkedList.indexOf('jgsj') > -1">鍔犲伐鏃堕棿(灏忔椂)</th> - <th v-if="checkedList.indexOf('djsj') > -1">寰呮満鏃堕棿(灏忔椂)</th> - <th v-if="checkedList.indexOf('gjsj') > -1">鍏虫満鏃堕棿(灏忔椂)</th> - </template> - - </tr> - </thead> - <tbody> - - <tr class="mathData" v-for="(item, index) in dataList"> - <template v-if="item.level1!=='鍚堣'&&item.level1!=='骞冲潎鍊�'"> - <td class="tdgu kaitou" :rowspan="item.level1span" - :class="{hidden: item.level1dis,noExl:item.level1dis}" v-show="!item.level1dis"> - <div class="wenzi"> - {{item.level1}} - </div> - </td> - <td class="tdgu1 kaitou" :rowspan="item.level2span" - :class="{hidden: item.level2dis,noExl:item.level2dis}" v-show="!item.level2dis"> - <div class="wenzi"> - {{item.level2}} - </div> - </td> - <td class="tdgu2 kaitou wenzi" :rowspan="item.level3span" - :class="{hidden: item.level3dis,noExl:item.level3dis}" v-show="!item.level3dis"> - <div class="wenzi"> - {{item.level3}} - </div> - </td> - <td class="tdgu3 kaitou">{{item.equipmentId}}</td> - <td class="tdgu4 kaitou" style="min-width: 162px; max-width: 162px;width: 162px;"> - {{item.equipmentName}} - </td> - <td class="tdgu5 kaitou">{{item.equipmentType}}</td> - <td class="tdgu6 kaitou">{{item.equipmentModel}}</td> - </template> - - <!--鍚堣涓庡钩鍧囧�煎尯鍩�--> - <template v-else> - <td colspan="7" class="tdgu kaitou">{{item.level1}}</td> - </template> - - <template v-for="(tableHead, index) in item.dataList"> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('lyl') > -1"> - {{tableHead.utilizationRate | numFilter}} - </td> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('kjl') > -1"> - {{tableHead.openRate | numFilter}} - </td> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('kjsj') > -1"> - {{tableHead.openLong | getFormattedTime}} - </td> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('jgsj') > -1"> - {{tableHead.processLong | getFormattedTime}} - </td> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('djsj') > -1"> - {{tableHead.waitLong | getFormattedTime}} - </td> - <td :style="{background:tableHead.color }" v-if="checkedList.indexOf('gjsj') > -1"> - {{tableHead.closeLong | getFormattedTime}} - </td> - </template> - - </tr> - - </tbody> - </table> - - </div> - </div> - </a-spin> - </div> + <mdc-message-approval-modal ref="modalForm" :visible="modalVisible" @closeModal="modalVisible = false"/> </div> </template> <script> import moment from 'moment' - import { putAction, getAction } from '@/api/manage' + import { getAction, downFile } from '@/api/manage' import $ from 'jquery' import '@/components/table2excel/table2excel' - import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api' + import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api' import api from '@/api/mdc' + import MdcMessageApprovalModal from '../MdcMessageApproval/MdcMessageApprovalModal' export default { name: 'EfficiencyList', - components: {}, + components: { MdcMessageApprovalModal }, data() { return { typeTree: '', typeParent: 1, typeEquipment: 1, - TreeIDOne: 1, - TreeIDTwo: 2, - deviceTypeDict: '', dates: [], equipmentTypeList: [], driveTypeList: [], @@ -273,10 +274,10 @@ url: { list: '/mdc/efficiencyReport/efficiencyList', listByType: '/mdc/MdcUtilizationRate/getByType', - queryEquipmentType: '/mdc/mdcEquipmentType/queryEquipmentType' + queryEquipmentType: '/mdc/mdcEquipmentType/queryEquipmentType', + exportOneYearXlsUrl: '' }, tableHeads: [], - distinguishColorList: [], utilizationRateRowAverage: '', openRateRowAverage: '', openLongRowAverage: '', @@ -284,17 +285,17 @@ waitLongRowAverage: '', closeLongRowAverage: '', spinning: false, - toggleSearchStatus: false + isLazyRequest: '',// 鏄惁寮�鍚噿鍔犺浇 + requestAllDataSize: 8,// 鎬诲叡璇锋眰鐨勫垪琛ㄩ」鏁扮洰(榛樿鍊间负榛樿鏃ユ湡鐨勫樊鍊�+1) + everyRequestDataSize: 15,// 姣忔璇锋眰鐨勫垪琛ㄩ」鏁扮洰 + toggleSearchStatus: false, + modalVisible: false// 寮傚父鍙嶉寮圭獥鏄惁寮瑰嚭 } }, props: { nodeTree: '', Type: '', nodePeople: '' }, created() { this.showIdentifying() - this.dates = [moment().subtract('days', 8), moment().subtract('days', 1)] - this.queryParam.startTime = moment(this.dates[0]).format('YYYYMMDD') - this.queryParam.endTime = moment(this.dates[1]).format('YYYYMMDD') this.queryParam.typeTree = '1' - this.loadData() this.queryGroup() this.getDriveTypeByApi() this.initDictData('device_level') @@ -302,8 +303,14 @@ this.initDictData('device_importance_level') }, mounted() { + this.tableScroll = document.querySelector('.table2') + this.searchReset() window.addEventListener('resize', this.handleWindowResize) this.handleWindowResize() + }, + beforeDestroy() { + this.tableScroll.removeEventListener('scroll', this.tableScrollX) + window.removeEventListener('resize', this.handleWindowResize) }, watch: { Type(valmath) { @@ -441,7 +448,6 @@ }, // 鍚堝苟 combineCell() { - console.log(this.dataList) let list = this.dataList for (let field in list[0]) { var k = 0 @@ -467,33 +473,6 @@ //Can not slect days before today and today return current && current > moment().subtract('days', 1) }, - initDeviceType(deviceList) { - let dictCode = 'mdc_equipmentType' - let items = [] - items = getDictItemsFromCache(dictCode) - if (deviceList && items.length > 0) { - for (let a = 0; a < deviceList.length; a++) { - if (items && items.length > 0) { - for (let i = 0; i < items.length; i++) { - if (deviceList[a].equipmentType == items[i].value) { - deviceList[a].equipmentType = items[i].title - } - } - } else { - ajaxGetDictItems(dictCode, null).then((res) => { - if (res.success) { - let items = res.result - for (let i = 0; i < items.length; i++) { - if (deviceList[a].equipmentType == items[i].value) { - deviceList[a].equipmentType = items[i].title - } - } - } - }) - } - } - } - }, exportExcel() { $('#Efficiency').table2excel({ exclude: '.noExl', @@ -505,6 +484,33 @@ exclude_inputs: false }) }, + exportOneYearExcel(fileName) { + // let param = this.getQueryParams() + // console.log('瀵煎嚭鍙傛暟', param) + downFile(this.url.exportOneYearXlsUrl) + .then((data) => { + if (!data) { + this.$notification.warning({ + message: '娑堟伅', + description: '鏂囦欢涓嬭浇澶辫触' + }) + return + } + if (typeof window.navigator.msSaveBlob !== 'undefined') { + window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls') + } else { + let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' })) + let link = document.createElement('a') + link.style.display = 'none' + link.href = url + link.setAttribute('download', fileName + '.xls') + document.body.appendChild(link) + link.click() + document.body.removeChild(link) //涓嬭浇瀹屾垚绉婚櫎鍏冪礌 + window.URL.revokeObjectURL(url) //閲婃斁鎺塨lob瀵硅薄 + } + }) + }, showIdentifying() { getAction(this.url.listByType, { type: 'lyl' }).then(res => { if (res.success) { @@ -515,23 +521,16 @@ dateParamChange(v1, v2) { this.queryParam.startTime = v2[0] this.queryParam.endTime = v2[1] - // 鐐瑰嚮鏃堕棿閫夋嫨鍣ㄧ殑娓呯┖鎸夐挳鏃朵細瑙﹀彂姝ゅ垽鏂�(鐐瑰嚮閲嶇疆鎸夐挳涓嶄細瑙﹀彂)锛屽疄鐜伴噸缃垪琛ㄥ姛鑳斤紝鍒囧疄鏀瑰彉鍒楄〃鏄剧ず鏁堟灉 - if (!this.queryParam.startTime && !this.queryParam.endTime) this.searchReset() + this.dates = [v1[0], v1[1]] }, efficiencyOptionsOnChange(checkedList) { - // let index = checkedList.indexOf('lyl') - // if (index < 0) { - // // this.$message.warn('涓嶈兘鍙栨秷鏌ヨ寮�鍔ㄧ巼') - // this.$notification.warning({ - // message: '娑堟伅', - // description: '涓嶈兘鍙栨秷鏌ヨ寮�鍔ㄧ巼' - // }) - // - // return false - // } this.checkedList = checkedList }, searchQuery() { + // 鍥犺Е搴曞埛鏂颁細淇敼鍙傛暟鏃堕棿鍊硷紝鏁呭湪姝ょ敤鏃堕棿閫夋嫨鍣ㄧ殑鏃堕棿鍊煎鍙傛暟鏃堕棿鍊煎啀娆¤祴鍊硷紝鑻ヤ笉杩欐牱鍋氬垯鍙傛暟鏃堕棿鍊煎垯浼氫笌鏃堕棿閫夋嫨鍣ㄤ笂鐨勬椂闂村�间笉涓�鑷� + this.queryParam.startTime = moment(this.dates[0]).format('YYYYMMDD') + this.queryParam.endTime = moment(this.dates[1]).format('YYYYMMDD') + if (this.queryParam.typeTree == '1') { this.queryParam.parentId = this.queryParamEquip.parentId this.queryParam.equipmentId = this.queryParamEquip.equipmentId @@ -539,6 +538,8 @@ this.queryParam.parentId = this.queryParamPeople.parentId this.queryParam.equipmentId = '' } + this.requestAllDataSize = moment.duration(moment(this.queryParam.endTime) - moment(this.queryParam.startTime), 'millisecond').asDays() + 1 + Object.keys(this.queryParams).forEach(item => { if (Array.isArray(this.queryParams[item])) { this.queryParam[item] = this.queryParams[item].join() @@ -557,6 +558,7 @@ this.queryParam.parentId = this.typeParent this.queryParam.equipmentId = this.typeEquipment this.dates = [moment().subtract('days', 8), moment().subtract('days', 1)] + this.requestAllDataSize = this.dates[1].diff(this.dates[0], 'days') + 1 this.queryParam.startTime = moment(this.dates[0]).format('YYYYMMDD') this.queryParam.endTime = moment(this.dates[1]).format('YYYYMMDD') this.queryParams = { @@ -570,28 +572,82 @@ this.tableHeads = [] this.dataList = [] this.spinning = true + console.log('requestAllDataSize', this.requestAllDataSize) + console.log('everyRequestDataSize', this.everyRequestDataSize) + // 鑻ユ棩鏈熼�夋嫨鍣ㄨ缃殑鏌ヨ璇锋眰鏁伴噺瓒呰繃15鏉″垯寮�鍚噿鍔犺浇 + if (this.requestAllDataSize > this.everyRequestDataSize) { + // 寮�鍚噿鍔犺浇鍚庡皢缁撴潫鏃ユ湡璁剧疆涓哄紑濮嬫棩鏈熶箣鍚庣殑14澶╋紝鍗冲厛鏌ヨ15澶╁唴鐨勬暟鎹� + this.queryParam.endTime = moment(this.queryParam.startTime).add(this.everyRequestDataSize - 1, 'days').format('YYYYMMDD') + this.isLazyRequest = true + this.tableScroll.removeEventListener('scroll', this.tableScrollX) // 涓洪伩鍏嶆粴鍔ㄦ潯鏈夋粴鍔ㄨ窛绂诲悗鍚庣偣鍑绘煡璇㈡寜閽Е鍙戞粴鍔ㄤ簨浠讹紝鍥犳鍦ㄨЕ鍙戜簨浠跺墠绉婚櫎浜嬩欢 + } + getAction(this.url.list, this.queryParam).then(res => { if (res.success) { - this.tableHeads = res.result.dates - this.dataList = res.result.mdcEfficiencyList if (res.result.mdcEfficiencyList && !res.result.mdcEfficiencyList.length) { this.$notification.info({ message: '娑堟伅', description: '鏆傛棤璇ョ被鍨嬫暟鎹�' }) + return } - this.distinguishColorList = res.result.utilizationRateList + + this.tableHeads = res.result.dates + this.dataList = res.result.mdcEfficiencyList + console.log('dataList', this.dataList) this.checkSameData(this.dataList) this.checkSameData1(this.dataList) this.checkSameData2(this.dataList) this.combineCell() - // this.columns.push(...dataColumns) - // this.initDeviceType(this.dataList) + this.tableScroll.addEventListener('scroll', this.tableScrollX) } }).finally(() => { this.spinning = false }) }, + + // 鎺у埗寮傚父鍙嶉寮圭獥寮瑰嚭 + handleShowFeedbackModal() { + this.$refs.modalForm.formParams = {} + this.modalVisible = true + }, + + // 婊氬姩鏉¤Е搴曞埛鏂拌〃鏍兼暟鎹� + tableScrollX() { + // 褰撴粴鍔ㄦ潯瑙﹀簳涓旀噿鍔犺浇寮�鍚椂瑙﹀彂婊氬姩鏉¤Е搴曞埛鏂� + if (Math.ceil(this.tableScroll.scrollLeft + this.tableScroll.clientWidth) + 1 >= this.tableScroll.scrollWidth && this.isLazyRequest) { + this.spinning = true + this.queryParam.startTime = moment(this.queryParam.endTime).add(1, 'days').format('YYYYMMDD') + // 鍒ゆ柇璁剧疆鎳掑姞杞藉悗鐨勭粨鏉熸椂闂存槸鍚﹁秴杩囨椂闂撮�夋嫨鍣ㄤ腑璁剧疆鐨勭粨鏉熸椂闂� + if (moment(this.queryParam.endTime).add(this.everyRequestDataSize - 1, 'days').format('YYYYMMDD') - moment(this.dates[1]).format('YYYYMMDD') < 0) { + //鍐嶆鏌ヨ鍚�15澶╁唴鐨勬暟鎹� + this.queryParam.endTime = moment(this.queryParam.endTime).add(this.everyRequestDataSize, 'days').format('YYYYMMDD') + } else { + // 濡傛灉涓嶅皬浜庢椂闂撮�夋嫨鍣ㄤ腑璁剧疆鐨勬椂闂村垯璁剧疆璇锋眰缁撴潫鏃ユ湡涓烘椂闂撮�夋嫨鍣ㄤ腑璁剧疆鐨勭粨鏉熸椂闂村苟涓斿叧闂噿鍔犺浇锛堟剰鍛崇潃鏈�鍚庝竴娆¤Е搴曞埛鏂帮級 + this.queryParam.endTime = moment(this.dates[1]).format('YYYYMMDD') + this.isLazyRequest = false + } + getAction(this.url.list, this.queryParam) + .then(res => { + if (res.success) { + this.tableHeads = [...this.tableHeads.slice(0, -2), ...res.result.dates] + console.log('dataList', this.dataList) + this.dataList.forEach(item1 => { + res.result.mdcEfficiencyList.forEach(item2 => { + if (item1.equipmentId === item2.equipmentId) { + item1.dataList = [...item1.dataList.slice(0, -2), ...item2.dataList] + } + }) + }) + } + }) + .finally(() => { + this.spinning = false + }) + } + }, + + // 鑾峰彇璁惧绫诲瀷鍒楄〃 queryGroup() { getAction(this.url.queryEquipmentType).then(res => { if (res.success) { @@ -610,18 +666,14 @@ }) }, - /** - * 璋冪敤鎺ュ彛鑾峰彇鎺у埗绯荤粺绫诲瀷 - */ + // 鑾峰彇鎺у埗绯荤粺绫诲瀷鍒楄〃 getDriveTypeByApi() { api.getDriveTypeApi().then((res) => { if (res.success) this.driveTypeList = res.result }) }, - /** - * 鍒嗚鲸鐜囨敼鍙樻椂鍚屾椂鏀瑰彉琛ㄦ牸楂樺害宸蹭繚璇侀椤典竴杩涘叆涓嶆嫋鍔ㄥ瀭鐩存粴鍔ㄦ潯鏃跺嵆鍙嫋鍔ㄨ〃鏍兼按骞虫粴鍔ㄦ潯 - */ + // 鍒嗚鲸鐜囨敼鍙樻椂鍚屾椂鏀瑰彉琛ㄦ牸楂樺害宸蹭繚璇侀椤典竴杩涘叆涓嶆嫋鍔ㄥ瀭鐩存粴鍔ㄦ潯鏃跺嵆鍙嫋鍔ㄨ〃鏍兼按骞虫粴鍔ㄦ潯 handleWindowResize() { const tableContainer = document.getElementById('Efficiency') // 琛ㄦ牸瀹瑰櫒 const clientHeight = document.documentElement.clientHeight || document.body.clientHeight // 娴忚鍣ㄥ彲瑙嗗尯鍩熼珮搴� @@ -758,17 +810,10 @@ .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; } diff --git a/src/views/mdc/base/modules/efficiencyShiftReport/EfficiencyShiftList.vue b/src/views/mdc/base/modules/efficiencyShiftReport/EfficiencyShiftList.vue index d8fabe4..a112342 100644 --- a/src/views/mdc/base/modules/efficiencyShiftReport/EfficiencyShiftList.vue +++ b/src/views/mdc/base/modules/efficiencyShiftReport/EfficiencyShiftList.vue @@ -133,12 +133,11 @@ <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-button type="primary" @click="handleShowFeedbackModal" icon="plus" v-has="'efficiencyShiftReport:feedback'">寮傚父鍙嶉</a-button> <a-button type="primary" icon="printer" v-print="'#EfficiencyShift'" v-has="'efficiencyShiftReport:print'">鎵撳嵃 </a-button> </a-space> - <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" - @change="efficiencyOptionsOnChange"/> </div> <table cellpadding="5" cellspacing="1" style="border: 1px solid darkgray;"> <tr> @@ -150,6 +149,13 @@ </td> </tr> </table> + </a-col> + </a-row> + + <a-row :gutter="24"> + <a-col> + <a-checkbox-group :value="checkedList" :default-value="['lyl']" :options="efficiencyOptions" + @change="efficiencyOptionsOnChange"/> </a-col> </a-row> </a-form> @@ -250,6 +256,8 @@ </div> </a-spin> </div> + + <mdc-message-approval-modal ref="modalForm" :visible="modalVisible" @closeModal="modalVisible = false"/> </div> </template> @@ -260,10 +268,11 @@ import '@/components/table2excel/table2excel' import { ajaxGetDictItems, getDictItemsFromCache, duplicateCheck } from '@/api/api' import api from '@/api/mdc' + import MdcMessageApprovalModal from '../MdcMessageApproval/MdcMessageApprovalModal' export default { name: 'EfficiencyShiftList', - components: {}, + components: { MdcMessageApprovalModal }, data() { return { typeTree: '', @@ -310,7 +319,8 @@ shiftList: [], shiftSubList: [], spinning: false, - toggleSearchStatus: false + toggleSearchStatus: false, + modalVisible: false// 寮傚父鍙嶉寮圭獥鏄惁寮瑰嚭 } }, props: { nodeTree: '', Type: '', nodePeople: '' }, @@ -569,15 +579,6 @@ // if(!this.queryParam.startTime&&!this.queryParam.endTime)this.searchReset() }, efficiencyOptionsOnChange(checkedList) { - // let index = checkedList.indexOf('lyl') - // if (index < 0) { - // // this.$message.warn('涓嶈兘鍙栨秷鏌ヨ鍒╃敤鐜�') - // this.$notification.warning({ - // message: '娑堟伅', - // description: '涓嶈兘鍙栨秷鏌ヨ鐝鍒╃敤鐜�' - // }) - // return false - // } this.checkedList = checkedList }, searchQuery() { @@ -639,6 +640,13 @@ this.spinning = false }) }, + + // 鎺у埗寮傚父鍙嶉寮圭獥寮瑰嚭 + handleShowFeedbackModal() { + this.$refs.modalForm.formParams = {} + this.modalVisible = true + }, + queryGroup() { getAction(this.url.queryEquipmentType).then(res => { if (res.success) { diff --git a/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue b/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue index 8aff73a..5b492c7 100644 --- a/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue +++ b/src/views/mdc/base/modules/openRateFractionAnalysis/openRateFractionAnalysisMain.vue @@ -213,15 +213,14 @@ * 鐢熷懡鍛ㄦ湡 鎸傝浇鍓� * */ created() { - this.searchReset() this.queryGroup() this.getDriveTypeByApi() this.initDictData('device_level') this.initDictData('device_importance_level') - }, mounted() { this.tableScroll = document.querySelector('.table2') + this.searchReset() window.addEventListener('resize',this.handleWindowResize) }, beforeDestroy() { @@ -437,6 +436,7 @@ } this.queryParam = {} this.dates = [moment().subtract('days', 8), moment().subtract('days', 1)] + this.requestAllDataSize = this.dates[1].diff(this.dates[0],'days') + 1 this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD') this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD') this.queryParam.startTime = '00:00' diff --git a/src/views/mdc/base/modules/openRateTrendAnalysis/openRateTrendAnalysisMain.vue b/src/views/mdc/base/modules/openRateTrendAnalysis/openRateTrendAnalysisMain.vue index 2b86e83..f9c8fe8 100644 --- a/src/views/mdc/base/modules/openRateTrendAnalysis/openRateTrendAnalysisMain.vue +++ b/src/views/mdc/base/modules/openRateTrendAnalysis/openRateTrendAnalysisMain.vue @@ -201,7 +201,7 @@ XData: [0], YData: [0], isLazyRequest: '',// 鏄惁寮�鍚噿鍔犺浇 - requestAlldataSize: 8,// 鎬诲叡璇锋眰鐨勫垪琛ㄩ」鏁扮洰 + requestAllDataSize: 8,// 鎬诲叡璇锋眰鐨勫垪琛ㄩ」鏁扮洰 everyRequestDataSize: 15,// 姣忔璇锋眰鐨勫垪琛ㄩ」鏁扮洰 toggleSearchStatus: false } @@ -211,7 +211,6 @@ * 鐢熷懡鍛ㄦ湡 鎸傝浇鍓� * */ created() { - this.searchReset() this.queryGroup() this.getDriveTypeByApi() this.initDictData('device_level') @@ -219,6 +218,7 @@ }, mounted() { this.tableScroll = document.querySelector('.table2') + this.searchReset() window.addEventListener('resize', this.handleWindowResize) }, beforeDestroy() { @@ -311,7 +311,7 @@ this.tableHeads = [] this.dataList = [] // 鑻ユ棩鏈熼�夋嫨鍣ㄨ缃殑鏌ヨ璇锋眰鏁伴噺瓒呰繃15鏉″垯寮�鍚噿鍔犺浇 - if (this.requestAlldataSize > 15) { + if (this.requestAllDataSize > 15) { // 寮�鍚噿鍔犺浇鍚庡皢缁撴潫鏃ユ湡璁剧疆涓哄紑濮嬫棩鏈熶箣鍚庣殑14澶╋紝鍗冲厛鏌ヨ15澶╁唴鐨勬暟鎹� this.queryParam.endDate = moment(this.queryParam.startDate).add(this.everyRequestDataSize - 1, 'days').format('YYYYMMDD') this.isLazyRequest = true @@ -356,7 +356,7 @@ this.queryParam.parentId = this.queryParamPeople.parentId this.queryParam.equipmentId = '' } - this.requestAlldataSize = moment.duration(moment(this.queryParam.endDate) - moment(this.queryParam.startDate), 'millisecond').asDays() + 1 + this.requestAllDataSize = moment.duration(moment(this.queryParam.endDate) - moment(this.queryParam.startDate), 'millisecond').asDays() + 1 Object.keys(this.queryParams).forEach(item => { if (Array.isArray(this.queryParams[item])) { @@ -375,6 +375,7 @@ } this.queryParam = {} this.dates = [moment().subtract('days', 8), moment().subtract('days', 1)] + this.requestAllDataSize = this.dates[1].diff(this.dates[0],'days') + 1 this.queryParam.startDate = moment(this.dates[0]).format('YYYYMMDD') this.queryParam.endDate = moment(this.dates[1]).format('YYYYMMDD') this.loadData() -- Gitblit v1.9.3