熊棠 何怡璇
摘要:在Linux系统中,使用Ruby on Rails 5框架设计一个基于Web的业务流程管理系统。提供流程仓库、流程设计、流程配置、流程引擎、流程维护、流程入口等功能。
关键词:BPMS;流程管理;Ruby on Rails 5
中图分类号:TP311 文献标志码:A
文章编号:1009-3044(2019)25-0059-03
现代企业运作中,一个项目的生命周期可以分为多个阶段,由多个人员经手;可以用业务流程管理系统(Business Process Management System,BPMS)对项目进行管理。BPMS是在工作流(Workflow)等技术基础上发展起来的,基于业务流程建模,支持业务流程的分析、建模、模拟、优化、协同与监控等功能的新一代企业应用系统核心[1]。
在Linux系统中,使用Ruby on Rails 5框架,设计一个用于招投标代理企业的业务流程管理系统,使其具有上述功能。
1 系统环境
招投标代理企业的主要业务就是为政府部门、企事业单位提供招投标代理服务。一个项目从开始到结束时间跨度较长、业务人员需同时处理几个乃至十几个项目,可采用简易的BPMS对项目进行管理。系统在Ubuntu16.04操作系统上运行,采用Ruby on Rails 5框架,mysql 5.7数据库。
2 需求分析
招投标代理企业以项目为中心,须对项目进行全生命周期管理。因此,以项目为中心来进行系统设计。
2.1 项目分类
经业务梳理,项目可归纳为政府采购、非政府采购及其他三个类型。不同类型的项目,步骤流程、时间节点及需收集的数据均有差异。
2.2 访问控制
项目部门和行政部门需参与项目管理,项目部门负责项目的建立、主要步骤的处理,行政部门负责时间安排、房间安排、公告发布、合同管理、归档管理及考勤考评。项目部门多采用项目部(组)结合项目负责人制,项目负责人独立负责整个项目,对其所在部(组)主管负责。行政部门多采用岗位制,且大量存在一人身兼多岗的情况。
因此,在访问控制设计上,项目负责人只能操作自己负责的项目,主管可以看到本部(组)的所有项目,并具有相应的权限。项目进行到需要某岗位人员操作时,该岗位用户可以访问项目的特定步骤。
2.3 控制
一个项目在进行时,应具备正常进行、非正常返回、跳过不必要步骤、重新指定负责人员等功能。完成之后应可查询、展示、归档、导出。
3 模型设计
3.1 Project类
系统以项目为中心进行设计,核心模型为Project,存储项目的所有数据。因不同类型项目需要存储的数据项不同,Project的字段应为所有类型项目需记录字段的合集,并经合并处理。
3.2 Workflow类
项目的数据是根据推进情况逐步录入系统的,此过程就是工作流Workflow。工作流定義了一个项目需要经过什么样的流程,每一个流程需要做些什么,由谁负责,流程时限等。这些属性由流程模板来定义。工作流包含至少一个步骤。
3.3 Step类
步骤Step是工作流的组成部分,通过工作流与项目和模板关联,用以记录当前项目的进展情况。Step有以下几个主要属性。
previous_step_id:上一个步骤的id,用以形成线性的工作流;
status:状态,有预备、激活、异常、退回、完成、跳过五种状态;
sequence:用以读取流程模板配置;
must_be_finished_at:时限,该步骤最晚应完成的时间。
3.4 流程模板
流程模板用来配置整个工作流,通过全局变量@@project_template进行访问,为哈希类型数据。此变量可以写为一个类,也可以动态生成。
3.4.1 一级结构
@@project_template的结构为{‘【项目类型代字】 => {【表示项目流程的哈希表】}},即每个项目类型用一对键-值对表示。如政府采购,项目类型代字为“zfcg”,则键-值对为‘zfcg => {【表示政府采购流程的哈希表】}。
3.4.2 二级结构
以政府采购为例说明项目流程的哈希表结构:
{
‘title => ‘政府采购,
‘steps => [【表示步骤的哈希式】]
}
title的值为字符串,表示该类型的名字;steps的值为数组,数组的每个元素对应工作流中的一个步骤。
3.4.3 三级结构
steps数组每个元素均为哈希表,定义一个步骤的所有属性。其结构为:
{
‘title => ‘【步骤名称】,
‘duty => ‘【步骤责任人】,
‘max_time_interval => ‘【最大时间间隔】,
‘skipped => ‘【是否运行跳过】,
‘operations => [【表示该步骤可操作字段】]
}
duty的值为字符串,用来表示可操作当前步骤的用户,形如‘duty[政采备案审核岗]、‘head_user、‘dept[事业部]等,经解析后可定位至一个或一组人员。
max_time_interval表示项目开始、或完成某一步骤后、或数据库中该项目某个表示日期时间的数据值后N天内必须完成此步骤。临期可预警,超期可告警。
operations的值为数组,数组的每个元素对应一个可操作字段。
3.4.4 四级结构
operations数组每个元素均为哈希表,定义一个字段的操作方式及数据来源。其结构为:
{
‘model => ‘【要操作的ActiveRecord模型类名】,
‘field => ‘【要操作的字段名】,
‘title => ‘【页面显示文字】,
‘source => ‘【数据来源】
}
要操作ActiveRecord模型的类名,通常为Project,设置该属性是为了便于灵活扩展。
数据来源表示如何得到这个字段的值,通过自定义的视图辅助方法解析,得到数据的输入方式。如有动态数据则请求自建Src类处理。
需要注意的是,哈希类型变量增加键-值对不会影响原有的数据,故可根据需要定义新属性。
3.5 Src类
Src类根据流程模板的source参数提供数据,支持参数传递,使用类方法run,经过解析,对应到Src类相应的类方法并返回值。如source的值为‘form_blank_select_customer()表示下拉菜单,菜单选项由Src.run(‘customer())给出。
run方法的参数并不是真实的方法名,和真实方法名一一对应,这个对应关系通过哈希类型常量DATASOURCE实现。如‘customer()对应Src类的类方法real_customer_gthjn(),该方法返回一个哈希变量。
4 控制与视图
按类型新建项目后,控制器根据项目类型读取流程模板并创建视图。
4.1 根据流程模板创建视图
新建项目或执行项目某个步骤,都需要根据流程模板动态创建视图。根据项目类型和当前步骤序列,在流程模板中定位当前步骤的operations值来创建表单。控制器遍历operations,将哈希类型的元素值作為参数交由视图辅助方法data_input()处理。
data_input()直接获取model类名和要操作的字段名field,对source则按照规则进行解析。解析时采用正则表达式,首先解析第一个关键字。常用关键字如下:
form_blank:插入文本框。下拉菜单、时间选择器、多选菜单等可在文本框基础上通过JS实现;
form_check_box:插入复选框。复选框可通过JS实现多种功能,如通过勾选控制其他表单元素;
list:插入列表。列出现有数据,支持增删改操作;
window_open:插入按钮,可打开新窗口。通过新窗口的脚本对父窗口元素进行操作;
auto:当前页面不显示,表单提交后在后台处理。
其次解析后续关键字,给表单添加页面脚本等。最后一个关键字是字母数字与括号的组合,交由Src类处理。
根据上述流程创建出视图。
4.2 流程控制
创建好的项目能看到流程图。部分步骤有完成时限,如计算时限的参数不全,该步骤及后续步骤将暂时不被创建。
每个方格即为一个步骤,用不同样式区分步骤状态。具有权限的用户可以对已完成的步骤进行修改;当前激活的步骤可以执行,并可转移给其他用户作为责任人;未激活步骤如skipped属性为true,则有‘跳过按钮。被跳过步骤如后续步骤未完成则有‘恢复按钮。每个步骤均有详细操作日志,用于事后审计。
每个步骤均可‘通过和‘不通过,通过即完成并激活下一步,不通过则将本步骤设为预备并将上一步设置为激活。留言备注可用于记录通过或不通过的理由且不可更改,用于交流及事后审计。留言采用JSON格式存储,可记录多条留言。
‘上一步和‘下一步用于浏览已完成的步骤,预备及跳过的步骤不可浏览。
4.3 提示与异常
每一个步骤完成后,系统会自动对后续所有步骤进行更新。当计算时限的参数完备时,之前未创建的步骤及后续步骤将被创建,并设置时限的具体日期。
计算时限时根据流程模板的设置分为自然日和工作日,自然日直接计算可得,工作日使用API获得结果。
当前时间距时限72小时开始有提示标注;时限当日,开始告警;时限已过时,将显示超期。超期信息将记入日志,供事后审计、考勤。
5 数据处理
录入项目数据之后,可以项目数据为基础进行各种统计分析,比如废标率统计、耗时统计等。对于数据展示和导出,采用了在线模拟Excel工作区样式和导出为Excel文件的方式,以兼容现有工作习惯。
在线模拟Excel工作区采用table元素,配合js和css,实现类似的视觉效果。为了数据安全,此处不再提供数据增删改功能。
数据导出使用第三方gem axlsx,可以使用图表、图像、自动列宽、自定义样式和完整模式验证生成XLSX电子表格[2]。
6 结束语
经过系统测试及一年的线上运行,该系统达到了设计要求。但该系统还存在只支持线性流程,不支持分支流程的问题,将在后续进行改进。
参考文献:
[1] 业务流程管理 - 维基百科,自由的百科全书[EB/OL]. https://zh.wikipedia.com/wiki/%E4%B8%9A%E5%8A%A1%E6%B5%81%E7%A8%8B%E7%AE%A1%E7%90%86.
[2] axlsx | RubyGems.org | Ruby 社区 Gem 托管[EB/OL]. https://rubygems.org/gems/axlsx.