起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10282|回复: 9

[分享] 使用echarts报表转换显示数据库中已有数据

  [复制链接]

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-11-14 16:10:35 | 显示全部楼层 |阅读模式
首先看展示效果:
利用echarts的直方堆积图展示某港口车辆入港次数(按日期展示)

111.jpg

总体思路如下:
1、  让用户选择统计的日期区间和车辆牌号,将这两个参数传回java后台
2、  利用sql的pivot功能将基础数据转换为符合echart要求的结果集

3、  将结果集返回前台,配置echarts的option参数,启动渲染图表。

评分

参与人数 2威望 +30 收起 理由
不羁的风 + 10 赞一个!
wgs7909 + 20 神马都是浮云

查看全部评分

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-11-14 16:31:08 | 显示全部楼层
1、        让用户选择统计的日期区间和车辆牌号,将这两个参数传回java后台,返回后将结果集加载到普通的数据组件中

  1.                 var tempCarNumData = this.comp("tempData");
  2.                 var carNums = tempCarNumData.val("carNums").split(",");

  3.                 var options = {};
  4.                 var optionData = this.comp("optionData");
  5.                 var param = new biz.Request.ActionParam();
  6.                 var list = new biz.Request.ListParam();
  7.                
  8.                 //拿到用户指定的车牌号
  9.                 carNums.forEach(function(obj) {
  10.                         list.add(obj);
  11.                 });
  12.                 // 拿到用户指定的日期
  13.                 var dateList = new biz.Request.ListParam();
  14.                 var startDate = new Date(this.comp("input1").val());
  15.                 var endDate = new Date(this.comp("input2").val());
  16.                 // 计算两个日期的相关天数
  17.                 var dayNum = justep.Date.diff(startDate, endDate, 'd');

  18.                 for (i = 0; i <= dayNum; i++) {
  19.                         dateList.add(justep.Date.toString(startDate, "yyyy-MM-dd"));
  20.                         startDate = justep.Date.decrease(startDate, -1, 'd');
  21.                 }
  22.                
  23.                 //准备向后台传参,执行查询
  24.                 param.setList('carNums', list);
  25.                 param.setList('dataList', dateList);
  26.                 param.setString('flag', this.flag);
  27.                 options.contentType = 'application/json';
  28.                 options.dataType = "json";
  29.                 options.parameters = param;
  30.                 options.context = this.getContext();
  31.                 options.action = "demoAction";
  32.                 options.callback = function(data) {
  33.                
  34.                 //返回符合echarts要求的结果集
  35.                         if (data.state) {
  36.                                 // 成功
  37.                                 optionData.loadData(data.response, false);
  38.                                 optionData.first();
  39.                         } else {
  40.                                 // 失败
  41.                                 debugger;
  42.                                 // Request.errorMessage(resultData, "执行失败!", null, null);
  43.                         }
  44.                 };

  45.                 biz.Request.sendBizRequest(options)
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-11-14 16:32:46 | 显示全部楼层
2、后台接收到前台传过来的参数后,利用SQL的pivot功能,将基础数据进行统计转换成符合echarts要求的数据形式


  1.         static final String model = "/zhongliang/demo/data";

  2.         public static Table demo(List<String> carNums, List<String> dataList, String flag) throws Exception {
  3.                 StringBuffer carNumsSb = new StringBuffer(), dateListSb = new StringBuffer();
  4.                 // 构造参数List,SQL中的参数是按顺序匹配的
  5.                 for (int i = 0; i < carNums.size(); i++) {
  6.                         carNumsSb.append("'").append(carNums.get(i)).append("',");
  7.                 }
  8.                 carNumsSb.append("''");
  9.                 for (String date : dataList) {
  10.                         dateListSb.append("'").append(date).append("',");
  11.                 }
  12.                 dateListSb.append("''");
  13.                 String sb = "";
  14.                 // 构造SQL语句
  15.                 if (flag.equals("1")) // 判断使用哪个SQL语句,flag=1,查询出港次数
  16.                         sb = "SELECT * FROM(SELECT DPTADMIN.DT_CAR_OUT.CAR_NUM AS CAR_NUM, TO_CHAR (DPTADMIN.DT_CAR_OUT.TIME_G,'YYYY-MM-DD') AS CARDATE FROM DPTADMIN.DT_CAR_OUT "
  17.                                         + "ORDER BY cardate) PIVOT (count(*) FOR CARDATE IN (" + dateListSb + ")) where car_num in(" + carNumsSb + ") ORDER BY CAR_NUM";
  18.                 else
  19.                         // 查询重量
  20.                         sb = "SELECT * FROM(SELECT DPTADMIN.DT_CAR_OUT.CAR_NUM AS CAR_NUM, TO_CHAR (DPTADMIN.DT_CAR_OUT.TIME_G,'YYYY-MM-DD') AS CARDATE, DPTADMIN.DT_CAR_OUT.GWEIGHT AS GWEIGHT "
  21.                                         + "FROM DPTADMIN.DT_CAR_OUT ORDER BY cardate) " + "PIVOT (sum(GWEIGHT) FOR CARDATE IN (" + dateListSb + ")) where car_num in(" + carNumsSb + ") ORDER BY CAR_NUM";

  22.                
  23.                 //原始表格数据格式
  24.                
  25.                 //车牌号                载重量                入港日期
  26.                 //车牌号2        重量1                日期1
  27.                 //车牌号2        重量2                日期2
  28.                 //车牌1                重量3                日期2
  29.                
  30.                 //转换之后的数据格式
  31.                 //车牌号                日期1        日期2        日期3
  32.                 //车牌1                1                2                0
  33.                 //车牌2                0                1                0
  34.                
  35.                 Map<String, String> sql = new HashMap<String, String>();
  36.                 sql.put(SQL.DEFAULT_DB_NAME, sb);

  37.                 // 执行SQL并传入参数
  38.                 Table table = SQL.select(sql, null, model);

  39.                 return table;
  40.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-11-14 16:34:07 | 显示全部楼层
3、汇总统计数据返回前台后,配置echarts需要的数据项
        Model.prototype.button1Click = function(event) {
                var optionData = this.comp("optionData");
                var tempData = this.comp("tempData");// gridSelect1
                var gridSelect1 = this.comp("gridSelect1");
               
                this.flag = "1";
               
                //按照用户的选择去加载echarts需要的结果数据集
                optionData.refreshData();
               
               
                //此时结果集已经加载的optionData中了,开始配置echart渲染的参数
               
                //配置数据系列名称
                var carNums = justep.Util.isString(tempData.val("carNums")) ? tempData.val("carNums").split(",") : "";


                //配置X周的日期序列
                var startDate = new Date(this.comp("input1").val());
                var endDate = new Date(this.comp("input2").val());
                // 计算两个日期的相关天数
                var dayNum = justep.Date.diff(startDate, endDate, 'd');

                var dateArr = new Array();
                var colArr = new Array();

                for (i = 0; i <= dayNum; i++) {
                        dateArr.push(justep.Date.toString(startDate, "yyyy-MM-dd"));
                        colArr.push("'" + justep.Date.toString(startDate, "yyyy-MM-dd") + "'");
                        startDate = justep.Date.decrease(startDate, -1, 'd');

                }
               
                //配置绘图区的数据
                var arr = new Array();

                optionData.eachByPeek(function(obj) {
                        var colName = "";
                        var data = new Array();
                        for (i in colArr) {
                                data[i] = parseInt(obj.row.val(colArr[i]));
                        }
                        arr.push({
                                name : obj.row.val("CAR_NUM"),
                                type : 'bar',
                                stack : '总量',
                                areaStyle : {
                                        normal : {}
                                },
                                data : data
                        });
                });

                debugger;

                option = {
                        title : {
                                text : '车辆入港次数堆积图'
                        },
                        tooltip : {
                                trigger : 'axis'
                        },
                        legend : {
                                data : carNums
                        },
                        toolbox : {
                                feature : {
                                        saveAsImage : {}
                                }
                        },
                        grid : {
                                left : '3%',
                                right : '4%',
                                bottom : '3%',
                                containLabel : true
                        },
                        xAxis : [ {
                                type : 'category',
                                boundaryGap : false,
                                data : dateArr
                        } ],
                        yAxis : [ {
                                type : 'value'
                        } ],
                        series : arr
                };
               
                        // 使用刚指定的配置项和数据在div元素上开始渲染图表
                var myChart = echarts.init(this.getElementByXid("div1"));
                myChart.setOption(option);

        };
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-11-14 16:38:22 | 显示全部楼层
4、优化:为了减少耦合程度,汇总统计结果返回来后,让echarts只依赖一个数据组件

重写了一下结果集的加载代码:

  1.         Model.prototype.button1Click = function(event) {
  2.                 var optionData = this.comp("optionData");
  3.                 var tempData = this.comp("tempData");// gridSelect1
  4.                 var gridSelect1 = this.comp("gridSelect1");
  5.                 this.flag = "1";
  6.                 optionData.refreshData();
  7.                 var carNums = []// justep.Util.isString(tempData.val("carNums")) ?
  8.                 // tempData.val("carNums").split(",") : "";

  9.                 var startDate = new Date(this.comp("input1").val());
  10.                 var endDate = new Date(this.comp("input2").val());
  11.                 // 计算两个日期的相关天数
  12.                 var dayNum = justep.Date.diff(startDate, endDate, 'd');

  13.                 var dateArr = new Array();
  14.                 var colArr = new Array();

  15.                 // for (i = 0; i <= dayNum; i++) {
  16.                 // dateArr.push(justep.Date.toString(startDate, "yyyy-MM-dd"));
  17.                 // colArr.push("'" + justep.Date.toString(startDate, "yyyy-MM-dd") +
  18.                 // "'");
  19.                 // startDate = justep.Date.decrease(startDate, -1, 'd');
  20.                 //
  21.                 // }
  22.                 alias = optionData.userdata.relationAlias.split(',');
  23.                 for (i = 1; i < alias.length; i++) {
  24.                         dateArr.push(alias[i].replace(new RegExp(/(')/g), ""));
  25.                         colArr.push(alias[i]);
  26.                 }
  27.                 var arr = new Array();

  28.                 optionData.eachByPeek(function(obj) {
  29.                         var colName = "";
  30.                         carNums.push(obj.row.val("CAR_NUM"));
  31.                         var data = new Array();
  32.                         for (i in colArr) {
  33.                                 data[i] = parseInt(obj.row.val(colArr[i]));
  34.                         }
  35.                         arr.push({
  36.                                 name : obj.row.val("CAR_NUM"),
  37.                                 type : 'bar',
  38.                                 stack : '总量',
  39.                                 areaStyle : {
  40.                                         normal : {}
  41.                                 },
  42.                                 data : data
  43.                         });
  44.                 });

  45.                 option = {
  46.                         title : {
  47.                                 text : '车辆入港次数堆积图'
  48.                         },
  49.                         tooltip : {
  50.                                 trigger : 'axis'
  51.                         },
  52.                         legend : {
  53.                                 data : carNums
  54.                         },
  55.                         toolbox : {
  56.                                 feature : {
  57.                                         saveAsImage : {}
  58.                                 }
  59.                         },
  60.                         grid : {
  61.                                 left : '3%',
  62.                                 right : '4%',
  63.                                 bottom : '3%',
  64.                                 containLabel : true
  65.                         },
  66.                         xAxis : [ {
  67.                                 type : 'category',
  68.                                 boundaryGap : false,
  69.                                 data : dateArr
  70.                         } ],
  71.                         yAxis : [ {
  72.                                 type : 'value'
  73.                         } ],
  74.                         series : arr
  75.                 };
  76.                 var myChart = echarts.init(this.getElementByXid("div1"));
  77.                 // 使用刚指定的配置项和数据显示图表。
  78.                 myChart.setOption(option);

  79.         };
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-11-14 17:08:12 | 显示全部楼层
相关附件见链接

biz.zip

9.76 KB, 下载次数: 9

售价: 5 金币  [记录]

UI2.zip

164.29 KB, 下载次数: 15

售价: 5 金币  [记录]

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

1014

主题

4373

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10985
QQ
发表于 2016-11-14 20:13:37 | 显示全部楼层
来支持
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
QQ
发表于 2016-12-3 13:01:47 | 显示全部楼层
想下载附件没金币啊
回复 支持 反对

使用道具 举报

17

主题

38

帖子

120

积分

初级会员

Rank: 2

积分
120
QQ
发表于 2017-11-16 18:27:16 | 显示全部楼层
做的这个报表是应用了echarts的插件吗?
回复 支持 反对

使用道具 举报

25

主题

192

帖子

715

积分

高级会员

Rank: 4

积分
715
QQ
发表于 2020-7-31 19:50:26 | 显示全部楼层
高手高手高高手,有启发
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-25 21:46 , Processed in 0.083372 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表