首页 > 其他分享 >急速报表开发步骤

急速报表开发步骤

时间:2023-06-29 14:25:03浏览次数:42  
标签:报表 步骤 ctx filter 急速 过滤 headFilter 数据源 append

新建字段库

截图.png

根据中台报表模板在该应用下创建报表页面

截图.png

截图.png

导出页面到想要的位置

截图.png

设置过滤条件

截图.png

添加需要查询的字段到字段库

截图.png

创建字段映射

截图.png

截图.png

创建数据源

截图.png

截图.png

编写报表页面插件 extends AbstractReportFormPlugin

给查询条件加默认值 afterCreateNewData{}

验证查询 verifyQuery(ReportQueryParam queryParam){}:判断查询条件是否合理(比如为空),合理则返回true,否则false

构建查询条件类

private void buildRptParam(ReportQueryParam queryParam) {

FilterInfo filter = queryParam.getFilter();

//1.设置组织过滤条件

Long org = getParam(filter);

this.quotaProParam.setOrg(org);

// 2、设置物料过滤条件

DynamicObjectCollection objs = (DynamicObjectCollection) filter.getFilterItem(QuotaProConstant.ZHNY_MATERIAL).getValue();

if (objs != null && !objs.isEmpty()){

for (DynamicObject obj : objs) {

quotaProParam.addMtls((Long) obj.getPkValue());

}

}

//3.设置生效日期开始时间过滤

Date effBeginDate = filter.getDate(QuotaProConstant.ZHNY_EFFBEGINDATE);

quotaProParam.setEffBeginDate(effBeginDate);

//4.设置生效日期结束时间过滤

Date effEndDate = filter.getDate(QuotaProConstant.ZHNY_EFFENDDATE);

quotaProParam.setEffEndDate(effEndDate);

//5.设置失效日期开始时间过滤

Date expBeginDate = filter.getDate(QuotaProConstant.ZHNY_EXPBEGINDATE);

quotaProParam.setExpBeginDate(expBeginDate);

//6.设置失效日期结束时间过滤

Date expEndDate = filter.getDate(QuotaProConstant.ZHNY_EXPENDDATE);

quotaProParam.setExpEndDate(expEndDate);

//7.设置供应商过滤

getParams(filter, QuotaProConstant.ZHNY_SUPPLIER);

//8.设置采购组过滤

getParams(filter, QuotaProConstant.ZHNY_OPERATORGROUP);

//9。设置采购员过滤

getParams(filter, QuotaProConstant.ZHNY_OPERATOR);

//10.如果填写了采购组/采购员,则添加过滤

getMaterial();

}

传递查询条件至数据源

this.getQueryParam().getCustomParam().put(QuotaProParam.class.getName(), quotaProParam);

编写报表数据源插件

数据查询前,进行上下文设置,处理过滤条件 注意:这里过滤的报表页面数据,所以使用报表页面字段

public void setupCtx(ReportDataCtx ctx) {

IReportDataHandle.super.setupCtx(ctx);

this.quotaProParam = ctx.getParam(QuotaProParam.class.getName());

QFilter filter = new QFilter(QuotaProConstant.ZHNY_ORG, QCP.equals, quotaProParam.getOrg());

......

fixedFs.add(filter);

}

对多数据源设置每个数据源单独的过滤的话

