11-mes-new/src/views/DataAnalysis/productionIndicators.vue
2022-11-07 08:45:49 +08:00

367 lines
9.1 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.

<!--
/*
* @Author: lb
* @Date: 2022-03-24 13:30:00
* @LastEditTime: 2022-05-10 18:38:26
* @LastEditors: gtz
* @Description: 拆分了搜索区和功能按钮区增加了toptitle
*/
-->
<template>
<div>
<div class="app-container">
<top-title />
<head-form
:form-config="headFormConfig"
@headBtnClick="btnClick"
/>
<base-table
:page="listQuery.current"
:limit="listQuery.size"
:table-config="trueTableProps.length ? trueTableProps: tableProps"
:table-data="tableData.length ? tableData : []"
:span-method="spanMethod"
:is-loading="listLoading"
:index-config="{ align: 'left', fixed: 'left' }"
/>
</div>
<div class="app-container">
<el-radio-group v-model="chartType" class="data-analysis-radio" size="mini" @change="changeChartType">
<el-radio-button v-for="(item, index) in chartDataArr" :key="index" :label="index">{{ item.equipmentName }}</el-radio-button>
</el-radio-group>
<Line-chart :chart-data="chartDataItem" width="100%" height="400px" />
</div>
</div>
</template>
<script>
import Vue from 'vue'
import i18n from '@/lang'
import TopTitle from '@/components/TopTitle'
import HeadForm from '@/components/basicData/HeadForm'
import BaseTable from '@/components/BaseTable/index-compound'
import LineChart from '@/components/Charts/LineChart'
import { lineList } from '@/api/DataAnalysis/productionLineBalance'
// import { timeFormatter } from '@/filters'
/**
* 表格表头配置项 TypeScript接口注释
* tableConfig<ConfigItem> = []
*
* Interface ConfigItem = {
* prop: string,
* label: string,
* width: string,
* align: string,
* subcomponent: function,
* filter: function
* }
*
*
*/
const tableProps = [
{
prop: 'process',
label: i18n.t('module.dataAnalysis.productionLineBalance.process'),
align: 'center',
fixed: 'left'
},
{
prop: 'equipmentName',
label: i18n.t('module.dataAnalysis.productionLineBalance.equipmentName'),
align: 'center',
fixed: 'left'
}
]
const testData = [
{
process: '清洗',
data: [
{
equipmentName: '上料清洗1',
data: [
{
time: '2022-5-6',
eqCT: 0.46,
eqTT: 0.12,
lineCT: 0.68,
lineTT: 0.25
},
{
time: '2022-5-7',
eqCT: 0.34,
eqTT: 0.25,
lineCT: 0.42,
lineTT: 0.4733
},
{
time: '2022-5-8',
eqCT: 0.01,
eqTT: 0.62,
lineCT: 0.73,
lineTT: 0.45
}
]
},
{
equipmentName: '上料清洗2',
data: [
{
time: '2022-5-6',
eqCT: 0.46,
eqTT: 0.62,
lineCT: 0.24,
lineTT: 0.70
},
{
time: '2022-5-7',
eqCT: 0.32,
eqTT: 0.58,
lineCT: 0.46,
lineTT: 0.80
},
{
time: '2022-5-8',
eqCT: 0.35,
eqTT: 0.83,
lineCT: 0.29,
lineTT: 0.90
}
]
}
]
},
{
process: '磨边',
data: [
{
equipmentName: '磨边1',
data: [
{
time: '2022-5-6',
eqCT: 0.16,
eqTT: 0.42,
lineCT: 0.85,
lineTT: 0.26
},
{
time: '2022-5-7',
eqCT: 0.31,
eqTT: 0.21,
lineCT: 0.11,
lineTT: 0.46
},
{
time: '2022-5-8',
eqCT: 0.82,
eqTT: 0.25,
lineCT: 0.09,
lineTT: 0.23
}
]
},
{
equipmentName: '磨边2',
data: [
{
time: '2022-5-6',
eqCT: 0.33,
eqTT: 0.62,
lineCT: 0.37,
lineTT: 0.22
},
{
time: '2022-5-7',
eqCT: 0.32,
eqTT: 0.24,
lineCT: 0.21,
lineTT: 0.25
},
{
time: '2022-5-8',
eqCT: 0.11,
eqTT: 0.23,
lineCT: 0.45,
lineTT: 0.21
}
]
}
]
}
]
export default {
name: 'ProductPool',
components: { TopTitle, BaseTable, HeadForm, LineChart },
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
data() {
return {
addOrUpdateVisible: false,
trueWidth: 240,
tableProps,
testData,
tableData: [],
list: [],
total: 0,
listLoading: false,
listQuery: {
current: 1,
size: 10
},
lineList: [],
headFormConfig: [
{
type: 'select',
label: i18n.t('module.dataAnalysis.productionLineBalance.line'),
placeholder: this.$t('module.dataAnalysis.productionLineBalance.line'),
param: 'line',
width: 300,
selectOptions: []
},
{
type: 'datePicker',
label: this.$t('module.dataAnalysis.productionLineBalance.time'),
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
rangeSeparator: '-',
startPlaceholder: this.$t('module.dataAnalysis.productionLineBalance.startTime'),
endPlaceholder: this.$t('module.dataAnalysis.productionLineBalance.endTime'),
param: 'searchTime'
},
{
type: 'button',
btnName: 'btn.search',
name: 'search',
color: 'primary'
}
],
trueTableProps: [],
headFormValue: {},
numArr: [],
chartDataArr: [],
chartType: 0,
chartDataItem: {}
}
},
created() {
this.getLineList()
this.getList()
},
methods: {
// 获取产线列表
getLineList() {
lineList({ current: 1, size: 999 }).then(res => {
if (res.code === 0) {
this.lineList = res.data.records
Vue.set(this.headFormConfig[0], 'selectOptions', this.lineList)
}
console.log(res)
})
},
getList() {
this.numArr = []
let num = 0
const tableConfig = []
this.chartDataArr = []
const dataArr = this.testData.map((item, index) => {
let dataArr = []
if (item.data) {
this.chartDataArr = this.chartDataArr.concat(item.data)
num += item.data.length
this.numArr.push(num)
dataArr = item.data.map((z, idx) => {
const dataArr = {}
z.data.forEach(i => {
// 动态生成tableConfig
if (index === 0 && idx === 0) {
tableConfig.push({
label: i.time,
children: [
{ prop: i.time + 'eqCT', label: '设备CT' },
{ prop: i.time + 'eqTT', label: '设备TT' },
{ prop: i.time + 'lineCT', label: '产线CT' },
{ prop: i.time + 'lineTT', label: '产线TT' }
]
})
}
// 合并数据集
dataArr[i.time + 'eqCT'] = i.eqCT
dataArr[i.time + 'eqTT'] = i.eqTT
dataArr[i.time + 'lineCT'] = i.lineCT
dataArr[i.time + 'lineTT'] = i.lineTT
dataArr.process = item.process
dataArr.equipmentName = z.equipmentName
})
return dataArr
})
}
return dataArr
})
this.trueTableProps = this.tableProps.concat(tableConfig)
this.tableData = this.flatten(dataArr)
this.$nextTick(() => {
this.changeChartType(this.chartType)
})
},
changeChartType(idx) {
const chartDataItem = {
timeArr: [],
eqCT: [],
eqTT: [],
lineCT: [],
lineTT: []
}
this.chartDataArr[idx].data.forEach(item => {
chartDataItem.timeArr.push(item.time)
chartDataItem.eqCT.push(item.eqCT)
chartDataItem.eqTT.push(item.eqTT)
chartDataItem.lineCT.push(item.lineCT)
chartDataItem.lineTT.push(item.lineTT)
})
this.chartDataItem = chartDataItem
},
spanMethod({ rowIndex, columnIndex }) {
if (columnIndex === 1) {
if (rowIndex === 0) {
return [this.numArr[0], 1]
} else if (this.numArr.indexOf(rowIndex) >= 0) {
const rowNum = this.numArr[this.numArr.indexOf(rowIndex) + 1] - this.numArr[this.numArr.indexOf(rowIndex)]
return [rowNum, 1]
} else {
return [0, 0]
}
}
},
// 数组扁平
flatten(arr) {
var res = []
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
res = res.concat(this.flatten(arr[i]))
} else {
res.push(arr[i])
}
}
return res
},
btnClick(val) {
this.headFormValue = val
if (this.headFormValue.btnName === 'search') {
this.getList()
}
}
}
}
</script>