jeesite实战(三十九)——flowable流程业务的具体实现

系列文章目录


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本系列文章主要记录项目过程中重点的项目技术


一、目的

讲述流程设计的整个过程

二、实现过程

简述实现过程

流程设计过程大致如下图
在这里插入图片描述

定义流程分类

1.流程分类管理页面

如下图,点击流程管控下的流程分类管理菜单,查看流程分类
在这里插入图片描述

2.创建流程分类

因为我已经创建了,所以下图是编辑页面的数据
在这里插入图片描述

设计流程模型

1.查看流程模型

点击流程管控下的流程模型设计,可以查看已有的流程模型,如下图
在这里插入图片描述

2.新增流程模型

1.新增流程模型

点击创建流程,进入流程创建页面,如下图,需要输入流程模型名称和key
在这里插入图片描述

2.设计流程图

1.双击圆形,选择对应的节点,如下图
在这里插入图片描述
2.设计后的图形
在这里插入图片描述

3.设计节点的相关属性

1.计划编辑
在这里插入图片描述
2.安全部部长审批
在这里插入图片描述

3.安全总监审批
在这里插入图片描述

4.副总经理审核
在这里插入图片描述

3.发布流程图

点击发布按钮,将会自动发布,如下图
在这里插入图片描述
选择发布的流程分类,如下图
在这里插入图片描述

关联业务

1.查看流程定义

点击流程定义管理,查看页面,并点击业务关联,具体见下图
在这里插入图片描述

2.查看流程表单

点击上图中的业务关联,查看流程表单,具体如下图
在这里插入图片描述

3.添加事件(关联事件)

在上图中第三步,点击流程事件,添加流程事件
在这里插入图片描述
在这里插入图片描述

具体事件
任务创建
在这里插入图片描述
流程完成
在这里插入图片描述
流程取消
在这里插入图片描述

service层方法关联的流程

在save方法中添加如下代码,具体说明见下图以及代码
在这里插入图片描述

具体代码见如下