public void modifyBlocks(List<SrcBlockConf> blockCollector, ReportDataCtx ctx) {

IReportDataHandle.super.modifyBlocks(blockCollector, ctx);

this.quotaProParam = ctx.getParam(QuotaProParam.class.getName());

for (SrcBlockConf blockConf : blockCollector){

String entity = blockConf.getSrcEntity();

QFilter filter;

if (blockConf.getDataFs() == null){

blockConf.setDataFs(new QFilter("1" ,QCP.equals,"1"));

}

switch (entity){

case "pm_quota":

filter = new QFilter("org", QCP.equals,quotaProParam.getOrg());

filter.and("material.masterid",QCP.in,quotaProParam.getMtls());

blockConf.getDataFs().and(filter);

break;

......

}

}

生成最终数据包后,执行的数据转换器

public void transformResult(List<IDataTransform> transCollector, ReportDataCtx ctx) {

transCollector.add(new SrcDataSupPur(this.supPurRptParam));(e)

}

设置中间表需要的字段,默认:页面选择的数值字段和维度字段

public void handleBigtableCols(Set<String> repoColFilter, ReportDataCtx ctx) {

IReportDataHandle.super.handleBigtableCols(repoColFilter, ctx);

}

构建显示列

public List<AbstractReportColumn> buildShowColumn(List<AbstractReportColumn> cols, ReportDataCtx ctx) {

return IReportDataHandle.super.buildShowColumn(cols, ctx);

}

数据处理类 SrcDataSupPur implements IDataTransform

/**

* 数据处理

*/

public DataSet doTransform(DataSet srcData) {}

数据源注意事项

如果是基础资料类型的字段,就可以用维度,然后关闭默认显示,这样也能拼接

其他类型用维度,就算关闭默认显示,如果拼接还是会报已经存在这个字段的错误

在字段上添加排序和过滤(主数据源字段)

插件类需要增加一个过滤常量

public List<QFilter> getHeadFilters() {

return headFilters;

}

public void setHeadFilters(List<QFilter> headFilters) {

this.headFilters = headFilters;

}

页面插件重写方法

@Override

public void setSortAndFilter(List<SortAndFilterEvent> allColumns) {

super.setSortAndFilter(allColumns);

//开启列头过滤

for (SortAndFilterEvent column : allColumns) {

String columnName = column.getColumnName();

if (!"zhny_deliverygroup".equals(columnName) && !"zhny_deliverygroup_ref_name".equals(columnName)){

column.setFilter(true);

column.setSort(true);

}

}

}

添加列表插件

截图.png

把添加的过滤传递到数据源

public class Grp2StationRptListQuery extends AbstractReportQuery {

@Override

public ReportQueryParam getQueryParam() {

ReportQueryParam queryParam = super.getQueryParam();

Grp2StationRptParam rptParam = (Grp2StationRptParam) queryParam.getCustomParam().get("param");

rptParam.setHeadFilters(queryParam.getFilter().getHeadFilters());

return queryParam;

}

}

数据源插件添加过滤(主数据源字段)

public void setupCtx(ReportDataCtx ctx) {

IReportDataHandle.super.setupCtx(ctx);

this.param = ctx.getParam("param");

// 设置小漏斗过滤

Set<String> cols = RptHeadFilterHelper.getMapCols(ctx);

RptHeadFilterHelper.setHeadFilter(ctx, param.getHeadFilters(), cols);

数据源插件添加过滤(join上去的数据源字段)

/**

* 获取所有存在映射配置的字段

*

* @param ctx ReportDataCtx

* @return 字段列表

*/

public static Set<String> getMapCols(ReportDataCtx ctx) {

List<SrcBlockConf> confList = ctx.getReportConf().getSrcBlockConf();

Set<String> keys = new HashSet<>(16);

for (SrcBlockConf conf : confList) {

Map<String, String> colMap = conf.getRepoColSrcColMap();

keys.addAll(colMap.keySet());

}

return keys;

}

@Override

public DataSet doTransform(DataSet srcData) {

srcData =doFilter(srcData);

}

private DataSet doFilter(DataSet srcData){

Set<String> cols = getMapCols(ctx);

List<QFilter> headFilters = this.param.getHeadFilters();

List<QFilter> newFilters = headFilters.stream().filter(hf -> !cols.contains(hf.getProperty().split("\\.")[0]))

.collect(Collectors.toList());

for (QFilter headFilter : newFilters) {

srcData = srcData.filter(headFilter.toString());//普通过滤可直接添加

if ("zhny_recorddate".equals(headFilter.getProperty())){

Map<String, Object> params = new HashMap<>(16);

String filter = getDateFilter(headFilter, params);

srcData = srcData.filter(filter, params);

}

//数字要类型转换

headFilter.__setValue(new BigDecimal((String) headFilter.getValue()));

//天数转Long

headFilter.__setValue(Long.parseLong((String) headFilter.getValue()));

}

return srcData;

}

/**

* 获取日期过滤条件

*

* @param headFilter 过滤条件

* @param params 日期参数

* @return 日期过滤条件

*/

public static String getDateFilter(QFilter headFilter, Map<String, Object> params) {

StringBuilder filter = new StringBuilder();

int i = 1;

Date date = (Date) headFilter.getValue();

params.put("date1", date);

filter.append(headFilter.getProperty()).append(" ").append(headFilter.getCP()).append(" ").append("date1").append(" ");

List<QFilter.QFilterNest> nests = headFilter.getNests(true);

for (QFilter.QFilterNest nest : nests) {

QFilter qFilter = nest.getFilter();

Date date2 = (Date) qFilter.getValue();

params.put("date" + (i + 1), date2);

filter.append(nest.getOp()).append(" ").append(qFilter.getProperty()).append(" ")

.append(qFilter.getCP()).append(" ").append("date").append(i + 1).append(" ");

}

return filter.toString();

}

注意事项

尽量不要添加基础资料属性的过滤,

注意事项:字段库标识不能与报表查询条件标识一致,否则报错

截图.png

注意事项:启用了字段映射必须填写至少一个字段的映射,否则报错

截图.png

标签:报表,步骤,ctx,filter,急速,过滤,headFilter,数据源,append
From: https://www.cnblogs.com/lcyyds/p/17514093.html

相关文章

  • jmeter 解决线程组bzm-Concurrency Thread Group 安装的步骤
    1.首先 安装jmeter的插件,下载地址为放到lib/ext下,重启然后option下安装插件就Concurrency 就可以   ......
  • Linux安装nginx详细步骤
    Linux版本:CentOS7.664位Nginx版本:1.13.7下载地址:http://nginx.org/download/nginx-1.13.7.tar.gz在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。由于我这是刚在阿里云新买的服务器,所以什么都没有安装,下面开始安装:1.安装依赖包1.//......
  • 瓴羊Quick BI财务报表分析工具,帮助现代企业提升财务管理水平
    财务管理,是现代企业管理的基础,也是企业内部管理的中枢。随着财务管理智能化、数字化要求的不断提升,瓴羊QuickBI等商业智能工具逐渐成为了企业财务报表分析工具的主流选择。在瓴羊QuickBI等BI工具广泛应用之前,企业的财务管理工作繁重而复杂,时效性要求又高,往往需要投入大量的专业人......
  • esp32运行边界路由与nRF52833作为rcp通过串口通讯组建边界路由步骤
    1、首先搭建esp32开发环境,按照官方指导说明,我这里是建立在linux运行环境下的  Linux和macOS平台工具链的标准设置-ESP32-C6-—ESP-IDF编程指南latest文档(espressif.com)   espressif/esp-idfatv5.2-dev(github.com)   去官网下载最新版的esp-id......
  • 分享一次性能测试过程,5个步骤直接起飞!
    在企业中完成性能测试项目是一个挑战性强、技术含量高的任务。本文将分享一个公司完成高性能游戏系统的性能测试过程,展示如何完成一次成功的性能测试项目。项目背景:这是一家游戏公司,推出了一款新的游戏软件,系统要求高性能、高并发、高可用,为确保用户体验和游戏体验,公司决定在正式......
  • 数据可视化:打造高端的数据报表
    要打造高端的数据报表,以下是一些关键要点:明确目标和受众:首先,明确您的报表的目标是什么以及谁是受众。这有助于确定需要呈现的数据和信息类型,以及选择合适的可视化方式。精选数据和信息:仔细选择和筛选要在报表中呈现的数据和信息。只选择最重要、最相关的数据,并避免过载报表。关注关......
  • vue-组件-使用组件的三个步骤
    组件之间的父子关系使用组件的三个步骤......
  • Python全栈工程师(42:Web框架Django步骤)
    1.创建Django工程django-adminstartproject工程名2.创建appcd工程名pythonmanage.pystartappcmdb3.静态文件project.settings.pySTATICFILES_DIRS = (  'static'),      ) 4.模板路径TEMPLATE_DIRS = (  'templates'),      ) 5.settings中middlerwa......
  • 【Azure 事件中心】Kafka 生产者发送消息失败,根据失败消息询问机器人得到的分析步骤
    问题描述AzureEventHubs--Kafka生产者发送消息存在延迟接收和丢失问题,在客户端的日志中发现如下异常:2023-06-0502:00:20.467[kafka-producer-thread|producer-1]ERRORcom.deloitte.common.kafka.CommonKafkaProducer-messageId:9235f334-e39f-b429-227e-45cd30dd6486......
  • labview框架 产线MES系统 物料管理,排产计划,设备管理,报表管理,功能齐全
    labview框架产线MES系统物料管理,排产计划,设备管理,报表管理,功能齐全扫码追溯PLC通信数据库存储标签打印我重新表述一下:"LabVIEW框架是一个功能齐全的产线MES系统,它涵盖了物料管理、排产计划、设备管理和报表管理等方面。该系统还支持扫码追溯功能,可以通过扫描物料上的条码来......