tft-fe/src/views/qualityManagement/components/defectScatterPlotChart.vue

334 lines
8.4 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="box">
<div
id="defectScatterPlotChart"
style="width: 100%"
:style="{ height: chartHeight + 'px' }"
/>
<span class="text1">{{ c2 }}</span>
<span class="text2">{{ c3 }}</span>
<span class="text3">{{ c1 }}</span>
<span class="text4">{{ c4 }}</span>
</div>
</template>
<script>
import * as echarts from 'echarts'
import { tableHeight } from '@/utils/index'
import resize from '@/utils/chartMixins/resize'
export default {
name: 'DefectScatterPlotChart',
mixins: [resize],
props: {
defectMsg: {
type: Object,
default: () => {
return {}
}
},
cornerData: {
type: Array,
default: () => {
return []
}
}
},
data() {
return {
chart: '',
chartHeight: tableHeight(446),
list: [
{ label: 'S', value: 'S' },
{ label: 'M', value: 'M' },
{ label: 'L', value: 'L' },
{ label: 'XL', value: 'XL' },
{ label: '气泡', value: 'BL' },
{ label: '变形', value: 'Distortion' },
{ label: '纤维', value: 'Fiber' },
{ label: '划伤', value: 'Scratch' },
{ label: '结节', value: 'Knot' },
{ label: '结石', value: 'Stone' },
{ label: '铂金', value: 'Pt' },
{ label: '拖尾', value: 'Tail' },
{ label: 'ADG', value: 'Adg' },
{ label: '点状缺陷', value: 'Tin' },
{ label: '锡缺陷(顶部)', value: 'Top' },
{ label: '锡缺陷(底部)', value: 'Bottom' },
{ label: '无法识别', value: 'Iisrest' }
],
c1: '',
c2: '',
c3: '',
c4: ''
}
},
mounted() {
window.addEventListener('resize', () => {
this.chartHeight = tableHeight(446)
})
},
watch: {
defectMsg: function () {
this.getChart()
},
cornerData: function () {
this.getCorner()
}
},
methods: {
getCorner() {
if (this.cornerData.length > 0) {
for (let i = 0; i < this.cornerData.length; i++) {
if (this.cornerData[i].cornerID === 'C1') {
this.c1 =
this.cornerData[i].deltaX + '*' + this.cornerData[i].deltaY + '□'
}
if (this.cornerData[i].cornerID === 'C2') {
this.c2 =
this.cornerData[i].deltaX + '*' + this.cornerData[i].deltaY + '□'
}
if (this.cornerData[i].cornerID === 'C3') {
this.c3 =
'□' + this.cornerData[i].deltaX + '*' + this.cornerData[i].deltaY
}
if (this.cornerData[i].cornerID === 'C4') {
this.c4 =
'□' + this.cornerData[i].deltaX + '*' + this.cornerData[i].deltaY
}
}
} else {
this.c1 = ''
this.c2 = ''
this.c3 = ''
this.c4 = ''
}
},
transLabel(v) {
let label = ''
for (let l = 0; l < this.list.length; l++) {
if (v === this.list[l].value) {
label = this.list[l].label
}
}
return label
},
getChart() {
if (
this.chart !== null &&
this.chart !== '' &&
this.chart !== undefined
) {
this.chart.dispose() // 页面多次刷新会出现警告Dom已经初始化了一个实例这是销毁实例
}
var chartDom = document.getElementById('defectScatterPlotChart')
this.chart = echarts.init(chartDom)
let legendList = []
let seriesList = []
let num = 0 // 计算点的数量判断后续bursh是否需要延迟
let delayTime = 0
for (let i in this.defectMsg) {
legendList.push(this.transLabel(i))
let arr1 = []
let obj = {}
for (let j of this.defectMsg[i]) {
let arr2 = []
arr2.push(2600 - parseInt(j.ypos))
arr2.push(2250 - parseInt(j.xpos))
arr1.push(arr2)
num++
}
obj.name = this.transLabel(i)
obj.type = 'scatter'
obj.data = arr1
obj.symbolSize = 5
seriesList.push(obj)
}
if (num <= 3000) {
delayTime = 0
} else if (3000 < num <= 7000) {
delayTime = 1000
} else if (7000 < num <= 10000) {
delayTime = 2000
} else {
delayTime = 3000
}
var option = {
color: [
'#5d7ab7',
'#ec795f',
'#925041',
'#fb5099',
'#f6bd16',
'#E8684A',
'#6DC8EC',
'#9270CA',
'#FF9D4D',
'#269A99',
'#FF99C3',
'#BDD2FD',
'#5AD8A6',
'#FDABAB',
'#BDEFDB',
'#5B8FF9',
'#404E67'
],
legend: {
top: 10,
left: 0,
data: legendList,
textStyle: {
fontSize: 9
},
itemWidth: 10 // 图例宽度
},
brush: {
toolbox: ['rect', 'clear'],
xAxisIndex: 0,
throttleType: 'debounce',
throttleDelay: delayTime
},
tooltip: {
formatter: '{c},{a}'
},
grid: {
x: 60,
y: 60,
x2: 20,
y2: 60,
borderWidth: 1
},
xAxis: {
type: 'value',
nameGap: 16,
nameTextStyle: {
fontSize: 16
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: 'rgba(0, 0, 0, 0.15)'
}
},
axisLabel: {
rotate: 45
},
max: 2600,
min: 0,
interval: 100
},
yAxis: {
type: 'value',
nameLocation: 'end',
nameGap: 20,
nameTextStyle: {
fontSize: 16
},
splitLine: {
show: true,
lineStyle: {
type: 'dashed',
color: 'rgba(0, 0, 0, 0.15)'
}
},
max: 2250,
min: 0,
interval: 100
},
series: seriesList
}
let that = this
this.chart.on('brushSelected', function (params) {
var brushed = []
var brushComponent = params.batch[0]
var total = 0
var xLong = 0
var yLong = 0
if (params.batch[0].areas[0]) {
xLong = parseInt(
params.batch[0].areas[0].coordRange[0][1] -
params.batch[0].areas[0].coordRange[0][0]
)
yLong = parseInt(
params.batch[0].areas[0].coordRange[1][1] -
params.batch[0].areas[0].coordRange[1][0]
)
}
for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
var rawIndices = brushComponent.selected[sIdx].dataIndex.length
total += rawIndices
brushed.push(
brushComponent.selected[sIdx].seriesName + ' : ' + rawIndices
)
}
brushed.push('总计 : ' + total)
that.chart.setOption({
title: {
backgroundColor: 'rgba(0, 0, 0, 0.5)',
text: 'SELECTED DATA: \n' + brushed.join('\n'),
right: params.batch[0].areas[0] ? '10%' : -100,
bottom: params.batch[0].areas[0] ? 0 : -500,
textStyle: {
fontSize: 12,
fontWeight: 'normal',
color: '#fff'
}
},
graphic: [
{
type: 'group',
left: params.batch[0].areas[0]
? params.batch[0].areas[0].range[0][0]
: -100,
top: params.batch[0].areas[0]
? params.batch[0].areas[0].range[1][1] + 5
: -100,
children: [
{
type: 'text',
z: 100,
style: {
fill: '#333',
width: 220,
overflow: 'break',
text: xLong + '*' + yLong,
font: '12px Microsoft YaHei'
}
}
]
}
]
})
})
option && this.chart.setOption(option)
}
}
}
</script>
<style lang="scss" scoped>
.box {
position: relative;
.text1,
.text2,
.text3,
.text4 {
position: absolute;
}
.text1 {
top: 30px;
left: 0;
}
.text2 {
top: 30px;
right: 0;
}
.text3 {
bottom: 10px;
left: 0;
}
.text4 {
bottom: 10px;
right: 0;
}
}
</style>