@Transactional(readOnly=false)
	public String newSave(TrainingPlan trainingPlan) {
		// 如果未设置状态,则指定状态为审核状态,以提交审核流程
		if (StringUtils.isBlank(trainingPlan.getStatus())){
			trainingPlan.setStatus(TrainingPlan.STATUS_AUDIT);
		}
		
		// 如果状态为正常,则代表不正常操作,可能前端进行了数据参数修改
		if (TrainingPlan.STATUS_NORMAL.equals(trainingPlan.getStatus())){
			throw new ServiceException(text("非法操作,前端数据被劫持!"));
		}
		
		// 如果状态为草稿或审核状态,才可以保存业务数据
		if (TrainingPlan.STATUS_DRAFT.equals(trainingPlan.getStatus())
				|| TrainingPlan.STATUS_AUDIT.equals(trainingPlan.getStatus())){
			super.save(trainingPlan);
		}

		// 如果为审核状态,则进行审批流操作
		if (TrainingPlan.STATUS_AUDIT.equals(trainingPlan.getStatus())){
			
			// 指定流程变量,作为流程条件,决定流转方向
			Map<String, Object> variables = MapUtils.newHashMap();
			//获得当前用户的所属的机构
			String officeCode = EmpUtils.getEmployee().getOffice().getOfficeCode();
			if(officeCode==null) {
				return "当前用户为超级管理员,请切换账号";
			}else {
				//默认集团公司编码crcebg,长度为6位,二级公司crcebg10,长度为8位,三级机构为crcebg1001为10位
				if(officeCode.length()==6) {//一级机构
					trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_GROUP);
					//安全部部长
					List<ResultPost >  ministerSecurity = dao.findEmployPost(new ResultPost("ministerSecurity", officeCode));
					if(ministerSecurity.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(ministerSecurity.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("ministerSecurity", ministerSecurity.get(0).getEmpCode());
					//安全总监
					List<ResultPost >  securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode));
					if(securityDirector.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(securityDirector.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("securityDirector", securityDirector.get(0).getEmpCode());
					
					//副总经理
					List<ResultPost >  viceGeneralManager = dao.findEmployPost(new ResultPost("viceGeneralManager", officeCode));
					if(viceGeneralManager.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(viceGeneralManager.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("viceGeneralManager", viceGeneralManager.get(0).getEmpCode());
					
				}else if(officeCode.length()==8) {//二级机构
					trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_COMPANY);
					//安全部部长
					List<ResultPost >  ministerSecurity = dao.findEmployPost(new ResultPost("ministerSecurity", officeCode));
					if(ministerSecurity.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(ministerSecurity.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("ministerSecurity", ministerSecurity.get(0).getEmpCode());
					//安全总监
					List<ResultPost >  securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode));
					if(securityDirector.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(securityDirector.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("securityDirector", securityDirector.get(0).getEmpCode());
				}else {
					trainingPlan.setBpmKey(ProcessIdConstants.TRAINING_PLAN_DEPARTMENT);
					//安全总监
					List<ResultPost >  securityDirector = dao.findEmployPost(new ResultPost("securityDirector", officeCode));
					if(securityDirector.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(securityDirector.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("securityDirector", securityDirector.get(0).getEmpCode());
					//项目经理
					List<ResultPost >  projectManager = dao.findEmployPost(new ResultPost("projectManager", officeCode));
					if(projectManager.isEmpty()) {
						return "提交失败,没有指定安全部部长!";
					}
					if(projectManager.size() >1) {
						return "提交失败,存在多个安全部部长!";
					}
					variables.put("projectManager", projectManager.get(0).getEmpCode());
				}

			}

			
			// 如果流程实例为空,任务编号也为空,则:启动流程
			if (StringUtils.isBlank(trainingPlan.getBpm().getProcInsId())
					&& StringUtils.isBlank(trainingPlan.getBpm().getTaskId())){
				BpmUtils.start(trainingPlan, trainingPlan.getBpmKey(), variables, null);
			}
			// 如果有任务信息,则:提交任务
			else{
				BpmUtils.complete(trainingPlan, variables, null);
				trainingPlan = super.get(trainingPlan);
				if(trainingPlan.getStatus().equals("0")) {
					//设置变更状态的计划为非变更
					trainingPlan.setChangeStatus("2");
					super.save(trainingPlan);
				}
				
			}
		}
		return "保存培训计划成功!";
	}

注意事项

1.如果跟我一样出现一个业务应为机构的不同需要对应不同的流程,那么form页面和list页面必须动态的显示不同的流程key
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

到此,一个完成流程的业务基本讲述完成了。

总结

至此,本文章结束

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flowable是一个开源的工作流与业务流程管理平台,它基于BPMN 2.0(Business Process Model and Notation)标准来实现流程。BPMN是一种用于描述和建模流程的可视化标准,它使用图形符号来表示流程中的活动、事件、网关和流程连接等元素。 Flowable通过使用BPMN模型来定义流程,并提供了一套丰富的API和工具来进行流程的管理和执行。利用Flowable,我们可以轻松地设计、部署和操作各种复杂的流程。 使用Flowable实现流程的步骤如下: 1. 创建和设计BPMN模型:首先,我们需要使用BPMN的可视化标准来设计流程模型。可以使用Flowable提供的图形设计工具,也可以使用其他BPMN编辑器来进行设计。 2. 部署流程模型:一旦我们设计完成流程模型,我们需要将其部署到Flowable的引擎中。流程模型可以以XML格式进行存储,然后使用Flowable提供的API将其上传到引擎中。 3. 执行流程实例:一旦流程模型被部署到引擎中,我们就可以通过创建流程实例来执行流程流程实例是流程模型的一个具体实例,它按照模型定义的流程逻辑进行操作。 4. 监控和管理流程Flowable提供了一套完整的工具和接口来监控和管理流程。我们可以查看流程的执行状态、历史记录和性能指标等信息。同时,我们也可以使用这些工具来进行流程的优化和调整。 总而言之,Flowable是一个基于BPMN 2.0标准的流程管理平台,它提供了一套强大的工具和API来实现流程的设计、部署、执行和管理。它大大简化了复杂流程的管理和操作,并帮助组织实现流程的自动化和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值