如何对报表查询结果中指定字段进行二次处理?

栏目:云星瀚知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:1

如何对报表查询结果中指定字段进行二次处理?


1 问题描述

在报表场景内,经常会遇到需要对报表查询之后的结果进行二次处理的需求,或者在报表查询结果内,按一定业务逻辑插入一列的场景。面对这些对报表查询结果进行二次干预的需求,可以使用本文的处理方法。


2 解决方法

报表框架在报表数据处理完成后,暴露了一个业务扩展点,在这个业务扩展点,现场可以增加二开扩展实现类,在标品报表框架处理完数据后,加入现场的业务逻辑代码,对报表框架的取数,计算结果再进行一次处理,可以修改最终发送给前端报表控件的报表数据,以达到现场需要干预报表取数结果的目标,实现现场需要的效果。

 

现场增加埋点实现类

现场需要增加业务扩展点,在标品报表框架处理完数据后,加入现场的业务逻辑代码,对报表框架的取数,计算结果再进行一次处理。

报表扩展点截图如下:

点击“绑定插件”按钮,绑定现场新增的处理实现类,举例如下图:

kd.hr.hrptmc.customcall.ReportCustomCalPlugin//现场需要按二开规范命包路径及类名

现场实现类处理

现场增加的实现类,需要增加判断,对指定的报表数据处理,基于原DataSet,增加现场的二开处理后,构造一个新的DataSet并返回,就可以了。

代码样例如下:

package kd.hr.hrptmc.customcall;//这里要换成现场二开的包路径,按二开规范来

import com.google.common.collect.Lists;

import kd.bos.algo.Algo;

import kd.bos.algo.DataSet;

import kd.bos.algo.DataSetBuilder;

import kd.bos.algo.Row;

import kd.bos.logging.Log;

import kd.bos.logging.LogFactory;

import kd.hr.hbp.business.extpoint.report.cal.IReportCustomCalPlugin;

import kd.hr.hbp.common.model.complexobj.HRComplexObjContext;

import kd.hr.hrptmc.business.repcalculate.model.ReportCalculateInfo;

import java.util.List;

import java.util.Random;

 

/**

 * 报表埋点插件实现类//类名根据现场需要命名,文档中类名仅用做样例说明

 */

public class ReportCustomCalPlugin implements IReportCustomCalPlugin {

 

    private static final Log LOGGER = LogFactory.getLog(ReportCustomCalPlugin.class);

 

    @Override

    public DataSet doAfterCalDataSet(DataSet dataSet, HRComplexObjContext hrComplexObjContext, Object obj) {

        ReportCalculateInfo reportCalculateInfo = (ReportCalculateInfo) obj;

        DataSet resultDataSet = dataSet;

        Random random = new Random();

        // 增加判断,对指定的报表才进行处理;遍历原有结果集,增加对指定字段的处理,构造新的结果集;

        if (1893457359150370816L == reportCalculateInfo.getReportId()) {

            String[] fieldNames = dataSet.getRowMeta().getFieldNames();

DataSetBuilder dataSetBuilder = Algo.create("HRReportDataConvertBuilder").createDataSetBuilder(dataSet.getRowMeta());

while (dataSet.hasNext()) {

           List<Object> valueList = Lists.newArrayListWithCapacity(fieldNames.length);

           Row row = dataSet.next();

           for (int i = 0; i < fieldNames.length; i++) {

                     //给指定的字段 赋值,假定要修改的字段名为“companyname

                     if ("companyname".equals(fieldNames[i])) {

                                valueList.add(i, "newVal_" + i);//设置现场期望的新值

                     } else {

                                valueList.add(i, row.get(i));

                     }

           }

           dataSetBuilder.append(valueList.toArray());

}

DataSet resultDataSet = dataSetBuilder.build();

        }

        return resultDataSet;

    }

}

 

发布

现场将新增加的报表插件ReportCustomCalPlugin上传到代码仓;另外,业务扩展点配置元数据也需要导出,上传代码仓,跟随报表插件ReportCustomCalPlugin 一起发布;

插件、元数据打包 跟随报表所部署的容器进行部署;

 

扩展点引出页面截图:

 

引出扩展点配置元数据截图:

提取下载的压缩包中的扩展点配置元数“ReportCustomCalPlugin1955195112682160128.extp”放到代码仓,放到元数据目录 metadata路径下面。

 


3 适用版本(可选)

金蝶云·星瀚V6.0.13及以上。


如何对报表查询结果中指定字段进行二次处理?

1 问题描述在报表场景内,经常会遇到需要对报表查询之后的结果进行二次处理的需求,或者在报表查询结果内,按一定业务逻辑插入一列的场景...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息