CN111538731B - 一种工业数据自动生成报表*** - Google Patents
一种工业数据自动生成报表*** Download PDFInfo
- Publication number
- CN111538731B CN111538731B CN202010405791.1A CN202010405791A CN111538731B CN 111538731 B CN111538731 B CN 111538731B CN 202010405791 A CN202010405791 A CN 202010405791A CN 111538731 B CN111538731 B CN 111538731B
- Authority
- CN
- China
- Prior art keywords
- data
- report
- industrial
- cells
- industrial data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/183—Tabulation, i.e. one-dimensional positioning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/166—Editing, e.g. inserting or deleting
- G06F40/186—Templates
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/02—Total factory control, e.g. smart factories, flexible manufacturing systems [FMS] or integrated manufacturing systems [IMS]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computational Linguistics (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Software Systems (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种工业数据自动生成报表***,包括工业数据服务器、分布处理服务器、报表服务器、工业数据数据库和报表数据库;工业数据服务器用于采集工业数据,驱使分布处理服务器依据预先配置的数据处理规则对分配的工业数据进行处理封装后录入至工业数据数据库;报表服务器用于根据预设的定时任务,选择其中一个自动生成的工业报表模板文件,调取对应的工业数据,处理后填充或替换该工业报表模板文件中的部分或全部活动单元格,生成报表文件。本发明能够通过自动获取工业数据并自动生成报表的方式以克服手动计算录入的繁杂工作,使报表生成方式和整个数据、报表的处理过程更加灵活,具备强适应性,采用分布处理服务器缓解了数据处理压力。
Description
技术领域
本发明涉及工业数据报表处理技术领域,具体而言涉及一种工业数据自动生成报表***。
背景技术
在工业生产过程中,往往伴随着大量的生产,消耗数据,而数据的显示往往是通过报表的形式进行展示。传统模式中,由各岗位的工人抄录各个设备使用、生产、消耗的能源或物料数据,并由相应部门进行人工汇总,计算并录入,操作繁琐的同时又伴随着庞大的工作量。
专利号为CN109947810A的发明专利公开了一种工业设备数据实时采集***,包含:对应于工厂中每个车间设置的分布式采集节点,分布式采集节点中设置一节点服务器,节点服务器包含数据采集单元;数据采集单元用于采集车间内工业设备的实时数据,并将实时数据存储至节点服务器,节点服务器还用于对实时数据进行预处理,以生成数据预处理结果;数据中心,包含数采服务器及web服务器;数采服务器用于存储及进一步处理各节点服务器传输的数据预处理结果,并生成数据报表;web服务器用于将数据报表以web形式呈现,以供用户查看,还用于提供配置界面,供用户配置数据采集单元的参数。但在该发明中,数据报表的生成方式较为单一,随着工业数据的处理量越来越多,种类越来越多,工作人员耗费在数据报表格式处理上的时间也越来越多。针对前述问题,专利号为CN109446507A的发明专利中公开了一种报表的构建方法及装置,该方法包括:获取待构建报表模板中包含的各个目标解析规则;查找与每一个目标解析规则对应的目标数据值;将每一个目标数据值写入与所述待构建报表模板对应的单元格中,得到目标待构建报表模板;将所述目标待构建报表模板转换为目标报表。上述的构建方法,通过获取与待构建报表模板中的各个目标解析规则对应的目标数据值,并将各个目标数据值写入与所述待构建报表模板对应的单元格中,得到目标待构建报表模板,将所述目标待构建报表模板转换为目标报表,只要存在待构建报表模板,就可以自动生成报表,不需要通过程序开发人员或有编程经验的人员来的开发或实施来构建报表。然而目前仍存在以下两个问题:
第一,报表中的目标解析规则通常都是对应数据库中已经计算完成的具体数值,难以在报表生成过程中再次对数据进行处理。
第二,基于第一个问题,数据处理和报表生成两部分内容未作有效分离,随着工业数据的处理量越来越大,在应用复杂业务逻辑处理报表数据时容易出现异常,同时,难以针对数据处理策略和模板生成规则做分别修订,更新难度大。
发明内容
本发明目的在于提供一种工业数据自动生成报表***,旨在通过自动获取工业数据并自动生成报表的方式以克服手动计算录入的繁杂工作;工业数据动态化,格式多样化,并且有效实现了报表数据和报表格式的完全分离,便于用户分别针对工业数据和报表进行单独修订,使报表生成方式和整个数据、报表的处理过程更加灵活,具备强适应性;同时,将工业数据计算规则设置于专门的分布处理服务器进行处理,提高了处理速度,缓解了报表数据库处理数据的压力,避免了报表数据库在应用复杂业务逻辑处理报表数据时容易出现异常的问题。
为达成上述目的,结合图1,本发明提出一种工业数据自动生成报表***,所述***包括工业数据服务器、分布处理服务器、报表服务器、工业数据数据库和报表数据库;
所述工业数据服务器用于定时/实时从各个工业设备上采集对应数据结构的工业数据,将采集到的工业数据分配至若干个分布处理服务器,驱使每个分布处理服务器依据预先配置的数据处理规则对分配的工业数据进行处理,并且以预先配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中;
所述报表服务器用于根据预设的定时任务,选择其中一个自动生成的工业报表模板文件,从工业数据数据库中调取对应的工业数据,处理后填充或替换该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件,将生成的报表文件存储至对应的报表数据库中;
所述工业报表模板文件是以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,其中部分单元格设置有对应的计算策略。
作为其中的一种优选例,所述工业数据服务器包括工业数据接口、工业数据处理模块、工业数据建模模块和工业数据计算引擎;
所述工业数据接口分别与各个工业设备的数据接口对接,用于从各个工业设备处获取相关工业数据;
所述工业数据建模模块用于定义和配置每类工业数据的数据结构;
所述工业数据计算引擎用于对工业设备的处理策略进行配置,配置内容包括相关工业数据的数据处理规则、每个工业设备数据接口的调用频率、相关工业数据的生成时间;
所述工业数据处理模块分别于工业数据接口、工业数据建模模块和工业数据计算引擎连接,用于依据工业数据计算引擎配置的处理策略,在设定的时间范围内从各个工业数据接口中获取比对应的工业数据,将获取的工业数据分配至分布处理服务器中进行处理,以及以工业数据建模模块配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中。
作为其中的一种优选例,所述报表服务器包括工业报表模板生成模块、报表文件生成模块和定时任务设置模块;
所述工业报表模块生成模块用于以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,以及设置其中部分单元格的单元格计算策略,生成所需的工业报表模板文件,针对生成的工业报表模板文件设置对应的报表模板上传属性,将工业报表模板文件上传至报表文件生成模块中,并添加一条报表模板上传属性的数据在报表服务器内;
所述报表文件生成模块用于根据预设的定时任务,从报表模块数据库中选取其中一个工业报表模板文件,再从工业数据数据库中获取对应的数据以填充该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件;
所述定时任务设置模块用于针对每个工业报表模板设置对应的定时任务,所述定时任务用于触发报表引擎接口,根据定时任务所包含的报表参数对报表数据库进行查询,判断对应的报表文件是否已经生成,当相关报表未生成时,通过报表生成接口调用报表文件生成模块,以该定时任务对应的工业报表模板为生成报表结构依据,读取工业报表模板每个单元格中所包含的外部自定义插件,从工业数据数据库中调取相应的工业数据并逐一填充至对应的单元格中,以及依据预设的单元格计算策略对部分单元格进行相关计算处理。
作为其中的一种优选例,所述报表文件生成模块对各单元格中的外部自定义插件进行分类处理,分别构建普通指令集合和循环指令集合,根据构建的指令集合分别执行各集合的指令;
所述外部自定义插件的类型包括:直接获取、条件判断式获取、循环获取和自定义函数获取;
所述直接获取是指直接的变量值替换;
所述条件判断式获取是指当满足设置条件时进行变量值的替换;
所述循环获取是指基于循环式变化进行变量值替换;
所述自定义函数获取是指通过调用对应的自定义函数进行变量值替换。
作为其中的一种优选例,所述自定义函数获取是指,通过正则表达式提取工业报表模板文件中对应单元格的函数表达式,对提取的函数表达式进行存储,再逐一或并行进行以下操作:
根据存储于预设的Jexl Context对象中的函数输入值,调用并执行Java中相应的外部自定义插件。
作为其中的一种优选例,所述根据存储于预设的Jexl Context对象中的函数输入值,调用并执行Java中相应的外部自定义插件的过程包括以下步骤:
S11,获取自定义函数中传入的参数,所述参数包括物料的名称、所属车间、所属设备,执行其业务代码获取函数返回值,所述函数返回值通过调用报表数据库或工业数据服务器得到;
S12,将得到的函数返回值作为所述当前变量值,替换工业报表模板文件中对应的函数表达式,其中,在替换的过程中,通过Apache POI接口将工业报表模板文件中的内容实例化到内存中,并且基于以上所涉及的指令集合执行对应的指令;
其中,当所述函数返回值通过调用报表数据库得到时,将获取的外部自定义插件的参数传入到报表数据库中,获取返回数据,对返回数据进行包括计算、转换、拼接在内的二次处理与封装,将封装后的数据作为函数返回值进行返回;
当所述函数返回值通过调用工业数据服务器得到时,将获取的外部自定义插件的参数进行封装处理,封装成第一Json格式数据,将封装后的第一Json格式数据传入到相应的工业数据服务器中,接收其返回的第二Json格式数据,再对接收到的第二Json格式数据进行二次处理,通过Apache Json接口将返回的数据进行转换,获取所需结果值,对结果值进行包括计算、转换、拼接在内的二次处理与封装,将封装后的数据作为函数返回值进行返回。
作为其中的一种优选例,若单元格中的内容中记载有合并指令,将该单元格的列号记录于待垂直合并列号集合中,其中的合并指令是指任意的能将其所处的一列标识为待垂直合并的一列的数据,再针对所述待垂直合并列号集合,通过Apache POI接口进行单元格的垂直合并,所述垂直合并是指,在一列中,对于任意的多个内容相同的单元格进行合并。
作为其中的一种优选例,所述针对所述待垂直合并列号集合,通过Apache POI接口进行单元格的垂直合并是指,根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格,并根据实际合并属性对单元格进行相应的垂直合并操作;
其中,针对每一个当前列逐行遍历各行单元格的过程包括:
(1)若第N行中单元格的数量不小于所述当前列的列号,且所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号不为预设值,则确定所述起始行号保持不变,且所述截止行号加一;
(2)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号为预设值,则将所述起始行号与所述截止行号置为N;
(3)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI接口对所述当前列中对应的多个单元格进行合并,再将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
(4)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号为所述预设值,则将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
(5)若第N行单元格的数量小于所述当前列的列号,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI接口对所述当前列中对应的多个单元格进行合并,并在合并后将所述起始行号与所述截止行号置为所述预设值;
(6)若第N行中单元格的数量小于所述当前列的列号,且当前的起始行号不小于截止行号,则继续遍历下一行单元格。
作为其中的一种优选例,所述针对每一个当前列逐行遍历各行单元格的过程还包括:
(7)针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI接口对所述当前列中对应的多个单元格进行合并;
(8)针对于所述当前行,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI接口被合并,所述预设值为-1。
作为其中的一种优选例,所述报表服务器包括报表显示和编辑模块,用于将生成的报表文件通过浏览器进行显示,并提供相应的编辑功能入口,所述编辑功能包括保存、单一计算、全部计算和重新获取;
所述保存功能用于将生成的报表文件存储至报表数据库;
所述单一计算功能用于将用户选择的其中一个修改后的单元格的内容还原成原始数据;
所述全部计算功能用于将修改后的全部单元格的内容还原成原始数据;
所述重新获取功能用于当报表内容存在异常或报表内容经一次或多次修改保存后还原成原始数据时,清除报表数据库中已保存的报表文件中的所有数据,并进行重新添加。
以上本发明的技术方案,与现有相比,其显著的有益效果在于:
(1)通过自动获取工业数据并自动生成报表的方式以克服手动计算录入的繁杂工作。
(2)工作数据动态化,格式多样化,有效实现了报表数据和报表格式的完全分离。
(3)同时,将工业数据计算规则设置于专门的分布处理服务器进行处理,提高了处理速度,缓解了报表数据库处理数据的压力,避免了报表数据库在应用复杂业务逻辑处理报表数据时容易出现异常的问题。
(4)通过在报表模板文件中添加外部自定义插件和相关单元格计算策略,与传统录入方式相比,本发明能够在报表生成过程中对已经处理并封装的工业数据进行二次处理,实现了工业数据处理过程与报表数据处理过程的有效分离,便于用户分别针对工业数据和报表进行单独修订,使报表生成方式和整个数据、报表的处理过程更加灵活,具备强适应性。
(5)在报表生成过程中,能够对调取数据进行二次处理,对报表进行优化处理,同时,通过合并指令生成指令集等的方式提高处理效率。
应当理解,前述构思以及在下面更加详细地描述的额外构思的所有组合只要在这样的构思不相互矛盾的情况下都可以被视为本公开的发明主题的一部分。另外,所要求保护的主题的所有组合都被视为本公开的发明主题的一部分。
结合附图从下面的描述中可以更加全面地理解本发明教导的前述和其他方面、实施例和特征。本发明的其他附加方面例如示例性实施方式的特征和/或有益效果将在下面的描述中显见,或通过根据本发明教导的具体实施方式的实践中得知。
附图说明
附图不意在按比例绘制。在附图中,在各个图中示出的每个相同或近似相同的组成部分可以用相同的标号表示。为了清晰起见,在每个图中,并非每个组成部分均被标记。现在,将通过例子并参考附图来描述本发明的各个方面的实施例,其中:
图1是本发明的工业数据自动生成报表***的结构示意图。
图2是本发明的工业数据服务器的结构示意图。
图3是本发明的单一报表引擎流程示意图。
具体实施方式
为了更了解本发明的技术内容,特举具体实施例并配合所附图式说明如下。
结合图1,本发明提出一种工业数据自动生成报表***,所述***包括工业数据服务器、分布处理服务器、报表服务器、工业数据数据库和报表数据库。
所述工业数据服务器用于定时/实时从各个工业设备上采集对应数据结构的工业数据,将采集到的工业数据分配至若干个分布处理服务器,驱使每个分布处理服务器依据预先配置的数据处理规则对分配的工业数据进行处理,并且以预先配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中。
所述报表服务器用于根据预设的定时任务,选择其中一个自动生成的工业报表模板文件,从工业数据数据库中调取对应的工业数据,处理后填充或替换该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件,将生成的报表文件存储至对应的报表数据库中。
所述工业报表模板文件是以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,其中部分单元格设置有对应的计算策略。
一、生成工业数据
所述工业数据服务器包括工业数据接口、工业数据处理模块、工业数据建模模块和工业数据计算引擎。
所述工业数据接口分别与各个工业设备的数据接口对接,用于从各个工业设备处获取相关工业数据。
所述工业数据建模模块用于定义和配置每类工业数据的数据结构。
所述工业数据计算引擎用于对工业设备的处理策略进行配置,配置内容包括相关工业数据的数据处理规则、每个工业设备数据接口的调用频率、相关工业数据的生成时间。
所述工业数据处理模块分别于工业数据接口、工业数据建模模块和工业数据计算引擎连接,用于依据工业数据计算引擎配置的处理策略,在设定的时间范围内从各个工业数据接口中获取比对应的工业数据,将获取的工业数据分配至分布处理服务器中进行处理,以及以工业数据建模模块配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中。
工业中生产、消耗、使用的数据来源于各个工业设备,每个工业设备使用的接口各不相同,对应的工业数据的结构也不相同,因此首先通过工业数据建模模块创建工业数据模型,用于配置数据结构。工业数据计算引擎用于对设备进行配置,例如配置其对应的工业数据的数据处理规则、对应工业设备数据接口的调用频率和相关工业数据的生成时间或生成周期等信息。在此基础上,以工业数据计算引擎为依据,以工业数据建模为模板,从各个设备接口中获取工业数据并对数据进行处理,将处理完成的数据封装后录入到工业数据数据库中。图2是工业数据服务器的结构示意图,其中,工业数据建模为实体类,用于对工业数据进行定义;工业数据计算引擎用于配置工业数据计算算法等;工业数据接口为业务模块,与各种工业设备的数据接口进行对接,工业数据处理模块根据工业数据计算引擎的配置内容对数据进行相关处理,包括调用工业数据接口获取数据,将数据以工业数据建模为模板进行封装,并存储到工业数据数据库中,工业数据接口同时也可以对工业数据数据库中的数据进行读取,并分配到分布处理服务器进行处理。
二、生成工业报表
所述报表服务器包括工业报表模板生成模块、报表文件生成模块和定时任务设置模块。
所述工业报表模块生成模块用于以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,以及设置其中部分单元格的单元格计算策略,生成所需的工业报表模板文件,针对生成的工业报表模板文件设置对应的报表模板上传属性,将工业报表模板文件上传至报表文件生成模块中,并添加一条报表模板上传属性的数据在报表服务器内。
所述报表文件生成模块用于根据预设的定时任务,从报表模块数据库中选取其中一个工业报表模板文件,再从工业数据数据库中获取对应的数据以填充该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件。
所述定时任务设置模块用于针对每个工业报表模板设置对应的定时任务,所述定时任务用于触发报表引擎接口,根据定时任务所包含的报表参数对报表数据库进行查询,判断对应的报表文件是否已经生成,当相关报表未生成时,通过报表生成接口调用报表文件生成模块,以该定时任务对应的工业报表模板为生成报表结构依据,读取工业报表模板每个单元格中所包含的外部自定义插件,从工业数据数据库中调取相应的工业数据并逐一填充至对应的单元格中,以及依据预设的单元格计算策略对部分单元格进行相关计算处理。
所述分布处理服务器与工业数据处理模块连接,工业数据处理模块将获取的工业数据分配至若干个分布处理服务器,驱使每个分布处理服务器依据工业数据计算引擎配置的处理策略对分配的工业数据进行处理。在一些例子中,工业数据通过工业数据服务器汇总到工业数据数据库中,再通过工业数据服务器将工业数据分配到分布处理服务器,分布处理服务器可处理分配到的工业数据,并根据预设计算引擎计算并得到计算结果,报表服务器用于统计所述计算结果得到报表。本发明将数据处理计算规则与数据分离开,将计算规则设置于专门的分布处理服务器进行处理,提高了处理速度,缓解了报表服务器处理数据的压力,避免了报表服务器的在应用复杂业务逻辑处理报表数据时容易出现异常的问题。
结合图3,在前述结构基础上,报表的生成过程包括以下步骤:
步骤一、设置报表模板
模板文档可理解为其结构与最终所需的报表相关联,其中可具有多个单元格,例如可形成为表格,至少部分单元格中记载有对应的指令;其中部分单元格的内容可以是不变的,一行或一列中的第一个单元格,其可记录该行的含义,故而无需做数据的替换或合并,进而可以未记载有指令。
具体实施过程中,可对各单元格中的指令进行分类处理,进而分别构建普通指令集合与循环指令集合,通过指令集合的构建,可便于基于指令集合分别执行各集合的指令。
其中的变量值,可以是通过以下方式中至少一个得到的:
1)直接获取:基于此种类型的变量值替换单元格中记载的指令的过程,可理解为直接的变量值替换;
2)条件判断式获取:基于此种类型的变量值替换单元格中记载的指令的过程,当满足所需条件时进行变量值的替换,可理解为条件判断式的变量值替换;
3)循环获取:基于此种类型的变量值替换单元格中记载的指令的过程,依据循环式变化而确定的,可理解为循环式变量值替换;
4)自定义函数获取:基于此种类型的变量值替换单元格中记载的指令的过程,通过调用对应的自定义函数获取到的,可理解为基于自定义函数的变量值替换。
具体实施中,可使用以上任意一种或多种变量值与定值制作Excel报表模板文件。
步骤二、上传报表模板并设置上传属性
具体实施中,首先设置报表模板上传属性,具体属性为:模板所存放路径,模板名称,模板所属公司,模板所属车间,模板所属岗位等参数;设置报表自身存储属性,具体属性为:所属报表模板,数值,所属物料类型,所属列类型,数据时间等参数。
之后,将步骤1中生成的报表模板上传至报表引擎服务器中,并将添加一条报表模板上传属性的数据到报表服务器中,同时将报表模板文件存放到指定文件路径中。
步骤三、配置报表引擎
具体实施中,首先为每个报表模板配置定时任务,具体属性为:定时任务名,定时任务执行时间,所属岗位,执行的报表模板。
之后,执行定时任务,通过定时任务调用报表引擎接口,传入时间区间,所属车间,所属公司等参数到报表数据库中进行数据查询。报表数据库接收接口传输的参数进行SQL拼接,执行查询语句获取数据,并将数据进行封装后返回。报表引擎通过定时任务的接口获取由报表数据库查询返回的数据,并将其进行存储。根据传输的参数与从报表数据库中返回的数据进行比对,根据时间区间,所属车间等参数判断哪些报表已生成,若已生成报表则不做生成操作,防止报表重复生成,若无生成,则调用报表生成接口。
之后,根据定时任务关联的报表模板为参数,传入到报表数据库中,根据步骤2中设置的报表上传属性获取报表存放路径,通过获取的报表模板存放路径得到最终的报表模板文件,最后通过Apache POI接口生成Excel报表文件。其中的Apache POI,可理解为:是用Java编写的免费开源的跨平台的Java API,Apache POI提供了用于操作Microsoft Office的API接口。
生成Excel报表文件具体步骤如下:
首先通过Apache POI获取Excel报表模板的内容,获取报表中每个单元格中的数据。针步骤1中直接的变量值替换、条件判断式的变量值替换与循环式变量值替换,本领域技术人员在已知以上描述的情况下,可得到所需的方案,故而在此不做展开描述。以下主要针对于基于自定义函数的变量值替换进行描述。
自定义函数的变量值替换,可以通过正则表达式提取模板文件中函数表达式,进而可对提取的函数表达式进行存储,以便于逐一或并行进行计算。在此步骤之后,可包括:根据存储于预设的Jexl Context对象中的函数输入值,调用Java中相应的自定义方法,执行Java中对应的自定义方法具体步骤为:
首先获取自定义函数中传入的参数,如物料的名称,所属车间,所属设备等,执行其业务代码获取返回值,其中的返回值,可以是通过以下方式中至少一个得到的:
1)调用报表数据库获取:
将获取的自定义方法的参数传入到报表数据库中,通过物料的名称,所属车间,所属设备等参数获取返回的数据,对返回的数据可进行计算,转换,拼接等方式进行二次处理与封装,将最终的数据进行返回。
2)调用工业数据服务器获取:
将获取的自定义方法的参数进行封装处理,封装成Json格式数据,将封装后的数据传入到相应的工业数据服务器中的接口,并接受其接口返回的Json格式数据,之后,对接受到的Json格式数据进行二次处理,通过Apache Json接口将返回的数据进行转换,并获取所需结果值进行计算,转换,拼接等方式做最后的处理与封装,将最终的数据进行返回。
通过以上任意一种或多种方式得到对应的函数返回值作为所述当前变量值。可用函数返回值替换模板文档中的函数表达式。在替换的过程中通过Apache POI接口将模板文档中的内容实例化到内存中,进而基于以上所涉及的指令集合对指令进行执行。
若单元格中的内容中记载有合并指令,则将该单元格的列号记录于待垂直合并列号集合中。其中的合并指令可理解为任意的能将其所处的一列标识为待垂直合并的一列的数据,其可记载于该列中的任意一个单元格中,例如可利用单独一行表征该列是否需执行垂直合并的一列。具体实施过程中,合并指令可例如为${m}指令。进而,可判断单元格中是否有${m}指令,如果有则记录相应单元格所在的列号到待垂直合并列号集合中。之后,根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并。以上的垂直合并,可理解为在一列中,对于任意的多个内容相同的单元格,可将其进行合并。通过垂直合并,可便于使得表格整体更为逻辑清晰与美观,以使得最终的报表能更清楚地罗列数据。其中,垂直合并的具体处理逻辑可以是多样的,只要完成了垂直合并,就不脱离本实施例的描述。
根据所述待垂直合并列号集合,通过所述Apache POI进行单元格的垂直合并,具体步骤为:
根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格;针对每一个当前列,逐行遍历各行单元格;若需合并所述当前列的部分单元格,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列的部分单元格进行合并。
针对每一个当前列,逐行遍历各行单元格时,包括:
若第N行中单元格的数量不小于所述当前列的列号,且所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号不为预设值,则确定所述起始行号保持不变,且所述截止行号加一;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号为预设值,则将所述起始行号与所述截止行号置为N;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,然后将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号为所述预设值,则将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
若第N行单元格的数量小于所述当前列的列号,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI对所述当前列中对应的多个单元格进行合并,并在合并后将所述起始行号与所述截止行号置为所述预设值;
若第N行中单元格的数量小于所述当前列的列号,且当前的起始行号不小于截止行号,则继续遍历下一行单元格。
针对每一个当前列,逐行遍历各行单元格时,还包括:
针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI对所述当前列中对应的多个单元格进行合并。
针对每一个当前列,逐行遍历各行单元格时,还包括:
针对于所述当前行,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI被合并。所述预设值为-1。
步骤四、显示报表并提供编辑功能
具体实施后,步骤3中生成的报表可通过浏览器进行显示,供用户进行查阅,显示的同时,可对报表进行保存,单一计算,全部计算,重新获取等操作。具体步骤如下:
1)保存:
用户可对显示的报表中数值内容进行修改,修改完成后,可点击保存按钮进行存储操作,点击后会将数据发送到报表数据库中进行存储。
2)单一计算:
当用户对数据进行批量修改后,想将修改后的某一个单元格中的内容进行还原时,可选中此单元格,点击单一计算按钮,此单元格中的内容会还原成原始数据。
3)全部计算:
当用户对数据进行批量修改后,如若想将修改后的内容全部还原时,点击全部计算按钮,修改后的单元格中的内容会全部还原为原始数据。
4)重新获取:
当报表存在以下至少一种情况时,可使用,具体为:
1.当生成的报表内容存在异常时。
2.当报表内容修改一次或多次并保存后,还原成最原始数据时。
当存在以上一种或多种情况时,用户点击重新获取按钮,报表内容将全部重新生成,所有数据均将在报表数据库中被清除后重新添加。
在本公开中参照附图来描述本发明的各方面,附图中示出了许多说明的实施例。本公开的实施例不必定义在包括本发明的所有方面。应当理解,上面介绍的多种构思和实施例,以及下面更加详细地描述的那些构思和实施方式可以以很多方式中任意一种来实施,这是因为本发明所公开的构思和实施例并不限于任何实施方式。另外,本发明公开的一些方面可以单独使用,或者与本发明公开的其他方面的任何适当组合来使用。
虽然本发明已以较佳实施例揭露如上,然其并非用以限定本发明。本发明所属技术领域中具有通常知识者,在不脱离本发明的精神和范围内,当可作各种的更动与润饰。因此,本发明的保护范围当视权利要求书所界定者为准。
Claims (8)
1.一种工业数据自动生成报表***,其特征在于,所述***包括工业数据服务器、分布处理服务器、报表服务器、工业数据数据库和报表数据库;
所述工业数据服务器用于定时/实时从各个工业设备上采集对应数据结构的工业数据,将采集到的工业数据分配至若干个分布处理服务器,驱使每个分布处理服务器依据预先配置的数据处理规则对分配的工业数据进行处理,并且以预先配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中;
所述报表服务器用于根据预设的定时任务,选择其中一个自动生成的工业报表模板文件,从工业数据数据库中调取对应的工业数据,处理后填充或替换该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件,将生成的报表文件存储至对应的报表数据库中;
所述工业报表模板文件是以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,其中部分单元格设置有对应的计算策略;
所述外部自定义插件的类型包括:直接获取、条件判断式获取、循环获取和自定义函数获取;
所述直接获取是指直接的变量值替换;
所述条件判断式获取是指当满足设置条件时进行变量值的替换;
所述循环获取是指基于循环式变化进行变量值替换;
所述自定义函数获取是指通过调用对应的自定义函数进行变量值替换;
所述自定义函数获取是指,通过正则表达式提取工业报表模板文件中对应单元格的函数表达式,对提取的函数表达式进行存储,再逐一或并行进行以下操作:
根据存储于预设的Jexl Context对象中的函数输入值,调用并执行Java中相应的外部自定义插件;
所述根据存储于预设的Jexl Context对象中的函数输入值,调用并执行Java中相应的外部自定义插件的过程包括以下步骤:
S11,获取自定义函数中传入的参数,所述参数包括物料的名称、所属车间、所属设备,执行其业务代码获取函数返回值,所述函数返回值通过调用报表数据库或工业数据服务器得到;
S12,将得到的函数返回值作为当前变量值,替换工业报表模板文件中对应的函数表达式,其中,在替换的过程中,通过Apache POI接口将工业报表模板文件中的内容实例化到内存中,并且基于所涉及的指令集合执行对应的指令;
其中,当所述函数返回值通过调用报表数据库得到时,将获取的外部自定义插件的参数传入到报表数据库中,获取返回数据,对返回数据进行包括计算、转换、拼接在内的二次处理与封装,将封装后的数据作为函数返回值进行返回;
当所述函数返回值通过调用工业数据服务器得到时,将获取的外部自定义插件的参数进行封装处理,封装成第一Json格式数据,将封装后的第一Json格式数据传入到相应的工业数据服务器中,接收其返回的第二Json格式数据,再对接收到的第二Json格式数据进行二次处理,通过Apache Json接口将返回的数据进行转换,获取所需结果值,对结果值进行包括计算、转换、拼接在内的二次处理与封装,将封装后的数据作为函数返回值进行返回。
2.根据权利要求1所述的工业数据自动生成报表***,其特征在于,所述工业数据服务器包括工业数据接口、工业数据处理模块、工业数据建模模块和工业数据计算引擎;
所述工业数据接口分别与各个工业设备的数据接口对接,用于从各个工业设备处获取相关工业数据;
所述工业数据建模模块用于定义和配置每类工业数据的数据结构;
所述工业数据计算引擎用于对工业设备的处理策略进行配置,配置内容包括相关工业数据的数据处理规则、每个工业设备数据接口的调用频率、相关工业数据的生成时间;
所述工业数据处理模块分别于工业数据接口、工业数据建模模块和工业数据计算引擎连接,用于依据工业数据计算引擎配置的处理策略,在设定的时间范围内从各个工业数据接口中获取比对应的工业数据,将获取的工业数据分配至分布处理服务器中进行处理,以及以工业数据建模模块配置的数据结构为模板,对处理完成的工业数据进行封装,将封装后的工业数据录入至工业数据数据库中。
3.根据权利要求1所述的工业数据自动生成报表***,其特征在于,所述报表服务器包括工业报表模板生成模块、报表文件生成模块和定时任务设置模块;
所述工业报表模板生成模块用于以Excel表格为基础,在部分或全部Excel单元格中添加外部自定义插件,以及设置其中部分单元格的单元格计算策略,生成所需的工业报表模板文件,针对生成的工业报表模板文件设置对应的报表模板上传属性,将工业报表模板文件上传至报表文件生成模块中,并添加一条报表模板上传属性的数据在报表服务器内;
所述报表文件生成模块用于根据预设的定时任务,从报表模块数据库中选取其中一个工业报表模板文件,再从工业数据数据库中获取对应的数据以填充该工业报表模板文件中的部分或全部活动单元格,以生成最终的报表文件;
所述定时任务设置模块用于针对每个工业报表模板设置对应的定时任务,所述定时任务用于触发报表引擎接口,根据定时任务所包含的报表参数对报表数据库进行查询,判断对应的报表文件是否已经生成,当相关报表未生成时,通过报表生成接口调用报表文件生成模块,以该定时任务对应的工业报表模板为生成报表结构依据,读取工业报表模板每个单元格中所包含的外部自定义插件,从工业数据数据库中调取相应的工业数据并逐一填充至对应的单元格中,以及依据预设的单元格计算策略对部分单元格进行相关计算处理。
4.根据权利要求1所述的工业数据自动生成报表***,其特征在于,所述报表文件生成模块对各单元格中的外部自定义插件进行分类处理,分别构建普通指令集合和循环指令集合,根据构建的指令集合分别执行各集合的指令。
5.根据权利要求1所述的工业数据自动生成报表***,其特征在于,若单元格中的内容中记载有合并指令,将该单元格的列号记录于待垂直合并列号集合中,其中的合并指令是指任意的能将其所处的一列标识为待垂直合并的一列的数据,再针对所述待垂直合并列号集合,通过Apache POI接口进行单元格的垂直合并,所述垂直合并是指,在一列中,对于任意的多个内容相同的单元格进行合并。
6.根据权利要求5所述的工业数据自动生成报表***,其特征在于,所述针对所述待垂直合并列号集合,通过Apache POI接口进行单元格的垂直合并是指,根据所述待垂直合并列号集合中的列号,逐列遍历各列单元格,并根据实际合并属性对单元格进行相应的垂直合并操作;
其中,针对每一个当前列逐行遍历各行单元格的过程包括:
(1)若第N行中单元格的数量不小于所述当前列的列号,且所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号不为预设值,则确定所述起始行号保持不变,且截止行号加一;
(2)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容相同,且当前的起始行号为预设值,则将所述起始行号与所述截止行号置为N;
(3)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI接口对所述当前列中对应的多个单元格进行合并,再将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
(4)若第N行中单元格的数量不小于所述当前列的列号,所述当前列中第N行单元格的内容与当前的初始值的内容不同,且当前的起始行号为所述预设值,则将所述起始行号与所述截止行号均置为N,并将所述初始值置为所述当前列的第N行单元格的内容;
(5)若第N行单元格的数量小于所述当前列的列号,且当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过Apache POI接口对所述当前列中对应的多个单元格进行合并,并在合并后将所述起始行号与所述截止行号置为所述预设值;
(6)若第N行中单元格的数量小于所述当前列的列号,且当前的起始行号不小于截止行号,则继续遍历下一行单元格。
7.根据权利要求6所述的工业数据自动生成报表***,其特征在于,所述针对每一个当前列逐行遍历各行单元格的过程还包括:
(7)针对所述当前列遍历完所有行时,若当前的起始行号小于截止行号,则根据当前的起始行号与截止行号,通过所述Apache POI接口对所述当前列中对应的多个单元格进行合并;
(8)针对于当前行,若第M行单元格的内容为null,则将所述第M行单元格的内容赋值为空,以使得连续的多个赋值为空的单元格能够通过所述Apache POI接口被合并,所述预设值为-1。
8.根据权利要求1所述的工业数据自动生成报表***,其特征在于,所述报表服务器包括报表显示和编辑模块,用于将生成的报表文件通过浏览器进行显示,并提供相应的编辑功能入口,所述编辑功能包括保存、单一计算、全部计算和重新获取;
所述保存功能用于将生成的报表文件存储至报表数据库;
所述单一计算功能用于将用户选择的其中一个修改后的单元格的内容还原成原始数据;
所述全部计算功能用于将修改后的全部单元格的内容还原成原始数据;
所述重新获取功能用于当报表内容存在异常或报表内容经一次或多次修改保存后还原成原始数据时,清除报表数据库中已保存的报表文件中的所有数据,并进行重新添加。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010405791.1A CN111538731B (zh) | 2020-05-14 | 2020-05-14 | 一种工业数据自动生成报表*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010405791.1A CN111538731B (zh) | 2020-05-14 | 2020-05-14 | 一种工业数据自动生成报表*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111538731A CN111538731A (zh) | 2020-08-14 |
CN111538731B true CN111538731B (zh) | 2023-08-29 |
Family
ID=71968026
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010405791.1A Active CN111538731B (zh) | 2020-05-14 | 2020-05-14 | 一种工业数据自动生成报表*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111538731B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112528613A (zh) * | 2020-12-21 | 2021-03-19 | 金蝶软件(中国)有限公司 | 一种数据表生成方法及其相关设备 |
CN112686010B (zh) * | 2020-12-23 | 2024-03-01 | 江苏苏宁云计算有限公司 | 资源数据报表生成方法、装置、计算机设备和存储介质 |
CN113706088A (zh) * | 2021-01-23 | 2021-11-26 | 深圳市玄羽科技有限公司 | 一种工业数据自动生成报表*** |
CN113536753B (zh) * | 2021-07-05 | 2024-05-14 | 无锡信捷电气股份有限公司 | 一种可自由配置的配方管理*** |
CN114217722B (zh) * | 2021-12-22 | 2024-05-17 | 沈阳东睿科技有限公司 | 一种基于动态绑定的发动机卷宗数据自动采集方法 |
CN115118611A (zh) * | 2022-06-24 | 2022-09-27 | 中国工商银行股份有限公司 | 一种软件sdn网络规格统计方法及*** |
CN116389579A (zh) * | 2023-03-22 | 2023-07-04 | 安芯网盾(北京)科技有限公司 | 一种基于微服务的报表生成方法及*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107423272A (zh) * | 2017-04-21 | 2017-12-01 | 广东浪潮大数据研究有限公司 | 一种基于excel的报表生成方法及其装置 |
CN109614424A (zh) * | 2018-11-28 | 2019-04-12 | 南京赛克蓝德网络科技有限公司 | 页面布局生成方法、装置、计算设备和介质 |
CN110618983A (zh) * | 2019-08-15 | 2019-12-27 | 复旦大学 | 基于json文档结构的工业大数据多维分析与可视化方法 |
CN111144083A (zh) * | 2019-12-20 | 2020-05-12 | 腾讯科技(深圳)有限公司 | 一种报表的生成方法、装置、设备及计算机可读存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050234886A1 (en) * | 2004-04-16 | 2005-10-20 | Karim Mohraz | Report designer tool and method |
US20190156302A1 (en) * | 2017-11-20 | 2019-05-23 | Royal Bank Of Canada | System and method for e-receipt platform |
-
2020
- 2020-05-14 CN CN202010405791.1A patent/CN111538731B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107423272A (zh) * | 2017-04-21 | 2017-12-01 | 广东浪潮大数据研究有限公司 | 一种基于excel的报表生成方法及其装置 |
CN109614424A (zh) * | 2018-11-28 | 2019-04-12 | 南京赛克蓝德网络科技有限公司 | 页面布局生成方法、装置、计算设备和介质 |
CN110618983A (zh) * | 2019-08-15 | 2019-12-27 | 复旦大学 | 基于json文档结构的工业大数据多维分析与可视化方法 |
CN111144083A (zh) * | 2019-12-20 | 2020-05-12 | 腾讯科技(深圳)有限公司 | 一种报表的生成方法、装置、设备及计算机可读存储介质 |
Non-Patent Citations (1)
Title |
---|
许南山 ; 孙风平 ; .基于XML的可复用报表生成***的设计与实现.计算机工程与设计.2006,(第03期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN111538731A (zh) | 2020-08-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111538731B (zh) | 一种工业数据自动生成报表*** | |
CN105700888B (zh) | 一种基于jbpm工作流引擎的可视化快速开发平台 | |
CN108804630B (zh) | 一种面向行业应用的大数据智能分析服务*** | |
CN104778540A (zh) | 一种建材装备制造bom管理方法及管理*** | |
CN104778124A (zh) | 一种软件应用自动化测试方法 | |
CN113032633B (zh) | 一种利用引用数据项自定义表格的方法 | |
CN111178688A (zh) | 电力技术监督数据的自助化分析方法、***、存储介质及计算机设备 | |
CN112286957A (zh) | 基于结构化查询语言的bi***的api应用方法及*** | |
CN105279269A (zh) | 一种支持表自由关联的sql生成方法和*** | |
CN113947468B (zh) | 一种数据管理方法及平台 | |
CN113806429A (zh) | 基于大数据流处理框架的画布式日志分析方法 | |
CN115657890A (zh) | 一种pra机器人可定制方法 | |
CN103186713A (zh) | 用于整体设备效率分析的方法和应用 | |
CN111190814A (zh) | 软件测试用例的生成方法、装置、存储介质及终端 | |
CN114328452A (zh) | 数据稽核方法、装置、平台、电子设备及存储介质 | |
WO2020259155A1 (zh) | 一种生成告警数据报表的方法及装置 | |
US8918410B2 (en) | System and method for fast identification of variable roles during initial data exploration | |
CN114780074B (zh) | 一种用于实现大数据分析的信息计算***及构建方法 | |
CN113688141B (zh) | 一种应用功能设计方法及软件开发平台 | |
CN115757481A (zh) | 数据迁移方法、装置、设备和存储介质 | |
CN114090583A (zh) | 一种跨业务***订单数据分析方法和装置 | |
CN114860851A (zh) | 数据处理方法、装置、设备及存储介质 | |
CN112764396B (zh) | 一种组态方法和装置 | |
CN117829574B (zh) | 一种缝制工序时间确定方法及*** | |
CN117934663B (zh) | Dcs画面中图元拖拽生成曲线的方法、***、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |