急速报表开发步骤

新建字段库

截图.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

posted @ 2023-06-29 14:11  lcyyds  阅读(104)  评论(0)    收藏  举报