企业MIS系统如何轻量代码实现灵活配置业务逻辑迅速响应需求变更

Colin 1月前 ⋅ 160 阅读

前言

随着企业的业务扩展,需求会越来越复杂,上马的信息化系统会日渐繁多,ERP、仓储系统、订单系统、客户系统、物流系统、站点内容管理、办公系统、财务系统、运营系统、中台系统...如何使这些系统之间的信息产生关联,交互,相互之间串联通讯使得很多企业信息部门特别的烦恼,熟练的老员工成长之后离开,留下的这些接口需要不断的招聘新员工来维护。接口需要和三方系统对接,各个系统之间标准不一、关键业务接手人员众多,各自技术层次不同,实现业务的方式繁多,加上逻辑复杂,随着编码行日益增长,项目经理为了寻找接手技术资源绞尽脑汁、而新进员工对老旧系统更是爱恨交织...

workflow自定义表单业务处理解决方案

业务逻辑解析引擎

单一事务中的业务逻辑由多个任务项按照特定顺序组成,下一个任务项可以获取和感知到之前已经执行的任务项的执行结果,通过该结果来决策后续任务的执行逻辑,和代码逐行顺序执行来实现业务逻辑基本类似,优点是可以通过多种配置渠道的方式(SQL语句、网络接口、shell脚本等等),无需编译、部署、配置即生效,所见即所得。

flowchart TD subgraph 事务型业务逻辑执行过程示意图 B("fa:fa-tasks DoAction") B-->BC{1入口条件} BC-->|满足| C(fa:fa-database 任务项1) BC-->|不满足| D(fa:fa-cloud-upload 任务项2) C-->CD{2条件} CD-->|满足| D CD-->|不满足| E(fa:fa-linux 任务项3) D-->DE{3条件} DE-->|满足| E DE-->|不满足| F(fa:fa-database 任务项4) E-->EF{4条件} EF-->|满足| F EF-->|不满足| G(fa:fa-database 任务项5) F-->FG{5条件} FG-->|满足|G G-->H(fa:fa-ellipsis-h 更多任务项直至配置数据的最后一行结束) end

流程表单自定义系统根据业务逻辑执行的方式,同时支持执行SQL方式、调用接口方式以及执行服务端shell脚本的方式来处理业务,三种方式在同一事务的任务中可以任意交替以及混合使用。

flowchart TD subgraph 任务项三大类示意图 B("fa:fa-tasks 任务项类型") B-->C(fa:fa-database SQL任务项) B-->D(fa:fa-cloud-upload HTTP接口任务项) B-->E(fa:fa-linux SHELL任务项) end

同时每一任务项都可以有特定的返回值,返回的值可以作为下一任务项执行的依据,也可以不返回任何信息。分别支持以下9种处理方式。

flowchart TD subgraph 任务项九种返回值示意图 B("fa:fa-tasks 任务") B-->C(fa:fa-close 0表示无返回) B-->D(fa:fa-key 1插入后主键) B-->E(fa:fa-search 2查询结果) B-->F(fa:fa-cloud 3GET请求) B-->G(fa:fa-cloud-upload 4POST请求) B-->H(fa:fa-bug 5断言) B-->I(fa:fa-linux 6Shell控制台输出) end

业务逻辑任务项持久化数据示例

workflow系统中保存表单数据或者提交流程任务的时候,在数据库中提供了相应的配置表,来处理业务数据以及调用接口,任务项配置表的示例数据请参考下图:

3.pic_hd.jpg

表单的保存和流程提交的动作脚本分别存储到两张配置表中,以sql脚本的形式存储,然后交给系统去解析执行,保存到配置表中的是为了方便配置和开发,解析时系统会从缓存中读取,以提高效率。 信息部门的小伙伴只需要稍懂SQL语句便可大展拳脚,轻松维护旧系统业务逻辑和开发新的功能。业务逻辑被保存成一个一个的任务项,根据ID的顺序依次执行,已经执行的结果被保存在服务器内存中以备下一项任务执行时参考和使用。 任务项可以有如下三种类型的动作:

  1. 直接执行数据库SQL脚本:在了解业务系统数据结构的情况下,这是最直接和高效的。
  2. 调用HTTP协议的接口:主要为了和三方异构系统进行交互和通讯。
  3. 执行服务器端Shell脚本:在研发团队离场情况下,可以由运维人员继续发挥作用,例如:保存某特定表单时需要发送emall或短信,运维人员只要在数据库中加条记录,服务器上写个shell文件,即可实现功能。

任务项的7种类型

  • 0 表示不返回任何数据
  • 1 表示执行insert语句返回插入的主键值,刚刚插入的数据ID在下一项任务中可以获取。
  • 2 表示执行select所查询出来的值,查出的内容在下一项任务中可以获取。注意只能查询一行一列数据。
  • 3 表示查询根据执行select所查询出来的url地址,请求头数据,参数数据,向该地址发出get请求,所返回的数据在下一项任务中可以获取。
  • 4 表示查询根据执行select所查询出来的url地址,请求头数据,参数数据,向该地址发出post请求,所返回的数据在下一项任务中可以获取。
  • 5 表示select查询结果必须返回1,否则报错回滚该事务(三方系统不参与回滚),主要用于断言。
  • 6 表示根据执行select所查询出来的sh脚本,在服务器上执行该shell脚本,并返回shell脚本中打印的数据,后续的sql可以根据打印数据的特征判断shell执行的结果。echo的内容在下一项任务中可以获取。

任务项持久化数据示例

根据returnkey的值,填写对应的sql语句用于执行和解析。例如:

returnkey:0,sql:update ...
returnkey:1,sql:insert ...
returnkey:2,sql:select 'ok' as success
returnkey:3,sql:select 'http://xxxx' as url , '{"method":"get"}' as parameters, '{"tokenn":"xxx"}' as headers 
returnkey:4,sql:select 'http://xxxx' as url , '{"method":"post"}' as parameters, '{"tokenn":"xxx"}' as headers 
returnkey:5,sql:select (case when (exests( select 1 from xxx where ... )) then 1 else 0 end) as assert 
returnkey:6,sql:select '/home/sendMail.sh ' as sh 

全部评论: 0

    我有话说: