当前位置:   article > 正文

jeesite实战(三十九)——flowable流程业务的具体实现_flowable 结合业务表单保存

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
  • 2
  • 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
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

注意事项

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

在这里插入图片描述

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

总结

至此,本文章结束

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/852410
推荐阅读
相关标签
  

闽ICP备14008679号