一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种业务系统函数动态执行方法与流程

2022-07-02 12:08:04 来源:中国专利 TAG:


1.本发明设计erp企业管理软件领域,具体涉及一种业务系统函数动态执行方法。


背景技术:

2.在erp系统中,实施部署历来是重中之重,在标准产品的基础上,项目经理、实施顾问会根据客户现场调研的情况,对标准产品的功能进行调整,来适配客户的实际场景,目前大部分厂商通过提供一些低代码工具,可以支持动态的调整数据库表字段、模型和界面,但是对于业务逻辑一般无法进行调整,一般这种情况下,需要与客户签订二次开发合同,由开发人员驻场开发或者远程开发,来以此满足客户需求,开发完成后,将新的代码程序进行打包,制作成为程序补丁,在客户的生产环境中进行补丁安装,以此来达到客户的需求。这种方式工作量大,工作周期长,一般情况下,最快也需要3~10天的周期,多者甚至可达数月之久,且开发完成后实施过程中可能会多次反复调整,这就对项目交付的周期带来了极大的拖延的风险,客户的满意度容易变低。


技术实现要素:

3.为解决以上问题,本发明提出一种业务系统函数动态执行方法,包括:
4.根据业务系统的源代码创建对象池;
5.将所述源代码加载到内存以生成内存对象,将所述内存对象关联到所述对象池,并通过所述对象池提供所述内存对象的调用索引;
6.响应于所述业务系统的源代码发生更改,将更改后的源代码加载到内存以生成新的内存对象;以及
7.将所述新的内存对象更新到所述对象池,并更新对应的调用索引。
8.在本发明的一些实施方式中,根据所述业务系统的源代码的结构创建对象池包括:
9.获取所述业务系统中每一个模块的源代码文件;
10.以所有所述源代码文件中的代码结构为基础创建对象池。
11.在本发明的一些实施方式中,以所有所述源代码文件中的代码结构为基础创建对象池包括:
12.以所述源代码文件中的类为基础创建对象池;以及
13.响应于所述模块关联的源代码文件中存在非类结构的代码,以所述源代码文件为基础创建对象池。
14.在本发明的一些实施方式中,将所述源代码加载到内存以生成内存对象,将所述内存对象关联到所述对象池包括:
15.将所述源代码以方法为单位加载到内存中并将所述方法在内存的内存地址绑定到所述对象池中。
16.在本发明的一些实施方式中,方法还包括:
17.根据所述对象池创建对象池关联数据库;
18.分析所述对象池对应的源代码的关键信息,并将所述关键信息保存到所述对象池关联数据库。
19.在本发明的一些实施方式中,方法还包括:
20.从所述对象池关联数据库中加载对应的源代码到内存以生成所述源代码对应的内存对象,并将所述内存对象关联到所述对象池。
21.在本发明的一些实施方式中,方法还包括:
22.提供远程代码修改接口,通过所述修改接口对所述对象池关联数据库中的源代码进行更新和/或创建;
23.将所述更新和/或创建后的源代码加载到内存中生以生成新的内存对象;
24.将所述新的内存对象绑定到所述对象池。
25.在本发明的一些实施方式中,方法还包括:
26.响应于所述业务系统的源代码发生更改,对更改后的源代码进行安全校验;
27.将所述安全校验结果为通过的源代码加载到内存并保存到对象池关联数据库。
28.在本发明的一些实施方式中,方法还包括:
29.记录所述内存对象的调用时间,响应于所述内存对象在预定时间内未被调用,将所述对象池中的所述内存对象释放。
30.在本发明的一些实施方式中,方法还包括:
31.将所述内存对象的源代码添加到对象池,响应于所述对象池不存在所述内存对象,对象池从所述对象池中将所述内存对象对应的源代码加载到内存中生成对应的内存对象。
32.通过本发明提供的一种业务系统函数动态执行方法,支持无需新增代码文件而新建一个新的业务函数,并将其挂载至业务单据上实现新功能;支持无需重新部署代码而修改已有的业务函数逻辑,以此来修改已有的功能;业务功能的变更在saas部署下可以实现基于租户的隔离,彼此之间的变更不会互相影响。对于客户多变的需求,可快速根据需要进行现场快速定制,并直接应用到客户的业务系统。
附图说明
33.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
34.图1为本发明实施例提供的一种业务系统函数动态执行方法的流程图;
35.图2为本发明实施例提供的一种业务系统函数动态执行方法的实施例示意图;
36.图3为本发明实施例提供的一种业务系统函数动态执行方法的实施例示意图。
具体实施方式
37.为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明实施例进一步详细说明。
38.需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。
39.目前的erp系统中,对于客户的个性化需求,一般包含如下几个层面:界面样式和个性化字段层面,单据和资料的数据流转层面,个性化业务逻辑。对于前两者,业内厂商常会提供实施工具来进行满足,如低代码平台、表单工具、工作流工具、单据转换工具等,这些工具均可以支持在客户现场,不调整代码的情况下,根据客户需求进行快速调整来进行满足,对于个性化的业务逻辑开发,目前尚无较好的实现方案,可以实现快速调整。一般常规的做法是,与客户签订二次开发合同,由实施顾问或者开发工程师根据客户需求,进行编码,形成代码文件,按照软件补丁发布流程,制作通用或者私有补丁,并对补丁进行测试,测试通过后再给客户进行补丁安装部署,完成业务需求。
40.之所以无法形成较好的个性化业务逻辑动态调整,可能的原因如下:首先,受制于编程语言的现状,目前常用的编程语言分为编译型语言和解释型语言,一般编译型语言需要使用编译器对源代码首先翻译成机器码,而后运行时再执行机器码来实现功能,解释型语言无需提前编译,但仍需交由解释器逐行对源代码文件进行读取、翻译并交由cpu执行,这两种编程语言风格均需要先由开发人员编写源代码,源代码一经部署,无法在运行期进行动态变更,因此无法在客户不修改代码的情况下就实现对业务逻辑的修改,也就实现实时调整erp的动态业务函数。
41.如图1所示,本发明提出一种业务系统函数动态执行方法,包括:
42.步骤s1、根据业务系统的源代码创建对象池;
43.步骤s2、将所述源代码加载到内存以生成内存对象,将所述内存对象关联到所述对象池,并通过所述对象池提供所述内存对象的调用索引;
44.步骤s3、响应于所述业务系统的源代码发生更改,将更改后的源代码加载到内存以生成新的内存对象;以及
45.步骤s4、将所述新的内存对象更新到所述对象池,并更新对应的调用索引。
46.在本发明的实施例中,在步骤s1中,基于本发明方法实现的系统的软件主进程,会依次扫描注册到系统的模块列表,按照模块的依赖顺序,依次加载模块下的代码,以python语言为例,主要通过模块目录下的__init__.py文件来描述本模块下哪些类文件被载入。根据各个模块目录下的代码中的业务逻辑结构创建对象池,即对象池中也存在多个模块,该多个模块与项目中各个模块一一对应,每个模块下所述的对象也与项目中各个模块中源代码一一对应。对象池中对象与项目的各个模块的关系一一对象。
47.在步骤s2中,在对象池构建完成之后,将源代码加加载到内存中生成内存对象,并将内存对象内存中的地址绑定到对应的对象池中的对应的对象。当需要到该内存对象时通过对象池中对应的对象找到该对象对应的在内存中的内存对象执行相应的逻辑实现业务需要。内存对象是指由源代码加载到内存中的具备一定逻辑处理能力的程序。
48.在步骤s3和s4中,如果系统中某个模块或者某个模块内部的部分代码发生更改,则直接将更改后的代码加载到内存中生成新的内存对象,然后在将新的内存对象的地址绑定到对象池中对应的对象上。在后续调用该对象时,直接指向该对象在内存中的新的内存对象,由新的内存对象来实现对业务逻辑更改后的功能。因此,在需求变更时可直接将修改
后的代码加载到内存使用,直接实现相应的功能的灵活变更。
49.在本发明的一些实施方式中,根据所述业务系统的源代码的结构创建对象池包括:
50.获取所述业务系统中每一个模块的源代码文件;
51.以所有所述源代码文件中的代码结构为基础创建对象池。
52.在本发明的一些实施方式中,以所有所述源代码文件中的代码结构为基础创建对象池包括:
53.以所述源代码文件中的类为基础创建对象池;以及
54.响应于所述模块关联的源代码文件中存在非类结构的代码,以所述源代码文件为基础创建对象池。
55.在本发明的一些实施方式中,将所述源代码加载到内存以生成内存对象,将所述内存对象关联到所述对象池包括:
56.将所述源代码以方法为单位加载到内存中并将所述方法在内存的内存地址绑定到所述对象池中。
57.在本实施例中,软件的主进程会维护一个对象池,将所有扫描后的类对象、类对象的字段属、类对象的方法加入到对象池中。以弥补了python解释器对于对象管理的不足,将系统中的业务对象做了预缓存,确保对象使用时可直接从内存中读取。对象池中的对象,会给它命名一个全局唯一的key,系统内部需要取用此对象时,会通过key获取到该对象,该对象的字段属性、方法都是由一个模板基类复制出来的,包含有基类的属性,如id、创建时间、创建人、修改时间修改人这四个基本属性,以及模板基类的通用方法,如create(创建)、write(更新)、search(搜索)、search_count(计数)、browse(获取单条详情)、submit(提交)、approve(审核)、delete(逻辑删除)、submit_cancel(取消提交)、approve_cancel(取消审核)等。
58.在本发明的一些实施例中,根据源代码文件中定义的对象属性和对象方法,将对象特殊的属性和方法绑定到该内存对象池的对象中,如凭证对象会有凭证字属性、业务日期属性、审核人、提交人、凭证编号属性等
59.以及,会根据源代码文件中定义的对象的自定义方法绑定到内存对象池的对象中,如凭证对象会有凭证过账方法、凭证审核方法、凭证冲销方法等。
60.具体的,以python语言为例,在将对象方法加入到对象池之前,即可实现对于静态代码的读取,可以采用python语言内建函数getattr()来实现,getattr()函数用于返回一个对象属性值,因静态代码在经过解释器扫描后变成为一个内存对象,通过这个方法即可获得这个对象。
61.在本发明的一些实施方式中,方法还包括:
62.根据所述对象池创建对象池关联数据库;
63.分析所述对象池对应的源代码的关键信息,并将所述关键信息保存到所述对象池关联数据库。
64.在本实施例中,根据对象池创建对象池关联数据库是将对象池中的对象信息以数据库的方式进行另存。将所述对象池中对象的信息以及对象的结构关系通过数据库的方式保存,保存的关键信息包括但是不限制于如下的属性:
65.a)函数名称,即函数的业务名称,用于管理时方便查询,可在函数编码时候通过特殊标记符进行标记,如未标记,则等于该函数的技术名称;
66.b)函数所属的模型名称,即对象名称,用于管理时方便按照对象查找;
67.c)函数所属的模块名称,即模块名称,用于管理方便按照模块查找;
68.d)函数的技术名称,即函数的def对应的名称,用于执行时通过getattr获取;
69.e)函数的入参列表,即def时的入参列表,用于执行时校验以及管理时排查;
70.f)函数的源代码内容,即源代码,用于管理时查看,同时提供编辑功能,可用于运行时定制;
71.g)函数所属的服务器文件路径以及文件名称,即源代码对应的物理文件路径,一旦源代码修改后异常,可快速通过该路径获取到源文件并进行还原。
72.h)函数的mro继承链列表,即对应到python的mro继承链,用于管理时快速定位问题,同时,继承链的顺序也会控制只能末级继承才可修改代码,防止异常情况。
73.在本发明的一些实施例中,将对象池的关键信息保存到数据库表中,并对数据库表进行一些扩展,增加如下字段包括:
74.a)主键id;
75.b)上述罗列的关键信息(属性);
76.c)租户id;
77.d)是否动态修改标志位(主要用于区分是否后期实施人员动态修改过本函数);
78.根据模型名、函数名称检索到数据库中是否已经存在该函数对象对应的数据库表行条目,如果已经存在,则需要判断是否动态修改过标志位,如果修改过,则应以数据库为准,不进行更新,如果未修改过,则以静态代码为准进行更新;如果不存在条目,则将其插入数据库进行持久化存储。
79.在本发明的一些实施方式中,方法还包括:
80.从所述对象池关联数据库中加载对应的源代码到内存以生成所述源代码对应的内存对象,并将所述内存对象关联到所述对象池。
81.在本实施例中,对象池关联数据库中保存有系统所有的源代码,在系统部署或者系统的部分代码被远程修改时,可通过数据库中的代码进行直接加载到内存中。具体地以python语言为例,可通过python内置函数exec将源代码以字符串的方式从数据库中读出,并作为exec函数的参数加载到内存中以此部署整个系统或者对某些功能的代码进行修改后生成内存对象更新到对象池。本实施例中,exec函数是python内置函数,可以将一个字符串类型的源代码在运行期动态编译成可执行的内存程序。
82.在本发明的一些实施方式中,方法还包括:
83.提供远程代码修改接口,通过所述修改接口对所述对象池关联数据库中的源代码进行更新和/或创建;
84.将所述更新和/或创建后的源代码加载到内存中生以生成新的内存对象;
85.将所述新的内存对象绑定到所述对象池。
86.在本实施例中,基于对象关联数据库的结构提供远程修改代码的接口,包括以函数为粒度提供接口,并将可用于远程修改的函数称为动态函数。同时提供搜索接口为查询该函数提供快速定位,搜索的方式可以根据上述实施例中在建立对象时采集的该对象所对
应的关键信息进行搜索,在搜索后确定对应的动态函数之后,便可对该动态函数进行修改,在动态函数管理界面方便在客户现场进行快速定制和修改,管理界面提供列表界面,列表界面支持筛选,可以按照模块名称、模型名称、函数名称、函数所属的服务器文件路径和名称等进行过滤筛选。进一步管理界面支持点击列表中的某一条目来穿透至业务函数数据的详细界面,在详细界面中,可以查看、修改并编辑已经存储的数据,其中有一些字段是设置保护的,如函数所属的模块、函数所属的模型,这些字段不支持动态调整。在业务函数详细界面中,可以设置业务函数的激活状态,只有激活状态的函数才会在启动时挂载至业务模型中,并可以执行和调用。业务函数可以在激活和冻结状态来回切换,来满足实际的业务需求。
87.在本发明的一些实施例中,如图3所示,通过web界面提供对该动态函数的源代码内容的修改接口。修改完成后可直接点击对应的运行按钮,便可直接将修改后的该动态函数通过exec函数加载到内存中生成内存对象,进一步将内存对象关联的对象池,当业务系统发生对该动态函数的调用时,便将重新生成的内存对象的地址反馈给调用者传递相应的参数执行。
88.在本发明的一些实施例中,动态函数一般规定为对其修改影响其他函数运行的函数,通常是在类的多继承结构中继承关心最低的类的函数,对其修改只会影响该类的实例对应的功能,而不会影响其他类的实例的运行。
89.此外,当业务需求的变化需要涉及修改函数在类继承关系中属于父类的方法关系时,需要从该类的子类整体考虑再进行修改。同时对于这种修改需要在对象池关联数据库中设定修改者的权限进行控制,防止被人恶意修改导致业务系统出现异常。
90.在本发明的一些实施例中,动态函数的范围有对象池中对象的mro继承链进行判断,可通过对应的继承关系确定动态函数所属的类是否存在子继承的类,如果存在则将该类所有的方法均设置为非动态函数。
91.在本发明的一些实施方式中,方法还包括:
92.响应于所述业务系统的源代码发生更改,对更改后的源代码进行安全校验;
93.将所述安全校验结果为通过的源代码加载到内存并保存到对象池关联数据库。
94.在本实施例中,当有业务系统的源代码发生更改后,对于更改后的代码执行安全校验操作,包括如下的关键元素的校验:
95.a)校验函数命名是否正确,主要确保不会和已有的数据重复,是否有敏感词以及系统保留词
96.b)校验函数的入参变量是否准确,主要确保多个入参之间不能重名,入参是否含有敏感词和系统保留词
97.c)校验源代码的合法性,在新编写的源代码,是否引用系统预置的黑名单类库,是否包含危险操作,是否调用了一些高风险的系统函数等。
98.d)基于c)步骤,需要维护黑名单类库列表,如sys、os等,这些类库权限极大,可以重启服务器、删除服务等,如使用不慎,容易带来安全隐患。
99.e)校验源代码的合法性,主要检查语言,在python版本实现中,主要考虑使用pep8(python语言的源代码标准)规范来检查代码是否合法。
100.另外,在本发明的一些实施例中,在动态函数的管理界面中,在业务函数列表界面
和详情界面,可以选中某一条目函数,进行复制操作,复制的函数,会自动添加_copy后缀,确保不会出现同名函数,且默认情况下复制的函数是冻结状态,不是可以直接执行的,需要开发人员调整后并通过了合法性检查后才可以启用。
101.进一步,在业务函数列表界面提供新增业务函数的功能,点击该功能后,进入新增函数的界面,依次选择模块、模型,填写其他必要的字段后,进行上述所描述的校验,校验通过后,可以保存成功。在本发明的一些实施方式中,方法还包括:
102.记录所述内存对象的调用时间,响应于所述内存对象在预定时间内未被调用,将所述对象池中的所述内存对象释放。
103.在本实施例中,统计对象池中对应的内存对象的调用情况,每当内存对象被调用时,开始计时,发生一次调用则将重新开始计时,当计时的值超过预定值时,表示该内存对象被使用的热度较低,则将该内存对象从内存中释放。
104.在本发明的一些实施方式中,方法还包括:
105.将所述内存对象的源代码添加到对象池,响应于所述对象池不存在所述内存对象,对象池从所述对象池中将所述内存对象对应的源代码加载到内存中生成对应的内存对象。
106.在本实施例中,将内存中运行的内存对象对应的源代码也添加到对象池,如果对象池中绑定的内存对象为空,例如在一些情况下,该内存对象对应的函数长时间没有被调用而被释放,在突然被调用时,该对象池不存在该函数的内存对象需要获取对应的源代码加载到内存中,这种情况下可直接从对象池中为该对象保存的源代码,将源代码直接加载到内存中生成内存对象,然后将该内存对象绑定到该对象池。便可直接调用执行。
107.在本发明的一些实施例中,本发明还提供了在运行期按照租户隔离动态函数代码的功能。
108.一般情况下,在客户的环境中,会存在多个账套(账套是指,系统提供者所服务的不同的客户,例如为多个企业维护的相同的erp业务系统),不同账套之间,同一个业务模型的同一个方法可能会存在不同的业务实现,如果不加以隔离,将会造成功能实现出现混乱,导致业务发生的错误。本发明充分考虑了此种情况,提供了在同一个应用服务器上,按照不同的租户进行隔离的功能,具体功能架构可以参考附图2。
109.在业务系统启动时,先扫描注册到系统中的数据库,然后按照不同的数据库分别创建对应的对象池,按照附图中的示例,比如系统中有a、b、
……
、z等多个账套,对于同一个销售订单业务对象,根据数据库中分别的定义,可以给a账套(a公司或用户所有的系统)挂载x0、y0两个动态函数对象,给b账套(b公司或用户所有的系统)挂载x1、y1、w1三个动态函数对象,给z(z公司或用户所有的系统)账套挂载x9、y9、u9三个动态函数对象,这些动态函数个数、内容各不相同,当用户分别访问三个不同的账套时,即可分别实现不同的功能,借助相应的动态表单定义,可将不同的函数分别挂载为不同的按钮,各个账套之间的模型定义、模型对应的函数对象可以分别不同,由于隔离机制的实现,不会造成功能的混乱和不可用。
110.另外,需要说明的是,基于对象池关联数据库的方式可以对业务系统进行快速准确的部署服务,在计算机上可通过远程访问数据库的方式快速访问对应的本地或远程数据库,直接加载到内存中,而无需源代码文件或者编译后的可执行文件从本地导入,通过对象
池关联数据库的方式对业务系统的代码进行管理安全高效。
111.如下为本发明的一个示例性实施例:
112.在某企业信息化系统中,项目经理现场调研后发现,客户要求我系统中的销售订单模块,一旦销售订单审核通过,则需要调用一个异构系统的接口,将对方系统中对应客户的商机状态修改为已签约状态。则项目经理和现场实施人员沟通后,通过如下步骤实现客户需求:
113.1.先在开发人员本地编写调用商机回写异步接口的测试代码,并自测通过,这个过程需要1天时间。
114.2.开发人员打开本erp系统,根据销售模块-》销售订单模型,搜索对应的模型下所有的函数,然后搜索出svc_confirm()函数,通过界面编辑这个函数的代码视窗,将1中的代码拷贝到这个字段的下方,检查格式正确与否。
115.3.开发人员点击保存,系统自动进行代码安全性校验,校验通过后,保存成功。
116.4.开发人员在系统中点击【激活】按钮,则系统自动装载新编辑的代码并立即生效。
117.5.实施人员与客户进行联调测试,确保系统功能正常,并确保需求能满足客户需求,功能实现完成。
118.如果没有本方案提供的支持实时调整的动态erp动态函数实现方案,则在第2步,需要开发人员在本地代码分支中先切到制定代码分支,进行本地代码开发,开发完成后,无法立即生效,需要制作补丁发布至客户系统,这个过程将会持续至少3天时间,可想而知,成百上千的这种功能开发调整过程,一定可以带来大量的交付效率的优化。且本方案的调整,只会影响一个账户的账套,对于和该企业部署在同一台服务器中的其他系统账套,订单确认后并不会调用这个异步接口调用的方法,做到了有效的隔离,这也是传统方案无法实现的,因此实施本方案可以带来良好的效益。
119.如上所述,通过本发明提供的一种业务系统函数动态执行方法,支持无需新增代码文件而新建一个新的业务函数,并将其挂载至业务单据上实现新功能;支持无需重新部署代码而修改已有的业务函数逻辑,以此来修改已有的功能;业务功能的变更在saas部署下可以实现基于租户的隔离,彼此之间的变更不会互相影响。对于客户多变的需求,可快速根据需要进行现场快速定制,并直接应用到客户的账套系统。
120.以上是本发明公开的示例性实施例,但是应当注意,在不背离权利要求限定的本发明实施例公开的范围的前提下,可以进行多种改变和修改。根据这里描述的公开实施例的方法权利要求的功能、步骤和/或动作不需以任何特定顺序执行。此外,尽管本发明实施例公开的元素可以以个体形式描述或要求,但除非明确限制为单数,也可以理解为多个。
121.应当理解的是,在本文中使用的,除非上下文清楚地支持例外情况,单数形式“一个”旨在也包括复数形式。还应当理解的是,在本文中使用的“和/或”是指包括一个或者一个以上相关联地列出的项目的任意和所有可能组合。
122.上述本发明实施例公开实施例序号仅仅为了描述,不代表实施例的优劣。
123.本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
124.所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本发明实施例公开的范围(包括权利要求)被限于这些例子;在本发明实施例的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,并存在如上所述的本发明实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。因此,凡在本发明实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明实施例的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献