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): //保存上一个单元格