帆软js文档

js切换tab

_g().getWidgetByName(‘tabpane1_c’).showCardByIndex(0);

js打开对话框

FR.doHyperlinkByGet({
	//报表路径
	"url":"/webroot/decision/view/report?viewlet=***/****.cpt&op=write",    //参数
	"para":{
		"__pi__":true,    //是否显示参数面板

		"consumer_id":card_number
///		"sdept_id_budget_p":sdept_id_budget,
		//"smonth":smonth,
		//"sweek":sweek,
		//"enable":"0"
		},
	"target":"_dialog",    //对话框方式打开
	"feature":{
		"width":1400,
		"height":700,
		"isCenter":true,     //是否居中显示
		"title":"详情"
		}

	})
			$(".fr-core-panel-header.fr-core-panel-style-blue.fr-core-window-header").css("background-color","#496897")
	

js刷新

var zhi = _g().getWidgetByName('report0_c').getCellValue("B1"); if (zhi == 1111) { zhi = ""; _g().getWidgetByName('report0_c').setCellValue("B1", zhi + 1); _g().getWidgetByName('report0_c').setCellValue("C1", id); //para1 = id; _g().getWidgetByName('textEditor3').setValue(id); _g().getWidgetByName('rHIframe0_c').reload(); //rHIframe1为父模板需要刷新的网页框控件名 }; if (zhi == 111) { _g().getWidgetByName('report0_c').setCellValue("B1", zhi + 1); _g().getWidgetByName('report0_c').setCellValue("D1", id); //para1 = id; _g().getWidgetByName('textEditor2').setValue(id); _g().getWidgetByName('rHIframe0_c_c').reload(); //rHIframe1为父模板需要刷新的网页框控件名 }; if (zhi == 11) { _g().getWidgetByName('report0_c').setCellValue("B1", zhi + 1); _g().getWidgetByName('report0_c').setCellValue("E1", id); // para1=id; _g().getWidgetByName('textEditor1').setValue(id); _g().getWidgetByName('rHIframe0_c_c_c').reload(); //rHIframe1为父模板需要刷新的网页框控件名 }; if (zhi == 1) { _g().getWidgetByName('report0_c').setCellValue("B1", zhi + 1); _g().getWidgetByName('report0_c').setCellValue("F1", id); _g().getWidgetByName('textEditor0').setValue(id); // para1=id; _g().getWidgetByName('rHIframe0_c_c_c_c').reload(); //rHIframe1为父模板需要刷新的网页框控件名 };

js切换tab页

_g().getWidgetByName('tabpane1_c').showCardByIndex(1);

决策报表表格跑马灯

setTimeout(function(){
     _g().getWidgetByName('XXXXXXX').startMarquee({
		offset: 2,
		interval: 0.3
		//stopOnHover: false
		//to: 'left'
	});
}, 9500);

帆软集成echarts制作3d饼图

var TABLE_DATA = getData('data1'); // 获取数据
// 处理数据
const a = TABLE_DATA.splice(0,1); // 删除数组第一个元素
// 将带过来的嵌套数组转化成常规数组
const data = TABLE_DATA.map(item => ({
   name: item[0], 
   ID: item[1] 
}));
// 将数据根据ID进行排序
const pieData = data.sort((a,b)=> a.ID - b.ID);
// console.log(pieData)
// const TABLE_DATA = [
//   {
//     转让方客户类型: '民营资产交易',
//     ID: 52
//     // itemStyle: {
//     //   // color: '#1c74f8cc',
//     //   color: '#1C74F8',
//     // },
//   },
//   {
//     转让方客户类型: '行政事业性国有资产交易',
//     ID: 614
//   },
//   {
//     转让方客户类型: '企业国有资产交易',
//     ID: 585
//   },
//   {
//     转让方客户类型: '金融企业国有资产交易',
//     ID: 84
//   },
//   {
//     转让方客户类型: '金融机构资产交易',
//     ID: 147
//   },
//   {
//     转让方客户类型: '罚没资产交易',
//     ID: 377
//   },
//   {
//     转让方客户类型: '其他交易',
//     ID: 1
//   }
// ];
const colorList = [
  '#042DC7',
  '#1955CF',
  '#3C7ED4',
  '#619DD9',
  '#86BBDD',
  '#A7CDE2',
  '#B6D8E9'
];
option = {};

function init() {
  const paramsList = pieData.map((item, index) => {
    return {
      ...item,
      shading: 'realistic',
      itemStyle: {
        color: colorList[index]
      }
    };
  });
  // 构建3d饼状图

  // 传入数据生成 option

  option = getPie3D(paramsList, 0.8);

  console.log(option);
  // 是否需要label指引线,如果要就添加一个透明的2d饼状图并调整角度使得labelLine和3d的饼状图对齐,并再次setOption
  option.series.push({
    name: 'pie2d',
    // type: 'pie',
    // labelLine: {
    //   length: 10,
    //   length2: 10
    // },
    startAngle: -30, // 起始角度,支持范围[0, 360]。
    clockwise: false, // 饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
    radius: ['20%', '50%'],
    center: ['50%', '50%'],
    data: pieData,
    itemStyle: {
      opacity: 0
    }
  });
  myChart.setOption(option);
  bindListen();
}
// 生成模拟 3D 饼图的配置项
function getPie3D(pieData, internalDiameterRatio) {
  let that = this;
  let series = [];
  let sumValue = 0;
  let startValue = 0;
  let endValue = 0;
  let legendData = [];
  let legendBfb = [];
  let k = 1 - internalDiameterRatio;
  // 为每一个饼图数据,生成一个 series-surface 配置
  for (let i = 0; i < pieData.length; i++) {
    sumValue += pieData[i].ID;
    let seriesItem = {
      name:
        typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,
      type: 'surface',
      parametric: true,
      wireframe: {
        show: false
      },
      pieData: pieData[i],
      pieStatus: {
        selected: false,
        hovered: false,
        k: k
      },
      center: ['10%', '50%']
    };

    if (typeof pieData[i].itemStyle != 'undefined') {
      let itemStyle = {};
      if (typeof pieData[i].itemStyle.color != 'undefined') {
        itemStyle.color = pieData[i].itemStyle.color;
      }
      if (typeof pieData[i].itemStyle.opacity != 'undefined') {
        itemStyle.opacity = pieData[i].itemStyle.opacity;
      }
      seriesItem.itemStyle = itemStyle;
    }
    series.push(seriesItem);
  }
  // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
  // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
  legendData = [];
  legendBfb = [];
  for (let i = 0; i < series.length; i++) {
    endValue = startValue + series[i].pieData.ID;
    series[i].pieData.startRatio = startValue / sumValue;
    series[i].pieData.endRatio = endValue / sumValue;
    series[i].parametricEquation = getParametricEquation(
      series[i].pieData.startRatio,
      series[i].pieData.endRatio,
      false,
      false,
      k,
      series[i].pieData.ID
    );
    startValue = endValue;
    // legendData.push(series[i].name);
    // let bfb = that.fomatFloat(series[i].pieData.value / sumValue, 4);
    legendData.push({
      name: series[i].name,
      // value: bfb
    });
    legendBfb.push({
      name: series[i].name,
      // value: bfb
    });
  }
  let boxHeight = getHeight3D(series, 26);
  // 补充一个透明的圆环,用于支撑高亮功能的近似实现。
  // series.push({
  //   name: 'mouseoutSeries',
  //   type: 'surface',
  //   parametric: true,
  //   wireframe: {
  //     show: false
  //   },
  //   itemStyle: {
  //     opacity: 0
  //   },
  //   parametricEquation: {
  //     u: {
  //       min: 0,
  //       max: Math.PI * 2,
  //       step: Math.PI / 20
  //     },
  //     v: {
  //       min: 0,
  //       max: Math.PI,
  //       step: Math.PI / 20
  //     },
  //     x: function (u, v) {
  //       return Math.sin(v) * Math.sin(u) + Math.sin(u);
  //     },
  //     y: function (u, v) {
  //       return Math.sin(v) * Math.cos(u) + Math.cos(u);
  //     },
  //     z: function (u, v) {
  //       return Math.cos(v) > 0 ? 0.1 : -0.1;
  //     }
  //   }
  // });
  // 准备待返回的配置项,把准备好的 legendData、series 传入。
  const option = {
    legend: {
      data: legendData,
      orient: 'horizontal',
      // left: 10,
      // top: 10,
      bottom:'1%',
      width:450,
      itemGap: 10,
      // textStyle: {
      //   fontSize:'16px',
      //   color: '#A1E2FF'
      // },
      show: true,
      icon: 'circle',
      // formatter: function (param) {
      //   let item = legendBfb.filter((item) => item.name == param)[0];
      //   // let bfs = that.fomatFloat(item.value * 100, 2) + '%';
      //   return `${item.name}`;
      // },
      formatter: ['{a|{name}}'].join('\n'),
      textStyle: {
        rich: {
          a: {
            width: 120, // 每个图例的宽度,具体根据字数调整
            lineHeight: 10,
            fontSize:'16px',
            color:'#A1E2FF',
          },
        }
      }
    },
    labelLine: {
      show: true,
      lineStyle: {
        color: '#7BC0CB'
      }
    },
    label: {
      show: true,
      position: 'outside',
      rich: {
        b: {
          color: '#7BC0CB',
          fontSize: 12,
          lineHeight: 20
        },
        c: {
          fontSize: 16
        }
      },
      formatter: '{b|{b} \n}{c|{c}}{b|  亩}'
    },
    tooltip: {
      formatter: (params) => {
        if (
          params.seriesName !== 'mouseoutSeries' &&
          params.seriesName !== 'pie2d'
        ) {
          let bfb = (
            (option.series[params.seriesIndex].pieData.endRatio -
              option.series[params.seriesIndex].pieData.startRatio) *
            100
          ).toFixed(2);
          return (
            `${params.seriesName}<br/>` +
            `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>` +
            `${bfb}%`
          );
        }
      }
    },
    xAxis3D: {
      min: -1,
      max: 1
    },
    yAxis3D: {
      min: -1,
      max: 1
    },
    zAxis3D: {
      min: -1,
      max: 1
    },
    grid3D: {
      show: false,
      boxHeight: boxHeight, //圆环的高度
      top: '-10%',
      left: '-6%',
      viewControl: {
        //3d效果可以放大、旋转等,请自己去查看官方配置
        alpha: 40, //角度
        distance: 180, //调整视角到主体的距离,类似调整zoom
        rotateSensitivity: 1, //设置为0无法旋转
        zoomSensitivity: 1, //设置为0无法缩放
        panSensitivity: 1, //设置为0无法平移
        autoRotate: true //自动旋转
      }
    },
    series: series
  };
  return option;
}
// 获取3d丙图的最高扇区的高度
function getHeight3D(series, height) {
  series.sort((a, b) => b.pieData.ID - a.pieData.ID);
  return (height * 15) / series[0].pieData.ID;
}

// 生成扇形的曲面参数方程,用于 series-surface.parametricEquation
function getParametricEquation(
  startRatio,
  endRatio,
  isSelected,
  isHovered,
  k,
  h
) {
  // 计算
  let midRatio = (startRatio + endRatio) / 2;

  let startRadian = startRatio * Math.PI * 2;
  let endRadian = endRatio * Math.PI * 2;
  let midRadian = midRatio * Math.PI * 2;

  // 如果只有一个扇形,则不实现选中效果。
  if (startRatio === 0 && endRatio === 1) {
    isSelected = false;
  }
  // 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
  k = typeof k !== 'undefined' ? k : 1 / 3;

  // 计算选中效果分别在 x 轴、y 轴方向上的位移(位移均为 0)
  // 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
  let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
  let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
  // 计算选中效果在 z 轴方向上的位移(未选中,位移均为 0)
  let offsetZ = isSelected ? 0.15 : 0;
  // 计算高亮效果的放大比例(未高亮,则比例为 1)
  let hoverRate = isHovered ? 1.05 : 1;

  // let tmp = 0;

  // 返回曲面参数方程
  return {
    u: {
      min: -Math.PI,
      max: Math.PI * 3,
      step: Math.PI / 32
    },

    v: {
      min: 0,
      max: Math.PI * 2,
      step: Math.PI / 20
    },

    x: function (u, v) {
      if (u < startRadian) {
        return (
          offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
        );
      }
      if (u > endRadian) {
        return (
          offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
        );
      }
      return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
    },
    y: function (u, v) {
      if (u < startRadian) {
        return (
          offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
        );
      }
      if (u > endRadian) {
        return (
          offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
        );
      }
      return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
    },
    z: function (u, v) {
      if (u < -Math.PI * 0.5) {
        return Math.sin(u);
      }
      if (u > Math.PI * 2.5) {
        return Math.sin(u) * h * 0.1;
      }
      return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
    }
  };
}

// function fomatFloat(num, n) {
//   let f = parseFloat(num);
//   // eslint-disable-next-line no-restricted-globals
//   if (isNaN(f)) {
//     return false;
//   }
//   // eslint-disable-next-line no-restricted-properties
//   f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); // n 幂
//   let s = f.toString();
//   let rs = s.indexOf('.');
//   // 判定如果是整数,增加小数点再补0
//   if (rs < 0) {
//     rs = s.length;
//     s += '.';
//   }
//   while (s.length <= rs + n) {
//     s += '0';
//   }
//   return s;
// }

function bindListen() {
  // 监听鼠标事件,实现饼图选中效果(单选),近似实现高亮(放大)效果。
  const that = this;
  let selectedIndex = '';
  let hoveredIndex = '';
  // 监听点击事件,实现选中效果(单选)
  myChart.on('click', (params) => {
    // 从 option.series 中读取重新渲染扇形所需的参数,将是否选中取反。
    const isSelected =
      !that.option.series[params.seriesIndex].pieStatus.selected;
    const isHovered = that.option.series[params.seriesIndex].pieStatus.hovered;
    const { k } = that.option.series[params.seriesIndex].pieStatus;
    const { startRatio } = that.option.series[params.seriesIndex].pieData;
    const { endRatio } = that.option.series[params.seriesIndex].pieData;
    // 如果之前选中过其他扇形,将其取消选中(对 option 更新)
    if (selectedIndex !== '' && selectedIndex !== params.seriesIndex) {
      that.option.series[selectedIndex].parametricEquation =
        that.getParametricEquation(
          that.option.series[selectedIndex].pieData.startRatio,
          that.option.series[selectedIndex].pieData.endRatio,
          false,
          false,
          k,
          that.option.series[selectedIndex].pieData.value
        );
      that.option.series[selectedIndex].pieStatus.selected = false;
    }
    // 对当前点击的扇形,执行选中/取消选中操作(对 option 更新)
    that.option.series[params.seriesIndex].parametricEquation =
      that.getParametricEquation(
        startRatio,
        endRatio,
        isSelected,
        isHovered,
        k,
        80
      ); // 高亮时扇形的高度
    that.option.series[params.seriesIndex].pieStatus.selected = isSelected;
    // 如果本次是选中操作,记录上次选中的扇形对应的系列号 seriesIndex
    // eslint-disable-next-line no-unused-expressions
    isSelected ? (selectedIndex = params.seriesIndex) : null;
    // 使用更新后的 option,渲染图表
    myChart.setOption(that.option);
  });
  // 监听 mouseover,近似实现高亮(放大)效果
  myChart.on('mouseover', (params) => {
    // 准备重新渲染扇形所需的参数
    let isSelected;
    let isHovered;
    let startRatio;
    let endRatio;
    let k;
    // 如果触发 mouseover 的扇形当前已高亮,则不做操作
    if (hoveredIndex === params.seriesIndex) {
      // 否则进行高亮及必要的取消高亮操作
    } else {
      // 如果当前有高亮的扇形,取消其高亮状态(对 option 更新)
      if (hoveredIndex !== '') {
        // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 false。
        isSelected = that.option.series[hoveredIndex].pieStatus.selected;
        isHovered = false;
        // eslint-disable-next-line prefer-destructuring
        startRatio = that.option.series[hoveredIndex].pieData.startRatio;
        // eslint-disable-next-line prefer-destructuring
        endRatio = that.option.series[hoveredIndex].pieData.endRatio;
        // eslint-disable-next-line prefer-destructuring
        k = that.option.series[hoveredIndex].pieStatus.k;
        // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
        that.option.series[hoveredIndex].parametricEquation =
          that.getParametricEquation(
            startRatio,
            endRatio,
            isSelected,
            isHovered,
            k,
            35
          ); // 35 为取消高亮时扇形的高度
        that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
        // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
        hoveredIndex = '';
      }
      // 如果触发 mouseover 的扇形不是透明圆环,将其高亮(对 option 更新)
      if (
        params.seriesName !== 'mouseoutSeries' &&
        params.seriesName !== 'pie2d'
      ) {
        // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
        isSelected = that.option.series[params.seriesIndex].pieStatus.selected;
        isHovered = true;
        // eslint-disable-next-line prefer-destructuring
        startRatio = that.option.series[params.seriesIndex].pieData.startRatio;
        // eslint-disable-next-line prefer-destructuring
        endRatio = that.option.series[params.seriesIndex].pieData.endRatio;
        // eslint-disable-next-line prefer-destructuring
        k = that.option.series[params.seriesIndex].pieStatus.k;
        // 对当前点击的扇形,执行高亮操作(对 option 更新)
        that.option.series[params.seriesIndex].parametricEquation =
          that.getParametricEquation(
            startRatio,
            endRatio,
            isSelected,
            isHovered,
            k,
            80
          ); // 高亮时扇形的高度
        that.option.series[params.seriesIndex].pieStatus.hovered = isHovered;
        // 记录上次高亮的扇形对应的系列号 seriesIndex
        hoveredIndex = params.seriesIndex;
      }
      // 使用更新后的 option,渲染图表
      myChart.setOption(that.option);
    }
  });
  // 修正取消高亮失败的 bug
  myChart.on('globalout', () => {
    // 准备重新渲染扇形所需的参数
    let isSelected;
    let isHovered;
    let startRatio;
    let endRatio;
    let k;
    if (hoveredIndex !== '') {
      // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
      isSelected = that.option.series[hoveredIndex].pieStatus.selected;
      isHovered = false;
      // eslint-disable-next-line prefer-destructuring
      k = that.option.series[hoveredIndex].pieStatus.k;
      // eslint-disable-next-line prefer-destructuring
      startRatio = that.option.series[hoveredIndex].pieData.startRatio;
      // eslint-disable-next-line prefer-destructuring
      endRatio = that.option.series[hoveredIndex].pieData.endRatio;
      // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
      that.option.series[hoveredIndex].parametricEquation =
        that.getParametricEquation(
          startRatio,
          endRatio,
          isSelected,
          isHovered,
          k,
          35
        ); // 取消高亮时扇形的高度
      that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
      // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
      hoveredIndex = '';
    }
    // 使用更新后的 option,渲染图表
    myChart.setOption(that.option);
  });
}

init();

// const TABLE_DATA = getData('data1');
// const a = TABLE_DATA.splice(0,1);
// const optionData =  TABLE_DATA.map(item => ({ name: item[0], value: item[1] }));
const optionData = [
  {
    name: '法院',
    value: 280
    // itemStyle: {
    //   // color: '#1c74f8cc',
    //   color: '#1C74F8',
    // },
  },
  {
    name: '国有企业',
    value: 2059
  },
  {
    name: '行政事业单位',
    value: 6733
  },
  {
    name: '集体企业',
    value: 170
  },
  {
    name: '民营企业',
    value: 630
  },
  {
    name: '金融机构',
    value: 2683
  },
  {
    name: '其他机构',
    value: 230
  }
];
const colorList = ['#3553EA', '#29CAE5', '#14CE95', '#2196A8','#3D568B','#AFDAFE','#4369F1'];
option = {};

function init() {
  const paramsList = optionData.map((item, index) => {
    return {
      ...item,
      shading: 'realistic',
      itemStyle: {
        color: colorList[index]
      }
    };
  });
  // 构建3d饼状图

  // 传入数据生成 option

  option = getPie3D(paramsList);

  console.log(option);
  // 是否需要label指引线,如果要就添加一个透明的2d饼状图并调整角度使得labelLine和3d的饼状图对齐,并再次setOption
  option.series.push({
    name: 'pie2d',
    // type: 'pie',
    labelLine: {
      length: 10,
      length2: 10
    },
    startAngle: -30, // 起始角度,支持范围[0, 360]。
    clockwise: false, // 饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
    radius: ['20%', '50%'],
    center: ['50%', '50%'],
    data: optionData,
    itemStyle: {
      opacity: 0
    }
  });
  myChart.setOption(option);
  bindListen();
}
// 生成模拟 3D 饼图的配置项
function getPie3D(pieData) {
  let series = [];
  let sumValue = 0;
  let startValue = 0;
  let endValue = 0;
  let legendData = [];
  // 为每一个饼图数据,生成一个 series-surface 配置
  for (let i = 0; i < pieData.length; i++) {
    sumValue += pieData[i].value;
    let seriesItem = {
      name:
        typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,
      type: 'surface',
      parametric: true,
      wireframe: {
        show: false
      },
      pieData: pieData[i],
      pieStatus: {
        selected: false,
        hovered: false
      }
    };

    if (typeof pieData[i].itemStyle != 'undefined') {
      let itemStyle = {};
      if (typeof pieData[i].itemStyle.color != 'undefined') {
        itemStyle.color = pieData[i].itemStyle.color;
      }
      if (typeof pieData[i].itemStyle.opacity != 'undefined') {
        itemStyle.opacity = pieData[i].itemStyle.opacity;
      }
      seriesItem.itemStyle = itemStyle;
    }
    series.push(seriesItem);
  }
  // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
  // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
  for (let i = 0; i < series.length; i++) {
    endValue = startValue + series[i].pieData.value;
    series[i].pieData.startRatio = startValue / sumValue;
    series[i].pieData.endRatio = endValue / sumValue;
    series[i].parametricEquation = getParametricEquation(
      series[i].pieData.startRatio,
      series[i].pieData.endRatio,
      false,
      false
    );
    startValue = endValue;
    legendData.push(series[i].name);
  }
  // 补充一个透明的圆环,用于支撑高亮功能的近似实现。
  series.push({
    name: 'mouseoutSeries',
    type: 'surface',
    parametric: true,
    wireframe: {
      show: false
    },
    itemStyle: {
      opacity: 0
    },
    parametricEquation: {
      u: {
        min: 0,
        max: Math.PI * 2,
        step: Math.PI / 20
      },
      v: {
        min: 0,
        max: Math.PI,
        step: Math.PI / 20
      },
      x: function (u, v) {
        return Math.sin(v) * Math.sin(u) + Math.sin(u);
      },
      y: function (u, v) {
        return Math.sin(v) * Math.cos(u) + Math.cos(u);
      },
      z: function (u, v) {
        return Math.cos(v) > 0 ? 0.1 : -0.1;
      }
    }
  });
  // 准备待返回的配置项,把准备好的 legendData、series 传入。
  const option = {
    animation: true,
    // legend: {
    //   orient: 'vertical',
    //   data: legendData,
    //   textStyle: {
    //     color: 'rgba(150,202,223)',
    //     fontSize: 12,
    //   },
    //   itemWidth: 10,
    //   itemHeight: 10,
    //   icon: 'roundRect',
    //   bottom: 'bottom',
    //   // top: '0%', // 居右显示
    // },
    legend: {
      // orient: 'vertical',
      data: legendData,
      // right:0,
      bottom:'-2%',
      width:450,
      formatter: ['{a|{name}}'].join('\n'),
      textStyle: {
        rich: {
          a: {
            width: 175, // 每个图例的宽度,具体根据字数调整
            lineHeight: 10,
            color:'#A1E2FF',
            fontSize:'16px',
          }
        }
      }
    },
    tooltip: {
      trigger: 'item',
      // backgroundColor: '#ffffff00',
      // borderColor: '#ffffff00',
      // position: ['37%', '25%'], // tooltip固定位置
      formatter: (params) => {
        if (params.seriesName !== 'mouseoutSeries') {
          return `<div>
              <p style="font-size:20px;color:#000;font-weight:bold;margin:0">${
                option.series[params.seriesIndex].pieData.value
              }</p>
                            <p style="color:#000;text-align:center;margin:0">${
                              params.seriesName
                            }</p></div>`;
        }
        return '';
      }
    },
    labelLine: {
      show: true,
      lineStyle: {
        color: '#7BC0CB'
      }
    },
    label: {
      show: true,
      position: 'outside',
      formatter: '{b} \n{c} {d}'
    },
    // backgroundColor: '#333',
    // x,y,z调整大小的
    xAxis3D: {
      min: -1,
      max: 1
    },
    yAxis3D: {
      min: -1,
      max: 1
    },
    zAxis3D: {
      min: -1,
      max: 1
    },
    grid3D: {
      show: false,
      boxHeight: 200, // 饼环的高度
      top: '-22%',
      left: '-6%',
      // boxWidth:120,
      viewControl: {
        // 3d效果可以放大、旋转等,请自己去查看官方配置
        alpha: 50, //z轴旋转角度
        beta: 60, //x轴旋转角度
        rotateSensitivity: 1, // 旋转
        zoomSensitivity: 1, // 缩放
        panSensitivity: 1, // 平移
        autoRotate: true, // 旋转
        distance: 150 // 整视角到主体的距离,类似调整zoom  饼图大小
      }
      // 后处理特效可以为画面添加高光、景深、环境光遮蔽(SSAO)、调色等效果。可以让整个画面更富有质感。
      // postEffect: {
      //   // 配置这项会出现锯齿,请自己去查看官方配置有办法解决
      //   enable: false,
      //   bloom: {
      //     enable: true,
      //     bloomIntensity: 0.1,
      //   },
      //   SSAO: {
      //     enable: true,
      //     quality: 'medium',
      //     radius: 1,
      //   },
      //   // temporalSuperSampling: {
      //   //   enable: true,
      //   // },
      // },
    },
    series
  };
  return option;
}
// 获取3d丙图的最高扇区的高度
function getHeight3D(series, height) {
  series.sort((a, b) => b.pieData.value - a.pieData.value);
  return (height * 25) / series[0].pieData.value;
}

// 生成扇形的曲面参数方程,用于 series-surface.parametricEquation
function getParametricEquation(startRatio, endRatio, isSelected, isHovered) {
  // 计算
  let midRatio = (startRatio + endRatio) / 2;

  let startRadian = startRatio * Math.PI * 2;
  let endRadian = endRatio * Math.PI * 2;
  let midRadian = midRatio * Math.PI * 2;

  // 如果只有一个扇形,则不实现选中效果。
  if (startRatio === 0 && endRatio === 1) {
    isSelected = false;
  }

  // 计算选中效果分别在 x 轴、y 轴方向上的位移(位移均为 0)
  let offsetX = 0;
  let offsetY = 0;
  // 计算选中效果在 z 轴方向上的位移(未选中,位移均为 0)
  let offsetZ = isSelected ? 0.15 : 0;
  // 计算高亮效果的放大比例(未高亮,则比例为 1)
  let hoverRate = isHovered ? 1.05 : 1;

  let tmp = 0;

  // 返回曲面参数方程
  return {
    u: {
      min: 0,
      max: Math.PI * 2,
      step: Math.PI / 100
    },

    v: {
      min: 0,
      max: Math.PI,
      step: Math.PI / 50
    },

    x: function (u, v) {
      if (midRatio - 0.5 < 0) {
        if (u < startRadian || u > midRadian + Math.PI) {
          tmp =
            u - Math.PI - midRadian < 0
              ? u + Math.PI - midRadian
              : u - Math.PI - midRadian;
          return (
            offsetX +
            ((Math.sin(startRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
        if (u > endRadian && u < midRadian + Math.PI) {
          tmp = midRadian + Math.PI - u;
          return (
            offsetX +
            ((Math.sin(endRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
      } else {
        if (u < startRadian && u > midRadian - Math.PI) {
          tmp = u + Math.PI - midRadian;
          return (
            offsetX +
            ((Math.sin(startRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
        if (u > endRadian || u < midRadian - Math.PI) {
          tmp =
            midRadian - Math.PI - u < 0
              ? midRadian + Math.PI - u
              : midRadian - Math.PI - u;
          return (
            offsetX +
            ((Math.sin(endRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
      }
      return offsetX + Math.sin(v) * Math.sin(u) * hoverRate;
    },

    y: function (u, v) {
      if (midRatio - 0.5 < 0) {
        if (u < startRadian || u > midRadian + Math.PI) {
          tmp =
            u - Math.PI - midRadian < 0
              ? u + Math.PI - midRadian
              : u - Math.PI - midRadian;
          return (
            offsetY +
            ((Math.cos(startRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
        if (u > endRadian && u < midRadian + Math.PI) {
          tmp = midRadian + Math.PI - u;
          return (
            offsetY +
            ((Math.cos(endRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
      } else {
        if (u < startRadian && u > midRadian - Math.PI) {
          tmp = u + Math.PI - midRadian;
          return (
            offsetY +
            ((Math.cos(startRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
        if (u > endRadian || u < midRadian - Math.PI) {
          tmp =
            midRadian - Math.PI - u < 0
              ? midRadian + Math.PI - u
              : midRadian - Math.PI - u;
          return (
            offsetY +
            ((Math.cos(endRadian) * tmp) /
              (Math.PI - midRadian + startRadian)) *
              hoverRate
          );
        }
      }
      return offsetY + Math.sin(v) * Math.cos(u) * hoverRate;
    },

    z: function (u, v) {
      return offsetZ + (Math.cos(v) > 0 ? 0.1 : -0.1);
    }
  };
}
// function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {
//   // 计算
//   const midRatio = (startRatio + endRatio) / 2;
//   const startRadian = startRatio * Math.PI * 2;
//   const endRadian = endRatio * Math.PI * 2;
//   const midRadian = midRatio * Math.PI * 2;
//   // 如果只有一个扇形,则不实现选中效果。
//   if (startRatio === 0 && endRatio === 1) {
//     // eslint-disable-next-line no-param-reassign
//     isSelected = false;
//   }
//   // 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
//   // eslint-disable-next-line no-param-reassign
//   k = typeof k !== 'undefined' ? k : 1 / 3;
//   // 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
//   // const offsetX = isSelected ? 0 : Math.cos(midRadian) * 0.2 ;
//   // const offsetY = isSelected ? 0 : Math.sin(midRadian) * 0.2;
//   const offsetX = isHovered ? Math.cos(midRadian) * 0.2 : Math.cos(midRadian)*0.1;
//   const offsetY = isHovered ? Math.sin(midRadian) * 0.2: Math.sin(midRadian)*0.1;
//   // 计算高亮效果的放大比例(未高亮,则比例为 1)
//   const hoverRate = isHovered ? 1.01 : 1;
//   // 返回曲面参数方程
//   return {
//     u: {
//       min: -Math.PI,
//       max: Math.PI * 3,
//       step: Math.PI / 32,
//     },
//     v: {
//       min: 0,
//       max: Math.PI * 2,
//       step: Math.PI / 20,
//     },
//     x(u, v) {
//       if (u < startRadian) {
//         return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
//       }
//       if (u > endRadian) {
//         return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
//       }
//       return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
//     },
//     y(u, v) {
//       if (u < startRadian) {
//         return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;
//       }
//       if (u > endRadian) {
//         return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;
//       }
//       return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
//     },
//     z(u, v) {
//       if (u < -Math.PI * 0.5) {
//         return Math.sin(u);
//       }
//       if (u > Math.PI * 2.5) {
//         return Math.sin(u) * h * 0.1;
//       }
//       return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
//     },
//   };
// }

function fomatFloat(num, n) {
  let f = parseFloat(num);
  // eslint-disable-next-line no-restricted-globals
  if (isNaN(f)) {
    return false;
  }
  // eslint-disable-next-line no-restricted-properties
  f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n); // n 幂
  let s = f.toString();
  let rs = s.indexOf('.');
  // 判定如果是整数,增加小数点再补0
  if (rs < 0) {
    rs = s.length;
    s += '.';
  }
  while (s.length <= rs + n) {
    s += '0';
  }
  return s;
}

function bindListen() {
  // 监听鼠标事件,实现饼图选中效果(单选),近似实现高亮(放大)效果。
  const that = this;
  let selectedIndex = '';
  let hoveredIndex = '';
  // 监听点击事件,实现选中效果(单选)
  myChart.on('click', (params) => {
    // 从 option.series 中读取重新渲染扇形所需的参数,将是否选中取反。
    const isSelected =
      !that.option.series[params.seriesIndex].pieStatus.selected;
    const isHovered = that.option.series[params.seriesIndex].pieStatus.hovered;
    const { k } = that.option.series[params.seriesIndex].pieStatus;
    const { startRatio } = that.option.series[params.seriesIndex].pieData;
    const { endRatio } = that.option.series[params.seriesIndex].pieData;
    // 如果之前选中过其他扇形,将其取消选中(对 option 更新)
    if (selectedIndex !== '' && selectedIndex !== params.seriesIndex) {
      that.option.series[selectedIndex].parametricEquation =
        that.getParametricEquation(
          that.option.series[selectedIndex].pieData.startRatio,
          that.option.series[selectedIndex].pieData.endRatio,
          false,
          false,
          k,
          that.option.series[selectedIndex].pieData.value
        );
      that.option.series[selectedIndex].pieStatus.selected = false;
    }
    // 对当前点击的扇形,执行选中/取消选中操作(对 option 更新)
    that.option.series[params.seriesIndex].parametricEquation =
      that.getParametricEquation(
        startRatio,
        endRatio,
        isSelected,
        isHovered,
        k,
        80
      ); // 高亮时扇形的高度
    that.option.series[params.seriesIndex].pieStatus.selected = isSelected;
    // 如果本次是选中操作,记录上次选中的扇形对应的系列号 seriesIndex
    // eslint-disable-next-line no-unused-expressions
    isSelected ? (selectedIndex = params.seriesIndex) : null;
    // 使用更新后的 option,渲染图表
    myChart.setOption(that.option);
  });
  // 监听 mouseover,近似实现高亮(放大)效果
  myChart.on('mouseover', (params) => {
    // 准备重新渲染扇形所需的参数
    let isSelected;
    let isHovered;
    let startRatio;
    let endRatio;
    let k;
    // 如果触发 mouseover 的扇形当前已高亮,则不做操作
    if (hoveredIndex === params.seriesIndex) {
      // 否则进行高亮及必要的取消高亮操作
    } else {
      // 如果当前有高亮的扇形,取消其高亮状态(对 option 更新)
      if (hoveredIndex !== '') {
        // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 false。
        isSelected = that.option.series[hoveredIndex].pieStatus.selected;
        isHovered = false;
        // eslint-disable-next-line prefer-destructuring
        startRatio = that.option.series[hoveredIndex].pieData.startRatio;
        // eslint-disable-next-line prefer-destructuring
        endRatio = that.option.series[hoveredIndex].pieData.endRatio;
        // eslint-disable-next-line prefer-destructuring
        k = that.option.series[hoveredIndex].pieStatus.k;
        // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
        that.option.series[hoveredIndex].parametricEquation =
          that.getParametricEquation(
            startRatio,
            endRatio,
            isSelected,
            isHovered,
            k,
            35
          ); // 35 为取消高亮时扇形的高度
        that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
        // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
        hoveredIndex = '';
      }
      // 如果触发 mouseover 的扇形不是透明圆环,将其高亮(对 option 更新)
      if (
        params.seriesName !== 'mouseoutSeries' &&
        params.seriesName !== 'pie2d'
      ) {
        // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
        isSelected = that.option.series[params.seriesIndex].pieStatus.selected;
        isHovered = true;
        // eslint-disable-next-line prefer-destructuring
        startRatio = that.option.series[params.seriesIndex].pieData.startRatio;
        // eslint-disable-next-line prefer-destructuring
        endRatio = that.option.series[params.seriesIndex].pieData.endRatio;
        // eslint-disable-next-line prefer-destructuring
        k = that.option.series[params.seriesIndex].pieStatus.k;
        // 对当前点击的扇形,执行高亮操作(对 option 更新)
        that.option.series[params.seriesIndex].parametricEquation =
          that.getParametricEquation(
            startRatio,
            endRatio,
            isSelected,
            isHovered,
            k,
            80
          ); // 高亮时扇形的高度
        that.option.series[params.seriesIndex].pieStatus.hovered = isHovered;
        // 记录上次高亮的扇形对应的系列号 seriesIndex
        hoveredIndex = params.seriesIndex;
      }
      // 使用更新后的 option,渲染图表
      myChart.setOption(that.option);
    }
  });
  // 修正取消高亮失败的 bug
  myChart.on('globalout', () => {
    // 准备重新渲染扇形所需的参数
    let isSelected;
    let isHovered;
    let startRatio;
    let endRatio;
    let k;
    if (hoveredIndex !== '') {
      // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
      isSelected = that.option.series[hoveredIndex].pieStatus.selected;
      isHovered = false;
      // eslint-disable-next-line prefer-destructuring
      k = that.option.series[hoveredIndex].pieStatus.k;
      // eslint-disable-next-line prefer-destructuring
      startRatio = that.option.series[hoveredIndex].pieData.startRatio;
      // eslint-disable-next-line prefer-destructuring
      endRatio = that.option.series[hoveredIndex].pieData.endRatio;
      // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
      that.option.series[hoveredIndex].parametricEquation =
        that.getParametricEquation(
          startRatio,
          endRatio,
          isSelected,
          isHovered,
          k,
          35
        ); // 取消高亮时扇形的高度
      that.option.series[hoveredIndex].pieStatus.hovered = isHovered;
      // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
      hoveredIndex = '';
    }
    // 使用更新后的 option,渲染图表
    myChart.setOption(that.option);
  });
}

init();

单元格点击变色


```javascript
var $lasttd; //上一个单元格变是
var lastcolor; //上一次颜色变量
$('.x-table td').click(function() {if($lasttd){$lasttd.css('background', lastcolor);}//离开后原单元格恢复原色
lastcolor = $(this).css('background-color');if (!lastcolor)lastcolor =$(this).css('background'); 
//保存原始颜色
$(this).css('background','red');
//设置当前单元格为红色
$lasttd = $(this): //保存上一个单元格
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿烂人丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值