| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 | /* * << * Davinci * == * Copyright (C) 2016 - 2017 EDP * == * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * >> */import { IChartProps } from '../../components/Chart'import {  decodeMetricName,  getAggregatorLocale} from '../../components/util'import {  getDimetionAxisOption,  getMetricAxisOption,  getLabelOption,  getLegendOption,  getGridPositions} from './util'import { EChartOption } from 'echarts'import { getFormattedValue } from '../../components/Config/Format'const defaultTheme = require('assets/json/echartsThemes/default.project.json')const defaultThemeColors = defaultTheme.theme.colorexport default function (chartProps: IChartProps) {  const {    data,    cols,    metrics,    chartStyles  } = chartProps  const {    spec,    label,    xAxis,    yAxis,    splitLine  } = chartStyles  const {    showVerticalLine,    verticalLineColor,    verticalLineSize,    verticalLineStyle,    showHorizontalLine,    horizontalLineColor,    horizontalLineSize,    horizontalLineStyle  } = splitLine  const labelOption = {    label: getLabelOption('waterfall', label, metrics)  }  const xAxisData = data.map((d) => d[cols[0].name] || '')  let sourceData = []  const series = []  metrics.forEach((m) => {    const metricName = `${m.agg}(${decodeMetricName(m.name)})`    sourceData = data.map((d) => d[metricName])    const baseData = []    const seriesBaseData = [...data]    const ascendOrder = []    const discendOrder = []    sourceData.forEach((a, index) => {      a = parseFloat(a)      if (index > 0) {        const result = a - parseFloat(sourceData[index - 1])        if (result >= 0) {          ascendOrder.push(result)          discendOrder.push('-')          baseData.push(parseFloat(sourceData[index - 1]))        } else {          ascendOrder.push('-')          discendOrder.push(Math.abs(result))          baseData.push(parseFloat(sourceData[index - 1]) - Math.abs(result))        }        return result      } else {        ascendOrder.push(a)        discendOrder.push('-')        baseData.push(0)        return a      }    })    const totalAscend = ascendOrder.reduce((sum, val) => typeof val === 'number' ? sum + val : sum + 0, 0)    const totalDiscendOrder = discendOrder.reduce((sum, val) => typeof val === 'number' ? sum + val : sum + 0, 0)    const difference = totalAscend - totalDiscendOrder    xAxisData.push('累计')    baseData.push('-')    if (difference > 0) {      ascendOrder.push(difference)      discendOrder.push('-')    } else {      discendOrder.push(Math.abs(difference))      ascendOrder.push('-')    }    const baseDataObj = {      name: `[${getAggregatorLocale(m.agg)}] ${decodeMetricName(m.name)}`,      type: 'bar',      sampling: 'average',      stack: 'stack',      data: baseData,      itemStyle: {        normal: {          barBorderColor: 'rgba(0,0,0,0)',          color: 'rgba(0,0,0,0)'          // opacity: interactIndex === undefined ? 1 : 0.25        },        emphasis: {          barBorderColor: 'rgba(0,0,0,0)',          color: 'rgba(0,0,0,0)'        }      }    }    const ascendOrderObj = {      name: '升',      type: 'bar',      sampling: 'average',      stack: 'stack',      data: ascendOrder,      itemStyle: {        // normal: {        //   opacity: interactIndex === undefined ? 1 : 0.25        // }      },      ...labelOption    }    const discendOrderObj = {      name: '降',      type: 'bar',      sampling: 'average',      stack: 'stack',      data: discendOrder,      itemStyle: {        // normal: {        //   opacity: interactIndex === undefined ? 1 : 0.25        // }      },      ...labelOption    }    series.push(baseDataObj)    series.push(ascendOrderObj)    series.push(discendOrderObj)  })  const seriesNames = series.map((s) => s.name)  const xAxisSplitLineConfig = {    showLine: showVerticalLine,    lineColor: verticalLineColor,    lineSize: verticalLineSize,    lineStyle: verticalLineStyle  }  const yAxisSplitLineConfig = {    showLine: showHorizontalLine,    lineColor: horizontalLineColor,    lineSize: horizontalLineSize,    lineStyle: horizontalLineStyle  }  const tooltip: EChartOption.Tooltip = {    trigger: 'axis',    formatter (param: EChartOption.Tooltip.Format[]) {      let color      const text = param.map((pa, index) => {        const data = !index ? parseFloat(sourceData[pa.dataIndex]) : pa.data        if (typeof data === 'number') {          color = pa.color        }        const formattedValue = getFormattedValue(data, metrics[0].format)        return `${pa.seriesName}: ${formattedValue}`      })      const xAxis = param[0]['axisValue']      if (xAxis === '累计') {        return ''      } else {        text.unshift(xAxis as string)        if (color) {          text[0] = `<span class="widget-tooltip-circle" style="background: ${color}"></span>` + text[0]        }        return text.join('<br/>')      }    }  }  return {    xAxis: getDimetionAxisOption(xAxis, xAxisSplitLineConfig, xAxisData),    yAxis: getMetricAxisOption(yAxis, yAxisSplitLineConfig, metrics.map((m) => decodeMetricName(m.name)).join(` / `)),    series,    tooltip,    grid: getGridPositions({ showLegend: false }, seriesNames, '', false, yAxis, xAxis, xAxisData)  }}
 |