//--------------初始数据局部--------------------
// 拼数据
let series: any = [];

// 寄存多层x轴数据的series

const seriesextends: KeyValue[] = [];

// x轴的层数
const xlevel: number = details[0].xaxisValue.length;
// 折线图的个数
const yAxisLineNum: number = details[0].yaxisLine.length;
// 柱型图的个数
const yAxisBarNum: number = details[0].yaxisBar.length;
// 最多的x的值
const xNum: number = details.length;
// lenged中data的值
const yName: string[] = [];

// 初始化yAxisLineListObject的列表
let yAxisLineListObject = {

// yAxisLineValue1:['num1','num2','num3','num4']

};

for (let i: number = 0; i < yAxisLineNum; i++) {

const tempyaxislinevalue: string[] = [];for (let j = 0; j < details.length; j++) {  tempyaxislinevalue.push(details[j].yaxisLine[i].yvalue);}yAxisLineListObject = Object.assign({}, yAxisLineListObject, {  [details[0].yaxisLine[i].yfield]: tempyaxislinevalue,});

}
// console.log(yAxisLineListObject);

// 初始化yAxisBarListObject的列表
let yAxisBarListObject = {

// yAxisLineValue1:['num1','num2','num3','num4']

};
for (let i: number = 0; i < yAxisBarNum; i++) {

const tempyaxisbarvalue: string[] = [];for (let j = 0; j < details.length; j++) {  tempyaxisbarvalue.push(details[j].yaxisBar[i].yvalue);}yAxisBarListObject = Object.assign({}, yAxisBarListObject, {  [details[0].yaxisBar[i].yfield]: tempyaxisbarvalue,});

}
// console.log(yAxisBarListObject);

