简易审批流引擎的设计与实现
2024-09-15魏鑫
摘要:审批流程引擎是一种软件组件,用于实现审批流程的自动化,提高工作效率。它可以帮助企业和组织快速创建和配置复杂的审批流程,从而提高工作效率。审批流程引擎具有易配置、易管理、易使用等优势。然而,传统的审批流程引擎存在一些问题,例如,每当需要增加新的审批环节时,所有变更都需要重新编写代码、编译、发布和重新部署,这会带来一定的麻烦。文章基于开源脚手架平台Bladex,设计了一个可配置化的简易审批流程引擎,该引擎可以配置审批流程的节点、按钮、弹出页面、取人规则等,从而减少审批流程修改时对代码的重复编写工作。
关键词:工作流;审批流程;流程配置
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2024)24-0057-04
开放科学(资源服务)标识码(OSID)
0 引言
工作流的概念起源于生产组织和办公自动化领域,用于处理日常工作中具有固定程序的活动[1]。工作流旨在实现数据电子化流转,其中业务流程是工作流的核心[2]。随着企业无纸化办公计划的推广,各种审批流程逐渐向线上迁移s0TBhlIAnRLJzkgAXmGviPnM+4koYGUYLuAM157ungs=。公司业务流程复杂,需要一款流程引擎能够在审批流转的同时配置流程中的按钮、审批页面、取人规则等。同一按钮通过审批单据的条件可以弹出不同的审批界面,去往不同的分支,获取不同的下一步审批人员,审批流程需要能够配合业务的变化而更改。现有的审批流程引擎难以满足本公司大量复杂多变的业务流程需求。因此,本文设计并实现了一款轻量级的审批流程引擎,以适应小型业务审批的需求。
1 设计
1.1 框架架构
该系统基于开源脚手架Bladex分布式框架实现。Bladex是一个基于Spring Cloud等核心技术的开源脚手架平台,用于快速构建中大型系统。Spring Cloud以其卓越的全面功能和高度的可定制性,使其成为当今分布式网站构建的主流解决方案[3]。Bladex继承了Spring Cloud的优点,并简化了开发复杂度。该系统采用了MyBatisPlus框架连接并操作数据库。MyBatisPlus框架提供内置的封装方法,开发者只需简单调用即可大幅提升开发效率,显著减少操作时间,从而简化开发流程[4]。该系统前端采用Vue框架。Vue是一款轻量而高效的前端框架,其卓越的扩展性和可维护性为开发人员提供了更为高效、便捷且稳定的开发环境[5]。
1.2 数据库设计
该项目包含基础模块、定义模块、执行模块、历史模块,具体数据库表如表1所示。
2 功能实现
2.1 基础定义
图1为基础配置模块配置关系图,该模块提供系统模块、流程节点、审批按钮、审批页面、取人规则等定义。基础配置模块的核心是系统模块定义,用于定义各个不同的审批系统,例如访客、请假等。
一个系统模块包含多个流程节点。流程节点是审批时的节点,每一次审批,节点都会变化,跳转到下一个节点。节点主要有开始节点、普通节点、结束节点三大类型。
一个系统模块包含多个审批页面,用于人员进行审批操作时的跳转页面。通过配置流程审批页面,可以实现审批时对应审批页面的灵活变化。
一个系统模块包含多个取人规则,用于配置流程节点中的取人规则。流程审批时,系统会根据配置的取人规则查询并设置对应下一步节点的待办人员。取人规则包含组织、角色、职级,通过特定的解析工具选择下一步待办人员。
一个系统模块包含多个审批按钮。按钮配置用于配置流程审批时的按钮,可以修改按钮的颜色样式、文字描述,以满足业务需求的灵活多变。
人员、角色、职级等相关定义则采用开源脚手架Bladex自带的模块,以满足系统的快速开发迭代需求。
2.2 工作流定义
图2展示了流程定义关系,用户可以通过前端页面操作定义和调整工作流程。流程包含流程编码、系统模块、租户、公司、取用规则、优先级等信息,可以通过系统模块、组织信息、优先级、流程取用规则条件匹配需要执行的流程。流程包含的系统模块参数,可以通过模块查询节点,并根据需求选取对应的节点关联到该流程上。
流程节点上配置审批列表按钮与跳转页面定义,如图3所示,待审批列表内有配置的审批按钮“派工”,点击“派工”按钮跳转到配置的“派工”页面。
流程下一步详情配置包含了跳转页面内的审批按钮、下一节点、取人规则、匹配规则、优先级等,如图4所示。配置多个相同按钮的分支可以根据匹配规则进行判断具体进入哪一分支。
2.3 工作流执行
2.3.1 匹配流程
业务单据创建时,系统会根据系统模块、组织信息、优先级、流程取用规则条件等信息选取第一个满足条件的流程,具体代码如下所示:
1. // 根据租户、公司、系统模块 获取所有流程
2. List<WfProcessEntity> list = getAllProcess(tenantId, param.getCompCd(), systemCd);
3. WfProcessEntity entity = null;
4. boolean flag = false;
5. // 通过UEL表达式以及优先级 获取第一个匹配的流程
6. for (int i = 0; i < list.size(); i++) {
7. String uel = list.get(i).getMatchJuel();
8. if (StringUtil.isNullOrEmpty(uel)) {
9. entity = list.get(i);
10. flag = true;
11. break;
12. }
13. try {
14. // uel判断
15. if (this.juel(uel,param)) {
16. entity = list.get(i);
17. flag = true;
18. break;
19. }
20. } catch (Exception e) {
21. continue;
22. }
23. }
2.3.2 开启流程
业务单据提交时,系统会执行如图5所示的流程,创建流程对应的流程任务实例、流程主分支实例,并记录操作,自动进行下一步操作,具体代码如下所示:
1.// 创建提交时上下文环境approval
2.ProcessApproval approval = new ProcessApproval();
3.approval.setWfTaskEntity(wfApproval.getTaskEntity());
4.// 将流程实例taskEntity插入数据库
5.wfTaskDao.insert(wfApproval.getTaskEntity());
6.// 设置提交人 userId username
7.approval.setApprovalUser(wfApproval.getUserId());
8.approval.setApprovalUserName(wfApproval.getUserName());
9.// 设置提交上下文环境approval
10.setApproval(approval,null,null);
11.// 创建主分支
12.workFlowBranchService.setMastBranch(approval);
13.// 设置人员
14.approval.setUserEmpInfoList(wfApproval.getUserList());
15.Date now = new Date();
16.// 设置record流程操作记录
17.setRecord(approval,now);
18.// 开启下一步
19.goNext(approval,now);
2.3.3流程审批
业务单据审批时,系统会执行如图6所示的流程。根据客户端选取的按钮,匹配相应的分支进行下一步操作,并记录操作。如果下一步流程未结束,则将查询到的下一步人员存入待办列表wf_task_user中。具体代码如下所示:
1. // 创建审批时上下文环境approval
2. ProcessApproval approval = new ProcessApproval();
3. String taskUserId = wfApproval.getTaskUserId();
4. String processNodeDetailId = wfApproval.getProcessNodeDetailId();
5. // 设置审批人 userId username
6. approval.setApprovalUser(wfApproval.getUserId());
7. approval.setApprovalUserName(wfApproval.getUserName());
8. // 设置当前节点
9. if(wfApproval.getCurrentState()==null){
10. throw new ServiceException("当前节点未传入");
11. }
12. approval.setCurrentState(wfApproval.getCurrentState());
13. // 设置审批上下文环境approval
14.setApproval(approval,taskUserId,processNodeDetailId);
15. // 设置人员 由审批端提供
16. approval.setUserEmpInfoList(wfApproval.getUserList());
17. Date now = new Date();
18. // 设置record
19. setRecord(approval,now);
20. // 开启下一步
21. goNext(approval,now);
2.3.4 结束流程
流程结束判断包含在流程审批中。系统会判断下一步节点是否为结束节点,如果下一步流程结束,则所有信息将转移到历史表中。具体判断代码如下所示:
1. // 需要判断是否是结束节点
2. WfProcessNodeDetail processNodeDetail = approval.getWfProcessNodeDetail();
3. // 获取下一步节点的类型(开始节点、结束节点、普通节点)
4. String type = processNodeDetail.getNextType();
5. if(!StringUtil.isNullOrEmpty(type)&&type.starts With("end")){
6. // 设置分支状态结束
7. approval.getInstanceEntity().setStatus(3);
8. Date date = new Date();
9. // 设置结束时间
10.approval.getWfTaskEntity().setFinishTime(date);
11.approval.getInstanceEntity().setFinishTime(date);
12. }else{
13. // 非结束节点 查询是否有人员
14. if(approval.getUserEmpInfoList()==null||approval.getUserEmpInfoList().size()==0){
15. throw new ServiceException("非结束节点,请先选择人员");
16. }
17. }
3 结束语
该系统目前已包含审批流程的大部分功能,如流程定义、流程审批、待办查询等,并支持会签、分组审批等多种复杂功能。系统可以便捷配置流程以及审批按钮、审批界面等内容,以满足公司业务多变的审批流程需求。该系统预留了分支模块,为未来可能出现的分支流程节点保留了扩展的可能。
参考文献:
[1] 刘超.轻量级工作流引擎的设计与实现[J].信息系统工程,2022(12):7-10.
[2] 张晓鹏,王新.OA系统工作流精细化管理的实践与应用[J].中国管理信息化,2022,25(17):123-125.
[3] 林宇聪,冯祥胜,叶健安.基于分布式框架的城市内涝智慧监测系统[J].电脑知识与技术,2021,17(10):30-32,36.
[4] 白添予.基于MyBatisPlus的数据库框架优化综述[J].电脑与信息技术,2024,32(3):75-77,133.
[5] 罗光武,陈典灿,吴荷,等.应用Springboot+Vue框架的时间管理软件的设计与实现[J].工业控制计算机,2024,37(4):64-66.
【通联编辑:谢媛媛】