掌桥专利:专业的专利平台
掌桥专利
首页

一种基于云计算的报表分布式计算方法

文献发布时间:2024-04-18 19:58:30


一种基于云计算的报表分布式计算方法

技术领域

本发明属于大数据技术领域,涉及一种基于云计算的报表分布式计算方法。

背景技术

随着企业数字化程度越来越高,已经积累了许多的数据,业务数据类型和业务数据量都达到一定的规模,同时企业对报表出具的及时性越来越高,传统的报表计算方法已经很难满足企业的要求。比如集团型企业财务月报,单个财务报表户涉及到8张不同的报表,包括资产负债表,利润表、收入明细表等,共计近3000个指标,再加上集团型企业涉及多财务报表户,因此数据的计算量非常大。

传统的解决方案中,往往会根据不同报表设置一些存储过程,通过串行计算,再统一反馈到在前端根据设置的指标编码进行渲染和展示。

发明内容

本发明的目的是提供一种基于云计算的报表分布式计算方法,解决了根据取数公式及参数实现对固定报表取数任务的自动分解,对报表取数任务的自动化远程分配及控制执行的技术问题。

为实现上述目的,本发明采用如下技术方案:

一种基于云计算的报表分布式计算方法,包括如下步骤:

步骤1:用户通过前端页面提交报表计算任务,前端页面将报表计算任务发送给服务端;服务端根据异步计算模式,将报表计算任务插入到计算任务主表;

步骤2:服务端启动一个用于分解报表计算任务的分解程序,轮询当前计算任务主表中状态为未分解的报表计算任务;

通过预先定义好的表样设计和计算公式设计,并加载至系统缓存中;根据表样设计和计算公式设计缓存数据以及报表计算任务中的参数配置进行子任务的分解,子任务分解后的状态为未处理;

步骤3:服务端按照多线程自动轮询的方式对子任务自动调用执行;

步骤4:建立数个远程节点,远程节点启动的远程服务包括程序更新服务、任务调用服务和心跳监测服务;

服务端根据轮询算法以及远程节点的资源向远程节点分配子任务;

步骤5:远程节点接通过反序列化得到子任务对象信息,根据子任务对象信息生成取数结果,并返回给服务端,服务端生成KEY_VALUE结果;

步骤6:服务端判断子任务是否全部完成,完成后根据汇总的结果生成对应指标值;

步骤7:服务端更新计算任务主表的状态结果,总汇后完成报表任务的计算。

优选的,所述计算任务主表中的报表计算任务的状态包括未分解、分解中、已分解、计算中、计算完成和计算失败。

优选的,在执行步骤2时,采用EXCEL单元格编码、自定义取数公式、系统公式,通过加减乘除等四则运算进行表样设计和计算公式设计,针对自定义取数公式需要继承com.jstrd.bi.rp.formula.plugin.RPFormulaBase类,并通过取数插件jar包调用方式支持JAVA类的动态加载,具体包括如下步骤:

步骤2-1:针对报表及指标区域设置,获得报表与指标的对应关系,同时针对指标中计算公式进行加载,将其中的涉及的自定义取数公式部分进行汇总分析,得到公式以及对应的参数;

步骤2-2:根据不同的自定义取数公式以及对应的参数设置值进行子任务的分解;子任务分解后的任务状态为未处理。

优选的,在执行步骤4时,服务端启动时根据配置的参数初始化启动多个取数线程,每个线程都在不间断轮询获取状态为未处理的子任务,获取任务后将此子任务的状态置为计算中,确保不被其他取数线程轮询到;系统根据当前任务的并发量动态调整取数线程数;

心跳监测服务用于服务端动态更新远程服务器的运行状态,监控远程节点是否可用;

任务调用服务用于接收服务端发送的任务取数请求,请求内容包括取数公式代码,年份、月份、报表户以及对应的类和取数jar包文件;

程序更新服务用于服务端取数jar文件的更新服务;

服务端通过配置不同的服务端口,确保心跳监测服务、任务调用服务和程序更新服务之间不冲突。

优选的,在执行步骤5时,远程节点在接收到计算任务后,通过反序列化得到子任务对象信息,任务信息包括年份、月份、公式编码、计算的账套编码、公式包含的参数、对应的JAVA类名、对应的jar包名、调用参数;JAVA类名对应的JAVA类是继承系统提供的RPFormul aBase基础类,服务端根据JAVA反射机制,动态从指定的jar包文件,根据java类名,加载形成对象实例,并根据公式包含的参数以及调用参数,构造1个或多个String[]参数,从而反射调用calculate(String[]p1,String[]p2,....,String[]pn)方法,返回Object对象,Object对象支持Map和VOList对象;

在calculate(String[]p1,String[]p2,....,String[]pn)方法中,根据账套编码、年月、调用参数这些参数,从相应的业务表中执行相应的SQL语句或者其他逻辑,生成需要的取数结果;

MAP对象中KEY的格式包括“账套编码_公式编码(参数1、参数2.....参数n)”,其中参数1、参数2.....参数n即为VALUE,VALUE为数值型;calculate(String[]p1,String[]p2,....,String[]pn)方法调用成功后,将Map或者VOList对象转化成XML格式的字符串。

优选的,在执行步骤6时,当单个子任务调用返回后,服务端解析返回的XML格式的字符串,重新生成对应的KEY和VALUE,并保存到全局的MAP缓存中,直到所有的子任务都已经被执行并返回结果,从而将所有子任务调用返回的值更新到了对应的MAP中;

服务端判断所有子任务执行完成后,将主任务更新成计算中状态;根据主任务ID查到计算报表包含的全部指标,循环所有的指标,根据当前计算的报表户编码和对应指标取数表达式计算指标的值。

优选的,在执行步骤7时,当所有指标任务计算完成后,服务端更新报表计算任务状态为计算完成状态,并通过前端页面主动提醒用户已经完成报表计算任务的计算,用户通过前端页面查看报表数据,在报表计算的过程中,用户通过前端页面实时查看报表计算的过程和状态,监控每个分解子任务取数的状态,包括取数公式,年份、月份、状态、参数以及发送的远程节点。

本发明所述的一种基于云计算的报表分布式计算方法,解决了根据取数公式及参数实现对固定报表取数任务的自动分解,对报表取数任务的自动化远程分配及控制执行的技术问题,通过类EXCEL公式方式提供用户快速配置报表的计算逻辑,降低了报表配置的难度,支持将报表的计算任务根据不同公式以及其配置的任务分解参数分解成若干个子任务,确保同一公式的相同参数取数只会计算一次,大大提升了报表的计算效率,提供了报表子任务并行计算功能,通过定义多个取数线程,并且可以动态调整线程个数,实现报表并行计算,通过轮询将子任务发送到远程取数节点,并支持任务异常处理。

附图说明

图1为本发明的分布式固定报表计算服务实现方法的流程图;

图2为本发明的报表任务分解实现逻辑图;

图3为本发明的子任务分布式任务调用架构。

具体实施方式

如图1-图3所述的一种基于云计算的报表分布式计算方法,包括如下步骤:

步骤1:用户通过前端页面提交报表计算任务,前端页面将报表计算任务发送给服务端;服务端根据异步计算模式,将报表计算任务插入到计算任务主表;所述计算任务主表中的报表计算任务的状态包括未分解、分解中、已分解、计算中、计算完成和计算失败。

本实施例中,用户可通过前端页面,选择需要计算的一张或多张报表,所计算的报表账套、年份和月份信息,账套信息支持所属账套以及其下级账套。报表计算为异步计算模式,服务端根据提交的信息将计算任务插入到计算任务主表,初始状态为未分解状态。

初始状态为未分解,由主任务分解程序先将状态更新为分解中,分解成功后状态更新为已分解,待所有子任务全部完成后,会将任务更新为计算中,计算完成后更新为计算完成,如果出现异常,则将任务更新成计算失败。本实施例中还可以通过前端页面主动给用户进行弹出提示。

本实施例中通过前端用户操作,选择需要计算的报表户,需要计算的表单,年份和月份等信息。其中报表户可以支持多个报表户的一次计算,计算的表单也支持对多张报表,可按照表套或多个表单进行下发任务,一个表套由多个表单组成。用户下发任务成功后,会生成待计算任务信息

步骤2:服务端启动一个用于分解报表计算任务的分解程序,轮询当前计算任务主表中状态为未分解的报表计算任务;

通过预先定义好的表样设计和计算公式设计,并加载至系统缓存中;根据表样设计和计算公式设计缓存数据以及报表计算任务中的参数配置进行子任务的分解,子任务分解后的状态为未处理;

本实施例中,为了加快后续报表计算效率,服务端需要在服务启动时把报表户、表单、指标以及指标对应的取数公式需要全部加载到缓存中。建立起表单与指标的对应关系,以及指标对应的公式和参数的对应关系。这样可以快速通过表单就能查到此表单总共需要涉及取数公式和参数,依靠这样的映射关系可以确保单个公式和参数只会被计算一次,确保不会重复计算,从而大大减少了报表的计算量。

本实施例中根据类EXCEL公式的设计思路,采用EXCEL单元格编码、自定义取数公式、系统公式,通过加减乘除等四则运算进行表样设计和计算公式设计,针对自定义取数公式需要继承com.jstrd.bi.rp.formula.plugin.RPFormulaBase类,并通过取数插件jar包调用方式支持JAVA类的动态加载。

本实施例中,取数公式定义为:

首先定义一个取数公式,实现某一种业务数据的获取,如取财务上某个科目的余额。取数公式主要字段信息包括公式标识、公式名称、公式对应的取数JAVA类、指定的jar文件插件、公式所带参数(参数支持多个)、报表户任务分解数、参数任务分解数。

公式标识:用来定义在单元格中,作为取数表达式,一般以UEDF_开头;

公式名称:公式的中文描述,能准确描述出公式的含义;

公式定义类:公式定义是JAVA语言中指定的某个类,要求继承指定的抽象类com.jstrd.bi.rp.formula.plugin.RPFormulaBase,实现抽象类中的calculate方法。

public Object calculate(String[]p1,String[]

p2,...String[]pn)throws Exception{

//return obj;

}

其中参数可以有0个或多个,每个参数会是一个数组,数组的长度由不同单元格中取数表达式所包含该公式的参数确定。返回的参数Object支持Map对象,存放KEY和VALUE值,KEY值的由多个参数组合而成,格式为‘报表户代码_公式标识_P1_P2_P3...._Pn’,其中P1、P2...Pn为公式参数,VALUE即为当前报表户下此公式对应参数的取值。

抽象类包含3个成员属性,报表户、计算年份和计算月份。报表户支持多个报表户,单次可以选择一个或多个报表户计算报表,报表户支持上下级关系。计算年份和计算月份是指计算具体报表时选择的年份和月份。

公式参数:每个公式可以有多个参数,参数间以逗号间隔。如取科目余额,需要输入具体某个科目代码和借贷方向,科目代码和借贷方向就是其参数,目前参数支持字符型,比如

UEDF_KMYE(1001,J),借方余额用J表示,贷方余额用D表示。

指定的jar文件插件:服务端在调用取数公式java类时,会从指定目录下jar包中加载class文件。技术人员先将class文件打包成jar文件通过平台提供的上传功能上传至指定目录,在服务端jar文件不存放在标准J2EE应用下的WEB-INF/lib中,在远程取数节点端上也不放在服务端加载时的lib包目录,这样服务启动时以及文件有变化时不会自动加载。后期当取数逻辑调整后,需要编译后打包成jar文件重新上传更新。

报表户任务分解数:考虑到集团多个报表核算账套,会涉及到不同核算账套报表的批量取数,报表户任务分解数是用来根据报表户数来拆分任务。当参数值为0时,表示不根据报表户分解计算任务。当参数值不为0时,则会根据报表户进行任务拆分。如参数为2时,此时计算4个不同报表户,则单个公式会拆分成2个计算任务。

参数任务分解数:同一个取数公式在报表定义中会存在多个不同的参数,如UEDF_YE(1001)和UEDF_YE(1002)。当参数为0时表示不根据不同参数的个数进行计算任务分解。不为0时会根据参数任务分解数进行任务分解,如此参数值为2时,A取数公式共有4个不同的参数,则A取数公式会拆分成2个计算子任务。

步骤2的具体包括如下步骤:

步骤2-1:针对报表及指标区域设置,获得报表与指标的对应关系,同时针对指标中计算公式进行加载,将其中的涉及的自定义取数公式部分进行汇总分析,得到公式以及对应的参数;如UDEF_YE(1001)、UDEF_YE(1002)格式,建立起该指标与对应自定义取数公式的对应关系,从而可以通过报表能获得此报表下所有指标涉及的自定义取数公式和参数,并且去除重复的自定义取数公式和参数。如不同的指标都含有UDEF_YE(1001),只会计算1次。

在类EXCEL报表中设置指定的指标区域,指标区域内每个单元格为一个指标,根据指标所对应的行号、列号以及表单编码设置唯一的指标编码,格式为[指标编码_行号_列号]。比如[11_20_30]表示表单代码为11的报表的第20行第30列这个单元格。在每个单元格使用定义好的公式加上相应的参数、加减乘除等四则运算、以及服务端预设的一些服务端公式来设置每个单元格实际的取数逻辑表达式,如MA X(UDEF_YE(1001),UDEF_YE(1002))表示取科目1001和1002两个科目中科目余额较大的数。服务端预设的系统函数包括计算公式和逻辑公式两类公式。计算公式有MAX、MIN、AVG、SUM、ABS等,逻辑公式有IF、EQUALS等.

