122 lines
3.0 KiB
JavaScript
122 lines
3.0 KiB
JavaScript
// 核心库
|
||
import React, { Component } from 'react'
|
||
// 组件库
|
||
import { Search } from '@woowalker/feui'
|
||
import TableChart from './TableChart'
|
||
|
||
class LineBarChart extends Component {
|
||
getLineBarChartOption = (option, chartType) => {
|
||
// 解析出 echarts option 配置
|
||
const { data = [], xAxis = [], yAxis = [] } = option || {}
|
||
let tempXAxis = xAxis.map(item => ({ type: 'category', data: item.data }))
|
||
let tempYAxis = yAxis.map(({ name, max, min, inverse }) => ({
|
||
type: 'value',
|
||
name,
|
||
nameTextStyle: { align: 'left' },
|
||
max,
|
||
min,
|
||
inverse
|
||
}))
|
||
let tempLegend = []
|
||
let tempSeries = data.map(item => {
|
||
const { name, type, stack, yAxisIndex, data: itemData = [] } = item
|
||
tempLegend.push(name)
|
||
return {
|
||
name,
|
||
type: type || (chartType === 0 ? 'line' : 'bar'),
|
||
stack,
|
||
data: itemData.map(seriesData => {
|
||
return {
|
||
value: seriesData.value || 0,
|
||
TooltipValue: seriesData.TooltipValue
|
||
}
|
||
}),
|
||
yAxisIndex
|
||
}
|
||
})
|
||
|
||
// echarts 图表配置
|
||
const chartOption = {
|
||
legend: {
|
||
top: '5%',
|
||
textStyle: {
|
||
color: '#333333'
|
||
},
|
||
data: tempLegend
|
||
},
|
||
grid: {
|
||
left: '2%',
|
||
right: '4%',
|
||
bottom: '2%',
|
||
containLabel: true
|
||
},
|
||
xAxis: tempXAxis,
|
||
yAxis: tempYAxis,
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: {
|
||
type: 'shadow'
|
||
},
|
||
formatter: (params) => {
|
||
const title = params[0].axisValueLabel
|
||
const body = params.map(item => {
|
||
return `<div>${item.marker}${item.seriesName}:<span>${item.data.TooltipValue || item.data.value}</span></div>`
|
||
}).join('')
|
||
return `<div><div>${title}</div>${body}</div>`
|
||
}
|
||
},
|
||
toolbox: {
|
||
show: true,
|
||
orient: 'vertical',
|
||
right: 0,
|
||
top: 'center',
|
||
feature: {
|
||
magicType: { show: true, type: ['line', 'bar', 'stack', 'tiled'] },
|
||
restore: { show: true },
|
||
saveAsImage: { show: true }
|
||
}
|
||
},
|
||
series: tempSeries
|
||
}
|
||
|
||
// 单独提出 dataZoom,因为如果 xAxis 为空数组,dataZoom 的 xAxisIndex[0] 取值会报错
|
||
if (chartOption.xAxis.length) {
|
||
chartOption.dataZoom = [
|
||
{
|
||
type: 'inside',
|
||
xAxisIndex: [0]
|
||
}
|
||
]
|
||
}
|
||
return chartOption
|
||
}
|
||
|
||
render () {
|
||
const { config, option, type, getChartData, loading } = this.props
|
||
const {
|
||
id,
|
||
code,
|
||
formCode
|
||
} = config
|
||
|
||
const chartOption = this.getLineBarChartOption(option, type)
|
||
return (
|
||
<>
|
||
<Search
|
||
formCode={formCode}
|
||
onSearch={getChartData}
|
||
code={code}
|
||
/>
|
||
<TableChart
|
||
chartId={id || formCode}
|
||
option={chartOption}
|
||
loading={loading.models['chartPage']}
|
||
style={{ minHeight: 300 }}
|
||
/>
|
||
</>
|
||
)
|
||
}
|
||
}
|
||
|
||
export default LineBarChart
|