报表引擎的使用

技术选型

我们公司初步定义了一套完整的报表引擎,从开源软件到商用软件都进行综合的比较。先说开源部分可以说是惨不忍睹,基本上没有一个完整的方案都是各个工具化的组件很难满足系统使用。商用的比较突出的两个分别是帆软FineReportRDP报表引擎,其中帆软功能突出且非常完整但是价格较高,RDP功能相对完整但是不够强大并且有BUG不过价格很低。就目前的情况来看我们还是首选帆软,无论功能范围还是技术支持都非常不错。不过也不是完全定死,后续小型项目也可以使用RDP进行开发,两者很像没有什么学习成本。

项目集成方案

官方提供了两种项目集成方案,第一是通过SDK注入到项目代码之中作为功能模块使用,二是独立外挂集成。我们最终选择的独立外挂集成方案。原因有二:第一是独立可以跨项目共用一套授权节约了服务器资源与成本;第二是当出现性能瓶颈时可以通过集群的方案将服务器分散到集群之中使得后续的性能瓶颈不会至于太低。

权限控制上比较麻烦,官方提供了CAS和OAuth两种方案,但是完整的流程我还没有上手测试所以没有去搞😂。不过有一个简单方案,通过参数传递的方式将用户ID传递到模板然后在SQL之中使用ID进行关联数据权限的查询(我们的ID是UUID,不具备特征和表面连续性,基本上可以了😉)。在安全性上虽然不能说是绝对安全但是面对常规系统使用以及足够了(PS:参数可以隐藏传递)。并且我们项目最常用的是查询、导出功能什么插入、更新基本上用不掉所以目前来讲够用了。

系统部署方案

官方提供了多种部署方案,我们首选是Docker独立部署。主要原因是我们基于K8S体系进行服务器管理所以只能以Docker方式进行部署,同时官方没有提供Docker镜像所以只有自建,Dockerfile如下:

FROM anapsix/alpine-java:8_server-jre_unlimited
​
RUN apk add fontconfig tzdata && rm -rf /var/cache/apk/*
​
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
​
RUN echo "Asia/Shanghai" > /etc/timezone
​
RUN mkdir -p /finereport
​
WORKDIR /finereport
​
ADD ./ /finereport
#这里是的simsun.ttf是宋体的字体文件,没有的化导出转换图片会乱码
ADD ./simsun.ttf /usr/share/fonts/simsun.ttf 
​
RUN cp -r /opt/jdk/jre/* /finereport/jre/
​
RUN ulimit -c unlimited
​
RUN chmod -R 777 /usr/share/fonts/*
​
CMD sh /finereport/bin/catalina.sh run

一定注意中文语言环境、字体和时区问题,而且基础包尽量采用alpine,如果使用centosubantu包会非常巨大。

系统的数据卷在本质上所有的/finereport/webapps/webroot/WEB-INF下的都应当作为数据集,但是一般情况下只会使用文件夹下的这几个文件夹

  1. plugins:用于保存系统所有使用的插件
  2. config:用于保存系统的默认数据库配置
  3. reportlets:用于保存所有的报表模板

这些搞定之后数据卷的持久化就没有什么问题了(注意Linux文件系统权限问题),还有一些系统数据就在数据库之中。

报表使用说明

其实没有太多需要说的,基本上所有的场景官方都提供了demo模板可以通过对这些模板的二次编辑或者依样画葫芦都可以达到使用目的,从最终的编辑器上来讲只要能写SQL基本上没有什么难度。这个是官方的使用文档基本上看看就可以进行开发了。

留下回复