步骤2-2:根据不同的自定义取数公式以及对应的参数设置值进行子任务的分解;子任务分解后的任务状态为未处理。如UDEF_YE取数公式,经过去重后共有6个不同参数,如1001、1002、1003、1004、1005、1006,如果UDEF_YE和UDEF_FSE公式的参数任务分解数为3,则UDEF_YE会有两个子任务,TASK1(1001、1002、1003)和TASK2(1004、1005、1006),UDEF_FSE则会有一个子任务TASK3(1001、1002)。子任务分解后的任务状态为未处理。

本实施例中,任务分解会从待计算的任务信息中获取任务后,根据任务编码获取到此任务需要计算的报表,其次根据报表获取所有的指标,最后根据指标能得到此单元格中涉及的取数公式以及对应的参数,从而能够快速得到全部需要计算的取数公式以及对应参数。轮询取数公式,得到此取数公式全部的参数,根据公式设置的报表户任务分解数和参数任务分解数分解将此公式分解成一个或多个任务,这样就根据取数公式及参数将计算任务进行分解。

步骤3:服务端按照多线程自动轮询的方式对子任务自动调用执行。

本实施例中,服务端支持对分解后的子任务自动调用执行。首先服务端启动时会根据配置的参数初始化启动多个取数线程,每个线程都在不间断轮询获取状态为未处理的子任务,获取任务后将此任务置为计算中,以确保不被其他取数线程轮询到。服务端可以根据当前任务的并发量动态调整取数线程数。

步骤4:建立数个远程节点,远程节点启动的远程服务包括程序更新服务、任务调用服务和心跳监测服务;

服务端启动时根据配置的参数初始化启动多个取数线程,每个线程都在不间断轮询获取状态为未处理的子任务,获取任务后将此子任务的状态置为计算中,确保不被其他取数线程轮询到;服务端根据当前任务的并发量动态调整取数线程数;

本发明定义多个远程取数服务节点,并且启动远程服务,远程取数服务节点共启动三个服务,心跳监测服务,任务调用服务、取数程序更新服务。

心跳监测服务用于服务端动态更新远程服务器的运行状态,监控远程节点是否可用;确保在任务分配时确保不会把任务分配到不可用的节点,确保任务分发的成功率。通过心跳服务定期检测远程取数服务器的状态,并更新远程取数服务的运行状态,确保任务分配时得到可用的服务。若无法取到可用远程节点,则支持本地服务调用。为确保远程服务状态更新的及时性,心跳检测服务可根据实际情况配置轮询时间,目前一分钟更新一次。

任务调用服务用于接收服务端发送的任务取数请求,请求内容包括取数公式代码,年份、月份、报表户以及对应的类和取数jar包文件。

程序更新服务用于服务端取数jar文件的更新服务。为确保远程取数节点取数的数据的准确性,通过取数程序更新服务将服务器本地的取数逻辑插件程序自动同步到远程取数节点,保证程序的准确性。

服务端通过配置不同的服务端口,确保心跳监测服务、任务调用服务和程序更新服务之间不冲突。

服务端根据轮询算法以及远程节点的资源向远程节点分配子任务。

本实施例中,轮询算法为取数节点可以根据远程服务器的配置情况定义不同的权重,服务端可以通过权重进行轮询算法分配任务。权重值越大,同一时间段分配的取数任务次数就越多。

本实施例中,当取数线程获取到未处理的子任务时,会根据轮询算法自动获取当前最优的一个远程取数节点,远程取数节点会根据本机的资源设置不同的权重,确保资源高的节点可以多分发一些任务。

服务端会自动更新远程取数节点服务的状态。远程取数节点会提供两个服务,一个是任务接收服务,用来接收服务器发送过来的任务。一个是心跳注册服务,用来接收服务端的心跳请求。服务端会轮询往远程取数节点发送心跳服务,如果得到成功响应,则会更新远程取数节点的状态标记为可用,在轮询分配时候会作为任务可分配的取数节点。

步骤5:远程节点接通过反序列化得到子任务对象信息,根据子任务对象信息生成取数结果,并返回给服务端,服务端生成KEY_VALUE结果;