//向series里填充y的折线图数据
for (let i: number = 0; i < Object.keys(yAxisLineListObject).length; i++) {

yName.push(Object.keys(yAxisLineListObject)[i]);series.push({  data: Object.values(yAxisLineListObject)[i],  type: 'line',  name: Object.keys(yAxisLineListObject)[i],  yAxisIndex: 0,  // xAxisIndex: 0,});

}

// console.log(series);

//向series里填充y的柱状图数据
for (let i: number = 0; i < Object.keys(yAxisBarListObject).length; i++) {

yName.push(Object.keys(yAxisBarListObject)[i]);series.push({  data: Object.values(yAxisBarListObject)[i],  type: 'bar',  name: Object.keys(yAxisBarListObject)[i],  yAxisIndex: 1,  // xAxisIndex: 1,});

}

// 寄存所有层维度数据的数组
const xAxisArray: any = [];

// 先按维度的档次拼接x的名字
const tempxaxisname = [];
for (let i: number = 0; i < details.length; i++) {

const tempxaxislevelname: string[] = [];tempxaxislevelname.push(details[i].xaxisValue[0]);for (let j: number = 1; j < xlevel; j++) {  tempxaxislevelname.push(    tempxaxislevelname[j - 1] + ',' + details[i].xaxisValue[j],  );}tempxaxisname.push(tempxaxislevelname);

}

// console.log(tempxaxisname, '按档次拼接好的x的名字---------------');

// 设置x轴的数据
const xAxisData: any = [

// {value:星期1}

];

for (let i: number = 0; i < details.length; i++) {

xAxisData.push({  ['value']: tempxaxisname[i][xlevel - 1],  ['textStyle']: {    ['fontSize']: 8,  },});

}

// 分维度取出x轴的名字数组
for (let i: number = 0; i < xlevel; i++) {

let tempxxaisvalue: KeyValue = {};// 该层循环确定一个维度上的名称和所占的单元格的长度for (let j = 0; j < details.length; j++) {  if (    Object.keys(tempxxaisvalue)[Object.keys(tempxxaisvalue).length - 1] ===    tempxaxisname[j][i]  ) {    //如果和最初一位反复,则合并单元格,长度+1    // console.log("反复,须要合并");    const lastkey =      Object.keys(tempxxaisvalue)[Object.keys(tempxxaisvalue).length - 1];    // console.log(lastkey);    tempxxaisvalue[lastkey]++;  } else {    // console.log("不反复,不须要合并");    tempxxaisvalue = Object.assign({}, tempxxaisvalue, {      [tempxaxisname[j][i]]: 1,    });  }}xAxisArray.push(tempxxaisvalue);

}
// 外层循环走完所有的维度都曾经拼成了一个对象数组,对象外面别离包裹着每一层维度的名称和对应的长度,一个对象就是一个维度

// console.log(
// xAxisArray,
// '要给多层x轴进行渲染的xAxisArray对象数据----------------',
// );

xAxisArray.reverse();

// 设置grid的值
const grid: any = [

{  top: 100,  bottom: (xlevel + 2) * 30,},{  top: 100,  bottom: (xlevel + 2) * 30,},

];

// 设置多层的x轴,配置series,grid,xAxis,yAxis
const xAxisExtends: any = [];
const yAxisExtends: any = [];
for (let i: number = 0; i < xlevel; i++) {

grid.push({  height: 30,  bottom: (xlevel - i + 1) * 30,  tooltip: {    // show: false,  },});xAxisExtends.push({  type: 'category',  gridIndex: i + 2,  axisLine: { show: false },  axisLabel: { show: false },  axisTick: { show: false },});yAxisExtends.push({  type: 'value',  gridIndex: i + 2,  axisLine: { show: false },  axisLabel: { show: false },  axisTick: { show: false },});// 以后该维度的名字字符串和对应的所占单元格长度的字符串const tempsingleXAxisName: string[] = Object.keys(xAxisArray[i]);const tempsingleXAxisLength: number[] = Object.values(xAxisArray[i]);// console.log(xAxisArray);// 顺次填入该维度的所有呈现的名称与匹配的所占单元格的长度for (let j: number = 0; j < Object.keys(xAxisArray[i]).length; j++) {  // 设置填充进bar中的name 的内容和款式,当长度大于以后bar的宽度时,以省略号显示  let tempXAxisname: String = '';  // tempsingleXAxisName[j].substring(tempsingleXAxisName[j].lastIndexOf(',')+1)为要展现的全副的字符串  if (    tempsingleXAxisName[j].substring(      tempsingleXAxisName[j].lastIndexOf(',') + 1,    ).length >    (tempsingleXAxisLength[j] / xNum) * 100 - 1  )    tempXAxisname =      tempsingleXAxisName[j]        .substring(tempsingleXAxisName[j].lastIndexOf(',') + 1)        .substring(0, Math.floor((tempsingleXAxisLength[j] / xNum) * 100)) +      '..';  else    tempXAxisname = tempsingleXAxisName[j].substring(      tempsingleXAxisName[j].lastIndexOf(',') + 1,    );  seriesextends.push({    type: 'bar',    barWidth: (tempsingleXAxisLength[j] / xNum) * 100 + '%',    data: [{ name: tempXAxisname, value: 1 }],    barGap: 0,    label: {      show: true,      position: 'inside',      formatter: '{b}',      // offset: [0, 10],    },    itemStyle: {      color: 'none',      borderColor: '#000',      borderWidth: 1,    },    animation: false,    tooltip: {      formatter: tempsingleXAxisName[j].substring(        tempsingleXAxisName[j].lastIndexOf(',') + 1,      ),    },    // barWidth:    xAxisIndex: i + 2,    yAxisIndex: i + 2,  });}// console.log(series,'+++++++++++');

}

//------------------------------------------------------------------------------------------------------------------

//echarts 中 option设置
let option: EChartsOption;

option = {  title: {    text: titleinfo,  },  tooltip: {    trigger: 'item',    axisPointer: {      type: 'shadow',    },  },  grid: grid,  legend: {    data: yName,  },  xAxis: [    {      type: 'category',      data: xAxisData,      position: 'bottom',      gridIndex: 0,      nameTextStyle: {        fontSize: 8,      },      axisTick: {        length: 30,        interval: 0,      },           axisLabel: { show: false },    },    {      type: 'category',      gridIndex: 0,      data: xAxisData,      axisLine: { show: false },      axisLabel: { show: false },      axisTick: { show: false },    },    // 上面都是多的x轴    ...xAxisExtends,  ],  yAxis: [    {      type: 'value',      name: '折线图数据',      gridIndex: 0,      min: 'dataMin',      axisLabel: {        formatter: function (value: number) {          // console.log(value,'y轴的值');          // console.log(value.toExponential(2),'解决后的y轴的值');          return value.toExponential(1);        },      },    },    {      type: 'value',      name: '柱形图数据',      gridIndex: 0,      position: 'right',      max: 'dataMax',      min: 'dataMin',      axisLabel: {        formatter: function (value: number) {          // console.log(value,'y轴的值');          // console.log(value.toExponential(2),'解决后的y轴的值');          return value.toExponential(1);        },      },    },    // 上面都是多的y轴    ...yAxisExtends,  ],  series: [...series, ...seriesextends],  toolbox: [    {      feature: {        dataZoom: {          show: true,          // type: ['zoom'],          yAxisIndex: false,          xAxisIndex: 0,        },      },      // right:-25    },  ],};

//---------------------------------------------------------------------------------------------------------------------------------------------------------

//缩放的监听,管制多层x轴的变动
myChart.on('datazoom', (params: any) => {

  // console.log(xAxisData, 'on监听外面的xAxisData----------');  let slicestart: number = 0;  let sliceend: number = 0;  //回退到最初始的状态时  if (params.batch[0].start === 0) {    slicestart = 0;    sliceend = details.length - 1;  }  // 有startValue值的时候(惯例缩放)  else if (params.batch[0].startValue) {    slicestart = params.batch[0].startValue;    sliceend = params.batch[0].endValue;  }  setdatazoom(slicestart, sliceend);});

function setdatazoom(slicestart: number, sliceend: number) {

    const slicelength: number = sliceend - slicestart + 1;  // 缩放之后的x轴的更新的data  const sliceXAXisData = xAxisData.slice(slicestart, sliceend + 1);  // console.log(  //   sliceXAXisData,  //   'sliceXAXisData+++++缩放时候的x轴的data数据+',  // );       // 寄存所有层维度数据的数组  const slicexAxisArray: any = [];  // 先按维度的档次拼接x的名字  const slicetempxaxisname = [];  for (let i: number = slicestart; i < sliceend + 1; i++) {    const tempxaxislevelname: string[] = [];    tempxaxislevelname.push(details[i].xaxisValue[0]);    for (let j: number = 1; j < xlevel; j++) {      tempxaxislevelname.push(        tempxaxislevelname[j - 1] + ',' + details[i].xaxisValue[j],      );    }    slicetempxaxisname.push(tempxaxislevelname);  }  // console.log(  //   slicetempxaxisname,  //   '缩放后按档次拼接好的x的名字---------------',  // );  // 分维度取出x轴的名字数组  for (let i: number = 0; i < xlevel; i++) {    let tempxxaisvalue: KeyValue = {};    // 该层循环确定一个维度上的名称和所占的单元格的长度    for (let j: number = 0; j < slicetempxaxisname.length; j++) {      if (        Object.keys(tempxxaisvalue)[          Object.keys(tempxxaisvalue).length - 1        ] === slicetempxaxisname[j][i]      ) {        //如果和最初一位反复,则合并单元格,长度+1        // console.log("反复,须要合并");        const lastkey =          Object.keys(tempxxaisvalue)[            Object.keys(tempxxaisvalue).length - 1          ];        // console.log(lastkey);        tempxxaisvalue[lastkey]++;      } else {        // console.log("不反复,不须要合并");        tempxxaisvalue = Object.assign({}, tempxxaisvalue, {          [slicetempxaxisname[j][i]]: 1,        });      }    }    slicexAxisArray.push(tempxxaisvalue);  }  //    外层循环走完所有的维度都曾经拼成了一个对象数组,对象外面别离包裹着每一层维度的名称和对应的长度,一个对象就是一个维度  // console.log(  //   slicexAxisArray,  //   '缩放时要给多层x轴进行渲染的xAxisArray对象数据----------------',  // );  slicexAxisArray.reverse();  const sliceseriesextends = [];  for (let i: number = 0; i < xlevel; i++) {    // 以后该维度的名字字符串和对应的所占单元格长度的字符串    const slicetempsingleXAxisName: string[] = Object.keys(      slicexAxisArray[i],    );    const slicetempsingleXAxisLength: number[] = Object.values(      slicexAxisArray[i],    );    // console.log(slicetempsingleXAxisName,'datazoomtempsingleXAxisName..................');    // console.log(slicetempsingleXAxisLength,'datazoomtempsingleXAxisLength..................');    // 顺次填入该维度的所有呈现的名称与匹配的所占单元格的长度    for (      let j: number = 0;      j < Object.keys(slicexAxisArray[i]).length;      j++    ) {      // 设置填充进bar中的name 的内容和款式,当长度大于以后bar的宽度时,以省略号显示      let slicetempXAxisname: String = '';      //slicetempsingleXAxisName[j].substring(slicetempsingleXAxisName[j].lastIndexOf(',')+1)为要展现的全副的字符串      if (        slicetempsingleXAxisName[j].substring(          slicetempsingleXAxisName[j].lastIndexOf(',') + 1,        ).length >        (slicetempsingleXAxisLength[j] / slicelength) * 100 - 1      ) {        slicetempXAxisname =          slicetempsingleXAxisName[j]            .substring(slicetempsingleXAxisName[j].lastIndexOf(',') + 1)            .substring(              0,              Math.floor(                (slicetempsingleXAxisLength[j] / slicelength) * 100,              ),            ) + '..';      } else        slicetempXAxisname = slicetempsingleXAxisName[j].substring(          slicetempsingleXAxisName[j].lastIndexOf(',') + 1,        );      sliceseriesextends.push({        type: 'bar',        barWidth: (slicetempsingleXAxisLength[j] / slicelength) * 100 + '%',        data: [{ name: slicetempXAxisname, value: 1 }],        barGap: 0,        label: {          show: true,          position: 'inside',          formatter: '{b}',          // offset: [0, 10],        },        itemStyle: {          color: 'none',          borderColor: '#000',          borderWidth: 1,        },        animation: false,        tooltip: {          formatter: slicetempsingleXAxisName[j].substring(            slicetempsingleXAxisName[j].lastIndexOf(',') + 1,          ),        },        // barWidth:        xAxisIndex: i + 2,        yAxisIndex: i + 2,      });    }  }  // console.log(sliceseriesextends, 'sliceseriesextends+++++++++++');    myChart.setOption(    {      series: [...series, ...sliceseriesextends],      yAxis: [        {          type: 'value',          name: '折线图数据',          gridIndex: 0,          min: 'dataMin',          max: 'dataMax',          axisLabel: {            formatter: function (value: number) {              // console.log(value,'y轴的值');              // console.log(value.toExponential(2),'解决后的y轴的值');              return value.toExponential(1);            },          },        },        {          type: 'value',          name: '柱形图数据',          gridIndex: 0,          position: 'right',          max: 'dataMax',          min: 'dataMin',          axisLabel: {            formatter: function (value: number) {              // console.log(value,'y轴的值');              // console.log(value.toExponential(2),'解决后的y轴的值');              return value.toExponential(1);            },          },        },        // 上面都是多的y轴        ...yAxisExtends,      ],          },    {      replaceMerge: ['series', 'yAxis'], // 替换合并series,默认一般合并    },  );}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//原始数据details的格局
details: [

    {      yaxisBar: [        {          yfield: 'firstPassCPU',          yvalue: '1E-14',        },        {          yfield: 'firstPassCPK',          yvalue: '-1E-14',        },      ],      yaxisLine: [        {          yfield: 'firstPassCP',          yvalue: '0',        },      ],      xaxisValue: [        '20211023',        'AGD142M208-D001',        '1000:GSM824_Idle_Current',      ],    },    {      yaxisBar: [        {          yfield: 'firstPassCPU',          yvalue: '8E-15',        },        {          yfield: 'firstPassCPK',          yvalue: '-8E-15',        },      ],      yaxisLine: [        {          yfield: 'firstPassCP',          yvalue: '0',        },      ],      xaxisValue: [        '20211023',        'AGD142M208-D001',        '1001:GSM824_Max_Pout_0dBm_Drive',      ],    },

}