医药采购系统平台第11天01:Jfreechart制作图表的开发、使用和测试&jfreechart柱形图的示例演示&按区域分类统计采购金额的实现

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!


一 Jfreechart制作图表概述

1 Jfreechart概述

Jfreechart对中文支持的不太好!并且,字体也不太清楚

2 Jfreechart下载

3 Jfreechart体验

4 本系统柱状图的示例

监管单位可以统计出哪个地区的采购金额最高:

5 本系统饼图的示例

统计百分比的占用情况:

6 本系统折线图的示例

药品金额走势图:

二 jfreechart柱形图的开发和测试

1将jfreechart的jar加入本工程

jcommon-1.0.23.jar :是jfreechart公用的类库,

jfreechart-1.0.19.jar: 是jfreechart的图表类库!

把这两个文件加入到本工程中即可

因为本工程是一个Maven工程,因此还需要在工程的pom.xml中添加maven的3坐标,如下:

坐标配置好后,再保存后,在联网的情况下会自动把这两个jar包下载到maven的仓库repositories中,如下图:

2 需求

是本系统所要实现的,如下:

3 使用jfreechart生成柱状图的编码

3.1 开发步骤

第1步:使用工具类构造一个CategoryDataset,往该dataset中填充统计数据!

dataset中填充统计数据的方式有两种:

第1种方式:定义一个二维数组的数据格式来作为填充的数据。

参考如下方法:

该方式对应需求中的图如下:

第2种方式:也可以通过jfreechart的API来进行数据的填充常用,也是本系统中所使用的方式),

参考如下方法:

其中:第一个参数表示统计的数值,第二个参数表示统计的指标名称,第三个参数表示统计分类!

在下节的“使用jfreechart的servlet方式输出图形”的内容中会使用该方法!该方式也是本系统所使用的方式。

该方式对应需求中的图如下:

当然,数组中的数据应该是从数据库中来获取。这里只是一个测试demo

这两种方式都是通过dataset来构造数据,效果是一样的!第二种方式比较常用,因为更直观!

实际的开发中,正是通过第二种方式来从数据库中获取方式,再通过for循环来填充数据(参考下节的内容)!

第2步:使用ChartFactory.createBarChart3D()方法来生成柱状图形

第3步:输出图形

图形的输出方式有两种:

1) 通过response方式来输出(也是下节的代码测试所使用的方式),如下:

该方式简便!

2) 在session中生成图形,然后在通过jfreechart的servlet来显示图形(常用的方式,也是本系统所采用的方式

在下节中“通过jfreechart的servlet方式来输出图形”中会讲到

3.2 代码测试

先登录系统,然后在浏览器中输入:http://localhost/yycgproject/jfreechartest/chart1.action

会显示如图:

乱码问题在下节中会解决!因为Jfreechart对中文支持的不太好!并且,字体也不太清楚!

其实,这部分即使注释掉也可以在浏览器中正确的输出,如下代码:

其实,总共就3步,注释掉的代码只是用来对输出的图形进行优化而已!

4 通过jfreechart的servlet方式来输出图形(重点)

在上面“输出图形”一节中,使用的是第一种方式来输出的图形。

下面需要使用第2方式输出图形,并且要结合dataset的第2种构造方式来填充数据!

这也是本系统实现的方式!

第1步:在web.xml中配置jfreechart的servlet,如下:

第2步:将图形放在sesion,得到filename。

参考JfreeChart.java类中的如下方法:

在该方法中使用的是第二种方式来构造的dataset,参考源码!

然后,在该方法中使用如下的方式来将图形存入session中:

第3步:返回chart2.jsp页面,

第4步:在chart2.jsp页面中通过jfreechart的servlet来生成图形。

chart2.jsp页面参考项目中的源码,该页面最终呈现的效果是:

查询条件和图形可以在浏览器中共存!

其中的关键代码如下:

filename参数是不能变的,这是该方式所必需有的参数!

第5步,测试:

在本系统登录,如下;

在地址栏中访问url:http://localhost/yycgproject/jfreecharttest/chart2.action,

最终的结果如下图:

可以改进的地方:在采购时间的条件中可以选择在某一个时间段中的药品金额的汇总

5 jfreechart柱状图二

该柱状图与上面的柱状图的区别,就是有一个图例:红的表示内科用药,蓝色表示外科用药。

代码实现其实跟上面的开发步骤类似,步骤如下:

第1步:构造一个CategoryDataset,往该dataset中填充统计数据!

也有两种方式:

第一种方式:定义一个二维数组的数据格式来作为填充的数据,如下:

第二种方式:也可以通过jfreechart的API来进行数据的填充,如下:


三 按区域分类统计采购金额的实现

1 需求

注意:该功能必须以卫生局身份登录系统,因为该功能就是为卫生局而设计的!

根据页面中输入框中的查询条件,按区域来统计采购金额。

最终呈现的原型效果图如下:

2 dao

根据查询条件,统计出来的结果数据填充到jfreechart的dataset中

2.1 编写sql

按区域统计采购金额。因为根据数据库中查询出来的结果只有两个镇,所以柱状图只有两个镇,如果有3个镇,那么柱状图就显示3个镇,总之,

我们的目标是:查询出交易明细列表中的不同的区域中每个区域的采购金额!

最后,把统计出来的结果数据填充到jfreechart的dataset中

Sql语句如下:sql语句是可以优化的!

--查询出卫生室所属区域(所属镇)的名称

select yybusiness.areaname, sum(yybusiness.cgje) cgje
  from (select yybusiness.*,
               (select bss_sys_area.areaname
                  from bss_sys_area
                 where yybusiness.parentid = bss_sys_area.areaid) areaname
          from (select yybusiness.*,
                       (select bss_sys_area.parentid
                          from bss_sys_area
                         where areaid = yybusiness.useryydq) parentid
                  from (select yybusiness.useryyid,
                               (select dq
                                  from useryy
                                 where id = yybusiness.useryyid) useryydq,
                               yybusiness.cgje
                          from (
                                
                                select useryy.id useryyid,
                                        useryy.mc useryymc,
                                        yycgd.bm yycgdbm,
                                        yycgd.id yycgdid,
                                        usergys.id usergysid,
                                        usergys.mc usergysmc,
                                        yycgdmx.ypxxid,
                                        ypxx.id,
                                        ypxx.bm,
                                        ypxx.mc,
                                        ypxx.jx,
                                        ypxx.gg,
                                        ypxx.zhxs,
                                        ypxx.scqymc,
                                        ypxx.spmc,
                                        
                                        ypxx.jyzt,
                                        
                                        (select info
                                           from dictinfo
                                          where ypxx.jyzt = dictcode
                                            and typecode = '003') jyztmc,
                                        (select info
                                           from dictinfo
                                          where typecode = '011'
                                            and dictcode = yycgdmx.cgzt) cgztmc,
                                        yycgdmx.cgl,
                                        yycgdmx.cgje,
                                        yycgdmx.rkl,
                                        yycgdmx.rkje,
                                        yycgdmx.thl,
                                        yycgdmx.thje,
                                        yycgdmx.jsl,
                                        yycgdmx.jsje
                                
                                  from yybusiness2018 yycgdmx,
                                        yycgd2018 yycgd,
                                        useryy,
                                        usergys,
                                        ypxx
                                 where yycgdmx.yycgdid = yycgd.id
                                   and yycgd.useryyid = useryy.id
                                   and yycgdmx.usergysid = usergys.id
                                   and yycgdmx.ypxxid = ypxx.id) yybusiness) yybusiness) yybusiness) yybusiness
 group by areaname

该语句最终在数据库中查询出来的结果集如下:

2.2 自定义mapper映射文件

在YybusinessMapperCustom.xml中添加如下:

同时要在输出映射resultType所对应的扩展类YycgdmxCustom中添加areaname属性,如下:

2.3 自定义mapper接口

因为需要的仅仅是展示的图形,不需要分页,在YybusinessMapperCustom接口中添加一个方法即可:

3 service

因为需要的仅仅是展示的图形,不需要分页,在BusinessService接口中添加如下方法:

BusinessServiceImpl实现类中添加如下:

4 action

参考jfreechart的servlet方式来输出图形一节中JFreechart.java中的第2个方法中的代码!

在TjAction中添加如下方法:

5 groupbyarea.jsp页面

groupbyarea.jsp页面参考“jfreechart的servlet方式来输出图形”一节中的chart2.jsp页面。

页面所在目录如下:

页面中需要注意的地方:

第1个:添加查询事件,如下:

第2个:统计的url,如下:

6 测试

在menu.json中添加链接,如下:

必须以卫生局身份登录系统,因为该功能就是为卫生局而设计的,如下:

显示结果如下:

该页面只是显示了有采购金额的镇,而没有采购金额或者采购金额为0的镇没有显示,所以很丑陋啊,可以进行下面的优化!

7 优化

针对生成的柱状图中没有采购金额或者采购金额为0的镇,该如何在图中显示呢?

Sql语句如下:其他的自定义mapper接口和mapper映射文件自己实现.

select areainfo.areaname ,nvl(yybusiness.cgje,0) cgje  from (

select bss_sys_area.areaname,0 cgje from  bss_sys_area where bss_sys_area.arealevel='2' 

) areainfo left join (

select yybusiness.areaname, sum(yybusiness.cgje) cgje

  from (select yybusiness.*,

               (select bss_sys_area.areaname

                  from bss_sys_area

                 where yybusiness.parentid = bss_sys_area.areaid) areaname

          from (select yybusiness.*,

                       (select bss_sys_area.parentid

                          from bss_sys_area

                         where areaid = yybusiness.useryydq) parentid

                  from (select yybusiness.useryyid,

                               (select dq

                                  from useryy

                                 where id = yybusiness.useryyid) useryydq,

                               yybusiness.cgje

                          from (

                                

                                select useryy.id useryyid,

                                        useryy.mc useryymc,

                                        yycgd.bm yycgdbm,

                                        yycgd.id yycgdid,

                                        usergys.id usergysid,

                                        usergys.mc usergysmc,

                                        yycgdmx.ypxxid,

                                        ypxx.id,

                                        ypxx.bm,

                                        ypxx.mc,

                                        ypxx.jx,

                                        ypxx.gg,

                                        ypxx.zhxs,

                                        ypxx.scqymc,

                                        ypxx.spmc,

                                        

                                        ypxx.jyzt,

                                        

                                        (select info

                                           from dictinfo

                                          where ypxx.jyzt = dictcode

                                            and typecode = '003') jyztmc,

                                        (select info

                                           from dictinfo

                                          where typecode = '011'

                                            and dictcode = yycgdmx.cgzt) cgztmc,

                                        yycgdmx.cgl,

                                        yycgdmx.cgje,

                                        yycgdmx.rkl,

                                        yycgdmx.rkje,

                                        yycgdmx.thl,

                                        yycgdmx.thje,

                                        yycgdmx.jsl,

                                        yycgdmx.jsje

                                

                                  from yybusiness2018 yycgdmx,

                                        yycgd2018 yycgd,

                                        useryy,

                                        usergys,

                                        ypxx

                                 where yycgdmx.yycgdid = yycgd.id

                                   and yycgd.useryyid = useryy.id

                                   and yycgdmx.usergysid = usergys.id

                                   and yycgdmx.ypxxid = ypxx.id) yybusiness) yybusiness) yybusiness) yybusiness

 group by yybusiness.areaname

 

) yybusiness on yybusiness.areaname = areainfo.areaname

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

elastic_solr

可以对需求进行二次开发

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

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

打赏作者

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

抵扣说明:

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

余额充值