本发明涉及一种线上服务端大量公式迭代计算方法。
背景技术:
近年来,大数据在线使用频繁,这为业务中接入了海量数据,然而,由于线上平台表格数据计算太过于单一机械,导致数据计算不够快速高效,而且容易忽略数据的计算精度要求、对于亿级的计算没有明确的公式定义和规范。web端计算经常会出现计算精度不够准确,计算效率不高,对于经常遇到的海量数据计算以及数据计算校验需操作人精神高度集中处理。从以往经验来看,对于数据重复、机械性很强,而且没有在线即时存储、目标范围准确快速计算和全局高效存储。本设计满足客户的实际运算要求,计算数值准确,逻辑清晰;在程序设计上简洁明了,易维护,运行效率高,高度结构化,层次化清晰。因此,传统的线上数据计算太依赖于业务规定范畴,缺乏规范性、简易性、快速高效、科学性和灵活性。
技术实现要素:
针对上述问题,本发明提供一种线上服务端大量公式迭代计算方法,包括:
管理公式的数据库设计;
公式和数据的定位以及坐标定义;
单一计算逻辑;
获取用户单元格位置和值并进行分离计算;
根据用户录入的数据和公式进行计算将其影响的区域和业务关系关联的值进行计算和存储;
将用户复制粘贴的数据进行计算并存储;
通过业务分析动态修改公式并计算存储数据;
通过页面计算按钮触发,进行循环计算求解;
实现分布式存储;
实现扩散计算;
实现协同作业。
对于公式中暗藏的业务关系设计在数据库中,数据库设计以树形数据结构进行设计,从而进行海量公式的迭代计算;
根据其公式定义的灵活性来设计和其海量公式的特征,使公式定义更灵活;
公式和赋值获取之后快速计算得出结果;
采用redis和rabbitmq进行分布式存储;
采用正则方法灵活匹配数据所在坐标,通过键值对的数据格式如:键:***a5,值为单元格所对应的公式数据,匹配到所要执行的公式进行替换公式中变量和动态公式,再由jep执行计算表达式得出结果;
公式的定义为excel的表达式方式,其中需要对动态修改的公式进行特殊的命名以“【】”进行标识;
将原有业务的excel工作表公式导入数据库进行清洗后方可持久化存储进行备用。
进一步地,采用单一逻辑与公式设计相结合匹配成循环公式其中方法包括:
起始公式定义,循环计算开始对起始单元格进行赋值通过设计的树形计算逻辑开始迭代,最终结果值正确则停止迭代,并对循环计算的所有公式进行赋值,得出各迭代公式中所有值的最终结果进行持久化存储。
进一步地,矩阵数据批量计算包括:
接收其执行粘贴操作,获取当前操作所有数据的所有坐标和数值;
根据所有坐标和数值得集合进行循环执行,后将数据分发到mq队列进行持久化,将结果发送大ui端进行web页面渲染;
excel中计算时循环公式计算,例如“a8=a9 a10,a9=(a8 a7)*a3”等循环引用公式,此种公式如用循环计算时控制其计算100次,在计算开始时给变量赋初值“1-10”,再执行;
公式之间的相互引用处理和本sheet页面之间的计算公式,如“资产负债表a10=利润表b10”,”利润表b10=现金流b15*c15”这样的公式之间采用相互引用方式,在实际的业务逻辑中引用可以达到几十个公式,从而形成链条计算,当不同的用户修改单元格时,系统采用了分布式设计,相互之间不受影响,也不会影响最终的计算结果;
在数据库设计上以树形结构的方式进行设计,在公式识别计算上链式计算以各个公式间的相互影响列来决定,配合程序设计上的递归运算,采取尾递归的方式成网状结构散开,例如:a影响b>b影响c>c影响d,这样的链式结构计算具体运算过程如下:
前端参数为a的相关参数,获取到a的公式,数值,影响列这些内容在内存中,使用的是java的ehcache缓存是一个纯进程中的缓存,在数据获取上效率很高,简单易操作;
当计算完a的相关公式后,将其影响的单元格信息存储到一个list的数组结构中用于下次计算,如此迭代计算一直计算至最终完全没有影响的单元格为止迭代结束;
在计算的时候涉及到持久化mysql数据库中的一系列sql语句的执行,会严重影响用户体验,在设计上采用了以消息队列的方式进行数据库和前端页面数据进行同步。
与现有技术相比,本发明的有益效果是:快速计算,求值精度高,在计算过程中使用bigdecimal,已经包含了常用的数学函数和运算符,支持布尔型表达式,具有良好的可扩展性和可配置性,提供修改功能,保持程序的灵活性和可扩展性。在新增自定义字段或者改变计算公式时,无需修改代码,只需要重新对计算公式进行配置即可。支持多人同时操作作业界面,协同作业。
附图说明
图1为本发明提供的整个计算方法的流程图;
图2为单一计算逻辑流程图;
图3为数据库设计的说明图;
图4为jep计算设计流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施一种线上服务端大量公式迭代计算方法:具体步骤如下:
s1、获取用户在约定位置录入的数据和其坐标定位,此数据为用户所需要数据,定位是以三维坐标形式对数据和公式进行统一定位,如“***a3:89”则表示某页面上a列第三行的数据为89,公式形式为“***d9=***a3 ***b5”表示两值求和通过约定的坐标形式进行数据和公式的一一匹配;
s2、1、其中匹配坐标运用的是正则坐标分离法;
2、在替换公式中变量值是分类定义包括:
2.1动态公式替换是使用“【基准日】”来标识具体的替换变量内容;
2.2公式中以“财务费用w42=财务费用w36 财务费用w39”其中“财务费用w42”为计算的结果项,“财务费用w36”和“财务费用w39”为已知项,将“财务费用w42=”后的定位标识替换为数据则为“9 9”结果为“财务费用w42=18”;
s3、关于redis中数值的存储是应对业务人员在协同作业时分担数据库的压力,redis中数据走向为初次导入数据时,redis数据进行更新,客户修改数据时更新,数据计算完毕持久化操作时进行更新,以便保证客户端、服务端、数据库端redis中数据一致,从而保证数据计算时得出的结果准确无误;
s4、通过正则替换公式的变量得出可执行的计算表达式:
1.正则分离中对坐标进行正则识别;
2.校验坐标是否合规;
3.通过识别不同页面的业务需求,从而动态处理公式,如:营业收支中对所有产品的成本合计和营业额合计计算时所有公式都是动态生成,因业务操作是灵活动态;
4.“【】”标识替换公式需根据具体计算模板来替换,充当固定业务变量;
5.对于三目运算表达式则是根据jep运算规则进行定义;
s5、在生成jep可执行的数学表达式之后,进行分类执行,将结果处理成正常数值展示并进行持久化,在计算出异常后以0处理;
s6、在计算过程中,同样以坐标定义的方式进行拼接持久化语句,将持久化语句发送给消息队列进行持久化操作,避免操作数据太多页面响应时间太长;
s7、计算详细过程中是以链式结构进行运行,采取了递归的程序设计,涉及到一个单元格会影响到多个单元格,逐步向外扩散。
s8、将计算影响到的单元格数值以及其坐标为key返回web端给web端人员进行处理。
以上是对本发明的实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。
1.一种线上服务端大量公式迭代计算方法,包括如下步骤:
管理公式的数据库设计;
公式和数据的定位以及坐标定义;
单一计算逻辑;
获取用户单元格位置和值并进行分离计算;
根据用户录入的数据和公式进行计算将其影响的区域和业务关系;
关联的值进行计算和存储;
将用户复制粘贴的数据进行计算并存储;
通过业务分析动态修改公式并计算存储数据;
通过页面计算按钮触发,进行循环计算求解;
实现分布式存储;
实现扩散计算;
实现协同作业;
对于公式中暗藏的业务关系设计在数据库中,数据库设计以树形数据结构进行设计,从而进行海量公式的迭代计算;
根据其公式定义的灵活性来设计和其海量公式的特征,使公式定义更灵活;
公式和赋值获取之后快速计算得出结果;
采用redis和rabbitmq进行分布式存储;
采用正则方法灵活匹配数据所在坐标,通过键值对的数据格式如:键:***a5,值为单元格所对应的公式数据,匹配到所要执行的公式进行替换公式中变量和动态公式,再由jep执行计算表达式得出结果;
公式的定义为excel的表达式方式,其中需要对动态修改的公式进行特殊的命名以“【】”进行标识;
将原有业务的excel工作表公式导入数据库进行清洗后方可持久化存储进行备用。
2.根据权利要求1所述的方法,其特征在于,所述采用单一逻辑与公式设计相结合匹配成循环公式其中方法包括:
起始公式定义,循环计算开始对起始单元格进行赋值通过设计的树形计算逻辑开始迭代,最终结果值正确则停止迭代,并对循环计算的所有公式进行赋值,得出各迭代公式中所有值的最终结果进行持久化存储。
3.根据权利要求1所述的方法,其特征在于,所述矩阵数据批量计算包括:
接收其执行粘贴操作,获取当前操作所有数据的所有坐标和数值;
根据所有坐标和数值得集合进行循环执行,后将数据分发到mq队列进行持久化,将结果发送大ui端进行web页面渲染;
excel中计算时循环公式计算,例如“a8=a9 a10,a9=(a8 a7)*a3”等循环引用公式,此种公式如用循环计算时控制其计算100次,在计算开始时给变量赋初值“1-10”,再执行;
公式之间的相互引用处理和本sheet页面之间的计算公式,如“资产负债表a10=利润表b10”,”利润表b10=现金流b15*c15”这样的公式之间采用相互引用方式,在实际的业务逻辑中引用可以达到几十个公式,从而形成链条计算,当不同的用户修改单元格时,系统采用了分布式设计,相互之间不受影响,也不会影响最终的计算结果;
在数据库设计上以树形结构的方式进行设计,在公式识别计算上链式计算以各个公式间的相互影响列来决定,配合程序设计上的递归运算,采取尾递归的方式成网状结构散开,例如:a影响b>b影响c>c影响d,这样的链式结构计算具体运算过程如下:
前端参数为a的相关参数,获取到a的公式,数值,影响列这些内容在内存中,使用的是java的ehcache缓存是一个纯进程中的缓存,在数据获取上效率很高,简单易操作;
当计算完a的相关公式后,将其影响的单元格信息存储到一个list的数组结构中用于下次计算,如此迭代计算一直计算至最终完全没有影响的单元格为止迭代结束;
在计算的时候涉及到持久化mysql数据库中的一系列sql语句的执行,会严重影响用户体验,在设计上采用了以消息队列的方式进行数据库和前端页面数据进行同步。
技术总结