这次实践了Highcharts的双饼图,确实比普通饼图复杂多了,关键相关数据 多不能继续用简单基本数据类型Map,list了,单独建了个VO存放要用到的数据,不多说,贴代码!
JS:
/**查看机器占比(按产品线) 2015/8*/
function loadMachineRate(){
var chart;
$(document).ready(function(){
chart = new Highcharts.Chart({
//常规图表选项设置
chart: {
renderTo: 'machineRate', //在哪个区域呈现,对应HTML中的一个元素ID
plotBackgroundColor: null, //绘图区的背景颜色
plotBorderWidth: null, //绘图区边框宽度
plotShadow: false //绘图区是否显示阴影
},
//图表的主标题
title: {
text: '按产品线统计机器占比'
},
yAxis: {
title: {
text: 'Total percent market share'
}
},
//当鼠标经过时的提示设置
tooltip: {
formatter: function() {
return this.point.name +': '+ '<b>'+Highcharts.numberFormat(this.percentage, 2) +'% </b><br/>总量: '+
'<b>'+ Highcharts.numberFormat(this.y, 0, ',') +' 台</b>';
}
},
//每种图表类型属性设置
plotOptions: {
pie: {
shadow: false,
center: ['50%', '50%']
}
},
//图表要展现的数据
series: [{
name: 'productLine',
size: '60%',
type:'pie',
dataLabels: {
color: 'white',
distance: -30
}
}, {
name: 'machineStatus',
type:'pie',
size: '80%',
innerSize: '60%',
dataLabels: {
}
}]
});
});
$.ajax({
type : "GET",
/*url : "machine/getStaticMachineRateByProductLine",*/
url : "machine/getMachineRateVOByProductline",
success : function(data){
var allMachineCount = 0;//所有机器总数
for(i in data){
allMachineCount += data[i].allMachine;
}
console.log("所有机器"+allMachineCount);
var colors = Highcharts.getOptions().colors,
categories = ['网页', '下载', '点播', '视频'],
data = [{
y: data[0].allMachine,
color: colors[0],
drilldown: {
name: '机器状态',
categories: ['网页投产未使用', '网页投产使用', '网页投产无IP', '网页待下架','网页上架完毕','网页故障','网页下架中'],
data: [data[0].freeMachineCount,data[0].workMachineCount,data[0].noIp,data[0].waitShelfCount,data[0].onShelfCount,data[0].bugCount,data[0].offShelfCount],
}
}, {
y: data[1].allMachine,
color: colors[1],
drilldown: {
name: '机器状态',
categories: ['下载投产未使用', '下载投产使用', '下载投产无IP', '下载待下架','下载上架完毕','下载故障','下载下架中'],
data: [data[1].freeMachineCount,data[1].workMachineCount,data[1].noIp,data[1].waitShelfCount,data[1].onShelfCount,data[1].bugCount,data[1].offShelfCount],
}
}, {
y: data[2].allMachine,
color: colors[2],
drilldown: {
name: '机器状态',
categories: ['点播投产未使用', '点播投产使用', '点播投产无IP', '点播待下架','点播上架完毕','点播故障','点播下架中'],
data: [data[2].freeMachineCount,data[2].workMachineCount,data[2].noIp,data[2].waitShelfCount,data[2].onShelfCount,data[2].bugCount,data[2].offShelfCount],
}
}, {
y: data[3].allMachine,
color: colors[3],
drilldown: {
name: '机器状态',
categories: ['视频投产未使用', '视频投产使用', '视频投产无IP', '视频待下架','视频上架完毕','视频故障','视频下架中'],
data: [data[3].freeMachineCount,data[3].workMachineCount,data[3].noIp,data[3].waitShelfCount,data[3].onShelfCount, data[3].bugCount,data[3].offShelfCount],
}
}],
productlineData = [],
statusData = [],
i,
j,
dataLen = data.length,
drillDataLen,
brightness;
// Build the data arrays
for (i = 0; i < dataLen; i += 1) {
// add productline data
productlineData.push({
name: categories[i],
y: data[i].y,
color: data[i].color
});
// add status data
drillDataLen = data[i].drilldown.data.length;
for (j = 0; j < drillDataLen; j += 1) {
brightness = 0.22 - (j / drillDataLen)/4;
statusData.push({
name: data[i].drilldown.categories[j],
y: data[i].drilldown.data[j],
color: Highcharts.Color(data[i].color).brighten(brightness).get()
});
}
}
console.log(productlineData);
console.log(statusData);
chart.series[0].setData(productlineData);
chart.series[1].setData(statusData);
},
error : function(e){
/*alert(e);*/
}
});
}
Controller:
/**
* 获取产品线下不同机器状态的机器数量
*/
@RequestMapping("/getMachineRateVOByProductline")
@ResponseBody
public List<MachineRateVO> getMachineRateVOByProductline(){
List<MachineRateVO> machineRateVOs = platformMachineService.getMachineRateVOByProductline();
return machineRateVOs;
}
Service:
/**
* 获取产品线下不同机器状态的机器数量
*/
@Override
public List<MachineRateVO> getMachineRateVOByProductline() {
List<MachineRateVO> machineRateVOs = new ArrayList<MachineRateVO>();
//根据产品线统计机器占比(饼图)
List<Map<String, Integer>> productlineMaps = this.platformMachineMapper.getStaticMachineRateByProductLine();
//循环每一条产品线
for (Map<String, Integer> productlineMap : productlineMaps) {
Iterator it = productlineMap.entrySet().iterator();
while(it.hasNext()){
Map.Entry entry = (Map.Entry) it.next();
Object key = entry.getKey();
Object val = entry.getValue();
if (key.toString().equals("businessType")) {
List<com.dnion.platform.dao.mybatis.entity.PlatformMachine> platformMachines = this.platformMachineMapper.getPlatformMachinesByProductline(val.toString());
MachineRateVO machineRateVO = wrapMachineRateVO(val.toString(),platformMachines);
machineRateVOs.add(machineRateVO);
}
}
}
return machineRateVOs;
}
Method:
/**
* 封装platformMachine为MachineRateVO
*/
@SuppressWarnings("null")
private MachineRateVO wrapMachineRateVO(String businessType,List<com.dnion.platform.dao.mybatis.entity.PlatformMachine> platformMachines) {
int waitShelfCount = 0;//待下架
int offShelfCount = 0;//下架中
int onShelfCount = 0;//上架完毕
int bugCount = 0;//故障
int operationCount = 0;//投产
int freeMachineCount = 0;//未使用
int workMachineCount = 0;//使用
int noIp = 0;//无ip
MachineRateVO machineRateVO = new MachineRateVO();
for(com.dnion.platform.dao.mybatis.entity.PlatformMachine platformMachine : platformMachines){
if (platformMachine.getMcRunStatus().equals("OPERATION")) {//投产
operationCount += 1;
List<PlatformMachineIp> platformMachineIps = platformMachine.getPlatformMachineIps();
if (platformMachineIps.size() != 0) { //有ip
Set<Integer> mcIpStatus = new HashSet<Integer>();
for(PlatformMachineIp platformMachineIp : platformMachineIps){
mcIpStatus.add((int)platformMachineIp.getMcIpStatus());
}
if (mcIpStatus.contains(5)) {//有空闲ip 则为空闲机器
freeMachineCount += 1;
}else {
workMachineCount += 1;
}
}else {//无ip
noIp += 1;
}
}else if (platformMachine.getMcRunStatus().equals("OFFSHELF")) {
offShelfCount += 1;
}else if (platformMachine.getMcRunStatus().equals("ONSHELF")) {
onShelfCount += 1;
}else if (platformMachine.getMcRunStatus().equals("BUG")) {
bugCount += 1;
}else if (platformMachine.getMcRunStatus().equals("WAITSHELF")) {
waitShelfCount += 1;
}
}
machineRateVO.setWaitShelfCount(waitShelfCount);
machineRateVO.setOffShelfCount(offShelfCount);
machineRateVO.setOnShelfCount(onShelfCount);
machineRateVO.setBugCount(bugCount);
machineRateVO.setOperationCount(operationCount);
machineRateVO.setFreeMachineCount(freeMachineCount);
machineRateVO.setWorkMachineCount(workMachineCount);
machineRateVO.setBusinessType(businessType);
machineRateVO.setNoIp(noIp);
machineRateVO.setAllMachine(platformMachines.size());
return machineRateVO;
}
VO:
/**
* 产品线机器占比页面视图
*/
public class MachineRateVO {
/** 主要元素 下面的数量都是对应于该产品线 */
private String businessType;//产品线类型 主要元素 下面的数量都是对应于该产品线
private Integer allMachine;//产品线下的所有机器
private Integer waitShelfCount;//待下架机器数量
private Integer offShelfCount;//下架中机器数量
private Integer onShelfCount;//上架完毕机器数量
private Integer bugCount;//故障机器数量
private Integer operationCount;//投产机器数量
//freeMachineCount+workMachineCount=operationCount
private Integer freeMachineCount;//未使用机器数量
private Integer workMachineCount;//使用的机器数量
private Integer noIp;//投产但无ip
public MachineRateVO(){
}
getter and setter...
}
基本上就是以上代码了,下面是效果图: