极速报表:二开示例
变更记录
产品版本 | 更新内容 | 更新日期 |
V4.0.020 | 初始版本 | 2022年05月12日 |
1 简介
在进行二次开发前,对开发场景要清晰。
场景1:是开发设计过程,开发者需要实现产品成果,同时还要考虑如何让二开人员在成果更高效的扩展调整,要遵循苍穹平台及中台报表框架的规范;
场景2:是二次开发过程,二开人员要做的是调整配置,增加插件等,除了要遵循苍穹平台规范、中台报表框架规范外,还要遵循具体报表给出的二开限制规范,因为每个报表的扩展点可能是不相同的。
2 示例(不动代码)
一般由现场实施人员可以完成,仅在克隆配置中调整配置来实现。同时还要结合单据、余额等其他实体的扩展。
2.1 设置默认显示
比如:报表显示的汇总依据、汇总值,以及默认打开的选中方案要调整。
步骤:1)在克隆后的配置中,把要默认要显示的维度和数值类型字段,开启默认显示;2)在用户点击查询前,可以在查询界面动态设置选中即可。
【注意事项】
但有些字段发现关闭默认显示不生效时,检查配置是否启用,或者代码进行了强控不允许不显示。
2.2 增加引用属性
比如:物料字段,要关联显示规格型号、物料分类。
步骤:1)检查字段库中是否引用需要的字段,没有则加上;2)在显示引用属性列,选择要添加显示的属性,并通过上下移控制显示顺序。
【注意事项】
1)引用属性层级有上限,具体以苍穹平台实现为准,3层是没什么问题的,层级越深,性能越差;
2)为性能、内存考虑,字段库引用属性、和配置中显示引用属性在满足业务需求的基础上,严格控制越少越好。
2.3 调整维度字段
比如:库存管理中增加了一个项目号字段,或者库存的仓库字段用的二开自己的仓库字段。
步骤:
1)期间余额及规则做相应的配置调整(见余额模型的扩展);
2)扩展字段库,增加对应的扩展字段,已有则不用调整;
3)在报表字段配置中设置需要的计算类型(维度);
4)在数据源字段映射中配置对应的字段。
【注意事项】
1)所有用到的数据块,都要进行配置不能遗漏;
2)要根据实际需求进行添加。
3)映射的字段必须要有数据库字段,否则加载不了数据。
4)字段映射选不到时,考虑字段类型是否匹配。
2.4 调整通用过滤
需求:某个字段只想在通用过滤中参与过滤,不想在列表显示。
方案:将改字段改为计算类型字段即可。若原来就没有该字段,在字段库和字段映射增加上扩展字段。
3 示例(动代码)
一般由开发人员来完成,结合配置的修改以及增加算子来实现。
3.1 设置漏斗过滤
方案:漏斗过滤是平台报表框架自带的功能,并发极速报表特有的。使用极速报表开发时,需要做的是如何将漏斗的条件和排序要求传给极速报表插件,参与计算。可参考下面步骤:
1)设置哪些字段需要开启漏斗:kd.bos.report.plugin.AbstractReportFormPlugin#setSortAndFilter
2)点击查询前获取到漏斗过滤设置:kd.bos.report.plugin.AbstractReportFormPlugin#beforeQuery
3)在二开报表插件中获取上面参数,按逻辑需要加入到对应位置。下面只能举个简单例子,其余场景要开发自己举一反三。
【注意事项】
1)受现有框架的限制,漏斗的过滤排序都要在后端处理,而且框架没有通用方案。但是二开个性化增加逻辑是可以满足大部分需求的。
2)对于其他复杂场景(不限于下面几种),这些都是特殊场景。
过滤字段,在字段库没有的,要二开对QFilter解析转换。
对于sum的数值字段过滤,则不能在上诉过滤位置添加,要考虑在流水计算环节哪个位置添加合适。
对于某些条件设置不当,可能导致严重的慢SQL,需要自行优化处理,框架无法处理的。
排序场景,则更复杂,需要开发清除的知道在哪个环节进行排序而且后端数据包为了性能是没有引用属性的,而排序字段缺又是引用属性字段。
3)页面漏斗过滤可选性,是领域模型层内容。目前是无法排查某些过滤项的。
4)需要对查询数据进行各种过滤、排序操作的,建议引导使用导出Excel来分析。
3.2 要关联数据
比如:某个字段无法通过配置加载进来,有中间关系表才能查到,想在报表上关联显示。假设是物料分类的对应的上级和上上级分类。
方案:假设是基本分类,那么可以直接通过物料字段直接引用字段即可。那上级和上上级分类则需要额外映入数据,关联到原有数据中。那么关联数据要考虑数据行尽可能的少,性能会更好。因此要考虑在Group后,引入数据。下面是代码示例。
方式1:对于被关联表是小表的情况(不超过百万),可以采用下面方式。
方式2:对于被关联表是大表的情况(超过百万),应尽可能的让被关了表有过滤条件,避免全部查询。或者可以确定左表查询结果不会太大情况下,也可以采用下面方式,分组后查询。
研发实例:参考物料分类的处理kd.scmc.im.report.algox.util.trans.AddMaterialGroup
【注意事项】
1)该位置具体用什么方式,需要开发自己把控,推荐的原则就是:要结合数据特点权衡单次查询性能和总查询数。
2)上面只是实例代码,也可以有其他实现,基本原理就是分批查询OR单纯查询。
3.3 通用过滤修改字段
比如:组织字段已经挪到常用过滤位置了,通用过滤面板上想去掉。
方案:这个逻辑控制属于Form界面的逻辑,和单据、动态表单上写代码没什么差别。下面举例:
研发实例:参考物料分类的处理kd.scmc.im.report.algox.realbal.RealBalRptForm.afterCreateNewData
3.4 通用过滤F7过滤
方案:这个逻辑控制属于Form界面的逻辑,和单据、动态表单上写代码没什么差别。下面举例:
在二开的Form插件中的filterContainerBeforeF7Select 事件中处理。
3.5 控制数据隔离
比如:某些人员只能看某些仓库的数据,或某些组织的数据。
方案:不管是什么隔离,最终的逻辑都是数据过滤,但是报表与列表是有本质差别的,报表有复杂计算,不像列表直接单表过滤就得到需要的数据。基础服务中的数据规则权限,不可能天然支持极速报表的逻辑。不同的报表业务完全不一样,极速报表也不可能把数据规则作为通用的数据过滤方案。因此更合适的方式是具体报表具体实现。
在结合二开实际需求,抛开通用性,则非常好实现数据隔离。下面给出一个基于基础资料数据隔离方案来做到报表数据隔离的实现案例。
步骤:
1)在基础服务中配置好仓库的数据隔离方案;
2)在二开克隆的数据源配置中,添加报表插件;
3)在插件中:获取到权限控制的过滤条件,添加到报表计算中即实现了数据隔离需求;
核心思想,要举一反三:
接通条件:接平台的这个数据隔离、直接做数据隔离方案、二开自定义数据隔离方案。只要是条件都可以接。
过滤位置:setupCtx中基于通用过滤设置条件、在modify中基于具体的数据库设置条件、内存过滤。只要能实现就可以。
3.6 参数如何传递
见场景:设置漏斗过滤中的XXXParam的设计。
3.7 模拟报表取数
比如:想将报表查询的结果,通过后台代码调用或定时任务执行,把固定的查询结果存到指定的物理表中。
方案:要结合具体的报表,看是否要二次包装,下面给出代码示例,查库存管理中的即时库存报表
【注意事项】
该做法需要使用方自行设计评估是否会带来系统风险。比如:存到物理表后被引用了,报表查询数据是变化的,会不会业务上存在问题;代码调用频次如何控制;单次查询的数据量如何控制等。
3.8 字段格式化
比如:数量去尾零,精度控制。
方案:框架有些默认处理,1)数量、小数字段,默认去尾零;2)单价、金额字段,默认不去零;3)为零是否显示,有字段库字段设置中取;4)单价、金额字段、数量等字段精度由对应的币别、单位控制,字段库字段可设置,没有的情况下不处理精度。
在默认设置的基础上,还可以代码进行一些字段控制。
研发实例:参考物料收发汇总的处理kd.scmc.im.report.algox.sum.SumRptHandle.buildShowColumn
3.9 结果集排序
方案:在什么位置需要开发自己设计决定,不是框架决定的。比如:在Group数据后,对某字段排序。
研发实例:参考物料收发的一个内排序kd.scmc.im.report.algox.detail.func.AddBalRowGroupReduceFunc.reduce
3.10 增加ID映射
比如:怎么加单据ID和分录ID映射
方案:现版本还不支持界面直接选ID(控件不支持),可以代码进行控制。在字段映射配置中代码增加配置即可。
研发实例:物理收发明细某些场景下要单据ID:kd.scmc.im.report.algox.detail.DetailRptHandle.appendIdMap2Block
3.11 修改默认汇总逻辑
比如:想自定义分组汇总逻辑怎么处理,不用框架自带的
方案:先关闭框架自带汇总逻辑,在添加直接的汇总方案。
3.12 修改默认合计行逻辑
比如:想自定义加汇总行怎么处理,不用框架自带的
4 更新用例
见后续更新。有相关需求可以留言。
极速报表:二开示例
本文2024-09-22 23:48:34发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-135419.html