一.基本流程实现
流程测试我这用的是swagger,也可以用postman进行流程的运行,
(1)先来了解什么是并行网关 图标为+
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:
fork 分支:
并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
join 汇聚:
所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
注意:
如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时, 网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
(2)什么是排他网关 图标为 -
排他网关是用来控制流程的流向.
并行与其他网关的主要区别:
并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
流程图对应一个流程id和多个任务.每个任务对应每个人来操作.
1.普通流程,先用idea插件画BPMN流程图.这个插件画相对eclipse插件,或者activiti-app相对恶心点,不好画.如果不习惯这个插件,也可以用其他软件画好,复制过来.
2.发起流程,此流程很简单,先是主管审核,主管审完然后人事审核,流程结束,接下来开始操作
上一节config初始化配置拿到的流程相关接口注入.
启动流程
/**
* 启动流程
* @param perid
* @param tempName
* @param map
* @return
*/
@Override
public ProcessInstance getTask(String perid, String tempName, Map<String, Object> map){
identityService.setAuthenticatedUserId(perid);
// 开始流程 map内容set对应的审核用户
ProcessInstance pi = runtimeService.startProcessInstanceByKey(tempName, map);
// 查询当前任务
return pi;
}
map里面对应的key可以set用户,也可以在流程图写死,一般是根据业务来进行set对应的用户(assignee属性配置)
perid 发起流程的用户
tempName 此流程的名称
3.流程启动然后到主管,用主管查询待审核的流程
@Override
public List<ActivitiTask> myApproval(String userName) {
List<Task> taskList = taskService.createTaskQuery().taskAssignee(userName)
.orderByTaskCreateTime().desc().list();
// 多此一举 taskList中包含了以下内容(用户的任务中包含了所在用户组的任务)
// Group group = identityService.createGroupQuery().groupMember(userName).singleResult();
// List<Task> list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();
// taskList.addAll(list);
List<ActivitiTask> activitiTaskList = new ArrayList<>();
for (Task task : taskList) {
ActivitiTask activitiTask = new ActivitiTask();
activitiTask.setId(task.getId());
activitiTask.setName(task.getName());
activitiTask.setCreateTime(task.getCreateTime());
String instanceId = task.getProcessInstanceId();
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
Activiti activiti = getActiviti(instance);
activitiTask.setActiviti(activiti);
activitiTask.setProcessInstanceId(instanceId);
activitiTaskList.add(activitiTask);
}
return activitiTaskList;
4,查询到待审核的任务,根据任务id和当前用户进行审核
审核操作(审核操作可能会牵扯到是否同意,原因等字段,可以自定义进行传参)
@Override
public Boolean passApproval(String userName, ActivitiTask activitiTask) {
String taskId = activitiTask.getId();
Map<String, Object> vars = new HashMap<>();
vars.put("result", activitiTask.getActiviti().getResult());
vars.put("auditor", activitiTask.getActiviti().getAuditor());
vars.put("auditTime", new Date());
vars.put("ifPass", activitiTask.getActiviti().getIfPass());
//taskService.claim(taskId, userName);
taskService.setAssignee(taskId, userName);
taskService.complete(taskId, vars);
return true;
}
5,审核成功之后进入人事审核,人事审核同样上述操作,审核完成,流程结束.
6.想要查看当前流程进度,查看流程图(根据流程的id获取流程图)
/**
* 生成流程图片
*
* @param processDefinitionId
* @param outputStream
* @return
*/
@Override
public void tracePhoto(String processDefinitionId, OutputStream outputStream) {
ActUtils.getFlowImgByInstanceId(processDefinitionId, outputStream);
}
以上基本流程代码已经可以实现流程的步骤,
二 .排他网关的流程实现
排他网关在业务流程中可能有两种或者多种选择,选择不同结果会进入的下一步流程就会不同,所以在他的后面用表达式进行区分,在实现审核的时候根据你审核的参数他会进入不同的审核状态
用户申报流程,申报成功结转到审核,审核有两种情况,在condition属性下配置表达式,同意流程结束,不同意,退回重新申报,接下来开始操作
1.此方法操作跟上面接口一直,在审核的时候,你只需要给参数ifPass进行写入数据,同意为1,不同意为0,,如果没有满足的值会抛出异常,流程审核会根据你的条件退回去还是结束.
后面还有对应的多人顺序或者并列审核,持续学习,持续更新.