mt-yd-ui/src/views/modules/monitoring/equipmentEfficiency.vue

390 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 设备效率分析 -->
<div class="mod-config">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="currentChangeHandle(1)" class="blueTip" size="small">
<!-- 工厂 -->
<el-form-item>
<!-- <el-select v-model="dataForm.factoryId" :placeholder="$t('eq.name') + ' / ' + $t('eq.code')" clearable></el-select> -->
<el-select v-model="dataForm.ftId" :placeholder="$t('factory.title')" clearable>
<el-option v-for="factory in factoryList" :key="factory.id" :value="factory.id" :label="factory.name" />
</el-select>
</el-form-item>
<!-- 产线 -->
<el-form-item>
<el-select v-model="dataForm.productlines" :placeholder="$t('pl.title')" multiple clearable>
<el-option v-for="productLine in productLineList" :key="productLine.id" :value="productLine.id" :label="productLine.name" />
</el-select>
</el-form-item>
<!-- 时间类型 -->
<!-- 按时间段 -->
<el-form-item>
<el-select v-model="timeType" :placeholder="$t('timetype')" clearable>
<el-option value="range" :label="$t('reftimerange')" />
<el-option value="date" :label="$t('refdate')" />
</el-select>
</el-form-item>
<!-- 日期选择 -->
<el-form-item v-if="timeType === 'date'">
<el-date-picker key="range-picker" v-model="rawTime" type="date" :placeholder="$t('hints.date')" format="yyyy-MM-dd" />
</el-form-item>
<!-- 时间段选择 -->
<el-form-item v-else>
<el-date-picker
key="time-picker"
v-model="rawTime"
type="daterange"
:range-separator="$t('datePicker.range')"
:start-placeholder="$t('datePicker.starttime')"
:end-placeholder="$t('datePicker.endtime')"
format="yyyy-MM-dd"
/>
</el-form-item>
<!-- 按钮 -->
<el-form-item>
<el-button class="buttonColor" @click="currentChangeHandle(1)">{{ $t('search') }}</el-button>
<!-- <el-button v-if="$hasPermission('monitoring:equipmentEffiency:save')" type="primary" @click="addOrUpdateHandle()">{{ $t('add') }}</el-button> -->
</el-form-item>
</el-form>
<transition mode="out-in" name="slide-to-left">
<equipment-efficiency-graph v-if="showGraph" key="graph" ref="eegraph" @close-graph="showGraph = false" />
<base-table v-else :data="dataList" :table-head-configs="tableConfigs" :max-height="calcMaxHeight(8)"
@operate-event="handleOperations" @refreshDataList="getDataList" />
<!-- v-loading="dataIsLoading " -->
</transition>
<!-- <el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper"
></el-pagination> -->
</div>
</template>
<script>
import i18n from '@/i18n'
import BaseTable from '@/components/base-table'
// import TableOperateComponent from '@/components/base-table/components/operationComponent'
import TableTextComponent from '@/components/base-table/components/detailComponent'
import EquipmentEfficiencyGraph from './equipmentEfficiencyGraph.vue'
import { calcMaxHeight } from '@/utils'
// import { timeFilter } from '@/utils/filters'
import moment from 'moment'
const tableConfigs = [
{
type: 'index',
name: i18n.t('index')
},
{
// name: i18n.t('createTime'),
prop: 'factoryName',
name: i18n.t('factory.title')
},
{ prop: 'pdName', name: i18n.t('pl.title') },
{ prop: 'wsName', name: i18n.t('ws.title') },
{ prop: 'eqName', name: i18n.t('eq.title') },
{
name: i18n.t('eq.efficienttimeh'),
children: [
{ prop: 'workTime', name: i18n.t('eq.worktimeh'), width: 120, filter: val => `${val} `+i18n.t('hour') },
{ prop: 'workRate', name: i18n.t('eq.workdurationratio'), width: 120, filter: val => (val * 100).toFixed(2) + '%' }
]
},
{
name: i18n.t('eq.shutdowntimeh'),
children: [
{ prop: 'stopTime', name: i18n.t('eq.stoptimeh'), width: 120, filter: val => `${val} `+i18n.t('hour') },
{ prop: 'stopRate', name: i18n.t('eq.stopratio'), width: 120, filter: val => (val * 100).toFixed(2) + '%' }
]
},
{
name: i18n.t('eq.stoplost'),
children: [
{ prop: 'downTime', name: i18n.t('eq.downtimeh'), width: 120, filter: val => `${val} `+i18n.t('hour') },
{ prop: 'downRate', name: i18n.t('eq.downrate'), width: 120, filter: val => (val * 100).toFixed(2) + '%' },
{ prop: 'timeEfficiency', name: i18n.t('eq.timeefficiency'), width: 120, filter: val => (val * 100).toFixed(2) + '%' }
]
},
{
name: i18n.t('eq.speedlost'),
children: [
{ prop: 'realYield', name: i18n.t('eq.realyield'), width: 120, filter: val => `${val} `+i18n.t('hour') },
{ prop: 'designYield', name: i18n.t('eq.designyield'), width: 120, filter: val => `${val} `+i18n.t('hour') },
{ prop: 'peEfficiency', name: i18n.t('eq.speedefficiency'), width: 120, filter: val => (val * 100).toFixed(2) + '%' }
]
},
{
name: 'OEE',
prop: 'oee',
filter: val => (val * 100).toFixed(2) + '%'
},
{
name: 'TEEP',
prop: 'teep',
filter: val => (val * 100).toFixed(2) + '%'
},
{
prop: 'operations',
name: i18n.t('handle'),
fixed: 'right',
width: 120,
subcomponent: TableTextComponent,
// options: ['edit', 'delete']
// options: ['view-trend'] // 查看趋势
buttonContent: i18n.t('eq.viewtrend'),
actionName: 'view-trend',
emitFullData: true
}
]
export default {
data() {
return {
/** hfxny part */
factoryList: [],
productLineList: [],
showGraph: false,
/** */
calcMaxHeight,
tableConfigs,
timeType: 'date',
rawTime: null, // [] or datetime
dataForm: {
type: 1,
ftId: null,
productlines: [],
startTime: null,
entTime: null
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false
}
},
components: {
BaseTable,
EquipmentEfficiencyGraph
},
activated() {
this.getFactoryList().then(() => {
this.getProductLineList()
})
},
watch: {
timeType() {
// 防止切换日期类型时报错
this.rawTime = null
}
},
methods: {
// 获取工厂列表
getFactoryList() {
return this.$http({
url: this.$http.adornUrl('/monitoring/factory/list'),
method: 'get'
}).then(({ data: res }) => {
if (res && res.code === 0) {
this.factoryList = res.data
/** set default */
if (this.factoryList.length) {
this.dataForm.ftId = this.factoryList[0].id
}
} else {
this.factoryList = []
this.dataForm.ftId = null
}
})
},
// 选择工厂时
handleFactoryChange(val) {
this.getProductLineList()
},
// 获取产线列表
getProductLineList() {
const query = {
url: this.$http.adornUrl('/monitoring/productionLine/list'),
method: 'get'
}
if (this.dataForm.ftId) {
query.params = this.$http.adornParams({
factoryId: this.dataForm.ftId
});
}
this.$http(query).then(({ data: res }) => {
if (res && res.code === 0 && res.data.length) {
this.productLineList = res.data
/** set default */
this.dataForm.productlines = [this.productLineList[0].id]
} else {
this.productLineList = []
this.dataForm.productlines = []
}
})
},
// 时间类型预处理
getTimeRange() {
let startTime
let endTime
if (this.rawTime instanceof Array) {
startTime = this.rawTime[0] ? moment(this.rawTime[0]).format('YYYY-MM-DDTHH:mm:ss') : '' // 强制axios使用北京时间
endTime = this.rawTime[1] ? moment(this.rawTime[1]).format('YYYY-MM-DDTHH:mm:ss') : ''
} else {
if (this.rawTime) {
startTime = moment(this.rawTime).format('YYYY-MM-DDTHH:mm:ss')
endTime = moment(startTime)
.add(1, 'd')
.format('YYYY-MM-DDTHH:mm:ss')
} else {
startTime = ''
endTime = ''
}
}
return { startTime, endTime }
},
// 获取数据列表
getDataList() {
const { startTime, endTime } = this.getTimeRange()
this.showGraph = false
// this.dataListLoading = true
this.$http({
url: this.$http.adornUrl('/monitoring/eqAnalysis/oee'),
method: 'post',
data: {
startTime,
endTime,
ftId: this.dataForm.ftId,
productlines: this.dataForm.productlines,
// limit: this.pageIndex,
// page: this.pageSize,
type: 1
}
}).then(({ data: res }) => {
if (res.data && res.code !== 500) {
console.log('oee data:', res)
if (res.data.length) {
this.dataList = res.data
// this.dataList = Array(20).fill(1)
} else {
this.dataList.splice(0)
}
} else {
this.dataList.splice(0)
this.$message.error(res.msg)
}
})
},
// 查看趋势
viewTrend(data) {
const { startTime, endTime } = this.getTimeRange()
const injectData = {
// 时间段
startTime,
endTime,
// 设备id
equipmentId: data.eqId,
equipmentName: data.eqName,
// 时间类型, type 按年,按月,按日等
type: 1, // 默认 type 1, 1无间隔2按月分隔3按周分隔4按天分隔
// 时长数据: 工作时长, 停机时长,故障时长
workTime: data.workTime,
stopTime: data.stopTime,
downTime: data.downTime,
// 比例数据: 工作时长比率停机时长比率故障时长比率速度开动率OEETEEP
workRate: data.workRate,
stopRate: data.stopRate,
downRate: data.downRate,
peEfficiency: data.peEfficiency,
timeEfficiency: data.timeEfficiency
}
// console.log('trends data: ', data)
this.showGraph = true
console.clear()
console.log('inject data: ', injectData)
setTimeout(() => {
// console.log('befoer graph: ', this.$refs.eegraph)
this.$refs.eegraph.init(injectData) // 注入初始数据,这些数据在组件内部用作条件,有可能会被更改
}, 600) // 动画是500ms
},
// 每页数
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
// 多选
selectionChangeHandle(val) {
this.dataListSelections = val
},
handleOperations({ type, data }) {
switch (type) {
case 'view-trend':
return this.viewTrend(data)
// return this.addOrUpdateHandle(id, true)
// case 'edit':
// return this.addOrUpdateHandle(id)
// case 'delete':
// return this.deleteHandle(id)
}
}
}
}
</script>
<style scoped>
.slide-to-left-enter-active,
.slide-to-left-leave-active {
transition: all 0.5s;
}
.slide-to-left-enter {
transform: translateX(10px);
opacity: 0;
}
.slide-to-left-leave-to {
transform: translateX(-10px);
opacity: 0;
}
.slide-to-left-leave,
.slide-to-left-enter-to {
transform: translateX(0);
}
.blueTip::before {
display: inline-block;
content: '';
width: 4px;
height: 24px;
background: #0b58ff;
border-radius: 1px;
margin-right: 8px;
margin-top: 4px;
}
.buttonColor {
color: #fff;
background: #0b58ff;
}
</style>