发起流程
当流程部署完成后,可以根据流程定义信息发起流程,包括根据流程定义id、key、message等信息发起流程实例:
runtimeService.startProcessInstanceByKey();
runtimeService.startProcessInstanceById();
runtimeService.startProcessInstanceByMessage();
这里我发起流程,是通过流程定义的名称,也就是BPMN文件中:name属性的值。
<process id="askforHoliday" name="请假" isExecutable="true">
因为api中没有根据提供根据name发起流程实例的方法,因此我的做法是,根据名称查询到流程定义的信息,拿到流程的key,然后根据key来发起流程:
public CommonResult startProcByName(ProcessInsParam param) {
String procDefName = param.getProcDefName();
String tenantId = param.getTenantId();
String startUserId = param.getStartUserId();
String businessKey = param.getBusinessKey();
//根据流程定义名称查询是否有流程定义
ActReProcdefParam defParam=new ActReProcdefParam();
defParam.setName(procDefName);
defParam.setTenantId(tenantId);
//查询流程定义信息
List<ProcessDefinition> list=flowApi.queryProcDef(defParam);
if(list.size()==0){
return CommonResult.error("不存在该流程定义!",null);
}
ProcessDefinition processDefinition = list.get(0);
String key = processDefinition.getKey();//流程key
Authentication.setAuthenticatedUserId(startUserId);
Map<String, Object> variable = param.getVariable();
System.out.println(Authentication.getAuthenticatedUserId());
variable.put("USER_ID",Authentication.getAuthenticatedUserId());//追加流程发起人字段
//根据流程名称创建流程实例
CommonResult result = flowApi.startTenantProcess(key, businessKey, variable, tenantId);
return result;
}
流程创建成功后,会返回该流程实例的id。
获取任务列表
发起流程后,流程会进行到流程第一个流程节点,在我的场景中,任务是被分配给用户组的,也就是角色。如果是该角色的用户,都可以领取该任务并进行审核。因此首先需要获取到属于自己的任务列表,我是通过自己写sql来查询。这个可以查询到任务人是自己,同时属于自己角色的任务。
List<ActRuTaskVo> myWaitTask(ActRuTaskParam param);
//对应的sql
select t.ID_ as id,t.EXECUTION_ID_ as executionId,t.PROC_INST_ID_ as procInstId,t.PROC_DEF_ID_ as procDefId,
t.NAME_ as taskName,t.TASK_DEF_KEY_ as taskDefKey,t.CREATE_TIME_ as createTime,t.TENANT_ID_ as tenantId,
def.NAME_ as procDefName,hp.BUSINESS_KEY_ as businnessKey,hp.START_USER_ID_ as startUserId
from act_ru_task t
left join act_hi_procinst hp on hp.PROC_INST_ID_= t.PROC_INST_ID_
left join act_re_procdef def on def.ID_=hp.PROC_DEF_ID_
where t.TENANT_ID_=#{tenantId} and t.ASSIGNEE_=#{assignee} and def.NAME_=#{procDefName}
union all
SELECT t.ID_ as id,t.EXECUTION_ID_ as executionId,t.PROC_INST_ID_ as procInstId,t.PROC_DEF_ID_ as procDefId,
t.NAME_ as taskName,t.TASK_DEF_KEY_ as taskDefKey,t.CREATE_TIME_ as createTime,t.TENANT_ID_ as tenantId,
def.NAME_ as procDefName,hp.BUSINESS_KEY_ as businnessKey,hp.START_USER_ID_ as startUserId
from act_ru_task t
left join act_hi_procinst hp on hp.PROC_INST_ID_= t.PROC_INST_ID_
left join act_hi_identitylink i on t.ID_=i.TASK_ID_
left join act_re_procdef def on def.ID_=t.PROC_DEF_ID_
where t.TENANT_ID_=#{tenantId} and i.GROUP_ID_=#{groupId} and def.NAME_=#{procDefName}
审批任务
当获取到任务列表后,根据任务id,对任务进行审核:
public CommonResult completeTask(ActRuTaskParam param) {
//获取任务id
String taskId= param.getId();
//流程实例id
String procInstId = param.getProcInstId();
//参数变量
Map<String, Object> variable = param.getVariable();
String commonStr="";
if(ObjectUtil.isNotEmpty(variable)){
Object common = param.getVariable().get(FlowableConst.COMMON);
commonStr=ObjectUtil.isEmpty(common)?"":(String) common;
}
//审核结果+审批意见
commonStr=param.getVariable().get(FlowableConst.APPROVAL)+"&"+commonStr;//记录审批结果+备注信息
String assignee = param.getAssignee();//当前登录用户标志
taskService.claim(taskId,assignee);//认领任务
taskService.addComment(taskId,procInstId,commonStr);//添加审核备注
taskService.complete(param.getId(),variable);
return CommonResult.success();
}
任务审批后,流程实例会进入到下一个任务节点。