远程节点在接收到计算任务后,通过反序列化得到子任务对象信息,任务信息包括年份、月份、公式编码、计算的账套编码、公式包含的参数、对应的JAVA类名、对应的jar包名、调用参数;JAVA类名对应的JAVA类是继承服务端提供的RPFormulaBase基础类,服务端根据JAVA反射机制,动态从指定的jar包文件,根据java类名,加载形成对象实例,并根据公式包含的参数以及调用参数,构造1个或多个String[]参数,从而反射调用calculate(String[]p1,Strin g[]p2,....,String[]pn)方法,返回Object对象,Object对象支持Map和VOList对象;

在calculate(String[]p1,String[]p2,....,String[]pn)方法中,根据账套编码、年月、调用参数这些参数,从相应的业务表中执行相应的SQL语句或者其他逻辑,生成需要的取数结果;

MAP对象中KEY的格式包括“账套编码_公式编码(参数1、参数2.....参数n)”,其中参数1、参数2.....参数n即为VALUE,VALUE为数值型;calculate(String[]p1,String[]p2,....,String[]pn)方法调用成功后,将Map或者VOList对象转化成XML格式的字符串。

步骤6:服务端判断子任务是否全部完成,完成后根据汇总的结果生成对应指标值;

当单个子任务调用返回后,服务端解析返回的XML格式的字符串,重新生成对应的KEY和VALUE,并保存到全局的MAP缓存中,直到所有的子任务都已经被执行并返回结果,从而将所有子任务调用返回的值更新到了对应的MAP中;

服务端判断所有子任务执行完成后,将主任务更新成计算中状态;根据主任务ID查到计算报表包含的全部指标,循环所有的指标,根据当前计算的报表户编码和对应指标取数表达式计算指标的值。

如指标[11_20_30]的取数表达式为UEDF_YE(1001)+UEDF_YE(1002)+UEDF_FSE(1001),从指标缓存中得到包含的取数公式及参数,加上计算的报表户编码,形成KEY的值为A3201_UEDF_YE(1001)、A3201_UEDF_YE(1002)、A3201_UEDF_FSE(1001),假设从全局MAP缓存中根据KEY值分别得到100、200、300,分别用这三个值进行替换指标取数表达式中的公式和参数,得到最终的取数表达式为“100+200+300”,通过FEL表达式技术引擎对表达式“100+200+300”进行编译执行,将表达式编译成字节码得到表达式的值为600,记录此账套编码、年份、月份、指标编码及指标值。然后循环报表任务的全部指标得到指标的值,并且通过java.sql.PreparedStatement批量插入方式进行批量更新。

步骤7:服务端更新计算任务主表的状态结果,总汇后完成报表任务的计算。

当所有指标任务计算完成后,服务端更新报表计算任务状态为计算完成状态,并通过前端页面主动提醒用户已经完成报表计算任务的计算,用户通过前端页面查看报表数据,在报表计算的过程中,用户通过前端页面实时查看报表计算的过程和状态,监控每个分解子任务取数的状态,包括取数公式,年份、月份、状态、参数以及发送的远程节点。

本发明通过加载指定目录下的jar包中的取数公式class类,确保在每次执行时通过ClassLoader动态生成实例对象,确保了如果取数逻辑变更,支持取数逻辑类实时更新,而不需要重新启动远程取数节点服务。同时支持任意多个取数节点,需要确保取数节点中的取数插件jar包能快速同步到远程所有的取数节点中。支持在服务端更新上传jar文件插件,服务端判断到jar包文件有变更时,通过调用每个远程取数节点提供的取数程序更新服务,会实时将jar包文件同步到全部的远程取数节点,这样就可以做到jar包文件的同步更新及动态加载,大大提升了系统的可用性。本发明在考虑到远程取数节点的网络稳定性,考虑到了在异常情况下任子务分发的可靠性。

本发明所述的一种基于云计算的报表分布式计算方法,解决了根据取数公式及参数实现对固定报表取数任务的自动分解,对报表取数任务的自动化远程分配及控制执行的技术问题,解决了根据取数公式及参数实现对固定报表取数任务的自动分解,对报表取数任务的自动化远程分配及控制执行的技术问题,通过类EXCEL公式方式提供用户快速配置报表的计算逻辑,降低了报表配置的难度,支持将报表的计算任务根据不同公式以及其配置的任务分解参数分解成若干个子任务,确保同一公式的相同参数取数只会计算一次,大大提升了报表的计算效率,提供了报表子任务并行计算功能,通过定义多个取数线程,并且可以动态调整线程个数,实现报表并行计算,通过轮询将子任务发送到远程取数节点,并支持任务异常处理。

相关技术
  • 一种基于报表引擎的水务计算方法
  • 一种基于云计算方法的报表模型
  • 基于分布式光伏电站的云计算方法及云服务平台
技术分类

06120116501830