如何对报表查询结果中指定字段进行二次处理?
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及以上。
如何对报表查询结果中指定字段进行二次处理?
本文2024-09-22 23:33:25发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-133791.html