1.xml配置创建
(1)导入依赖包
(2)写配置文件
<bean id="dataSource1" parent="baseDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource" ref="dataSource1" />
</bean>
<!-- 配置一个流程引擎工程bean,用于创建流程引擎对象 自动创建23张表 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<!-- <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/> -->
<bean id="identityService" factory-bean="processEngine"
factory-method="getIdentityService" />
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine"
factory-method="getManagementService" />
(3)执行
启动项目会检查配型文件,生成自带的23表
2.流程代码
(1)启动流程
/**
* 启动流程
* @param processDefKey 流程定义Key
* @param userId 当前登陆用户
* @param businessId 业务数据的主键ID
* @param parameters 流程级别的变量Map(此Map种的变量作用于为整个流程的生命周期)
* @return 流程实例ID
* @throws Exception
影响的表
act_hi_actinst 已完成的活动信息
act_hi_identitylink 参与者信息
act_hi_procinst 流程实例
act_hi_taskinst 任务实例
act_ru_execution 执行表
act_ru_identitylink 参与者信息
act_ru_task 任务
*/
public String startWorkFlow(String processDefKey,String userId,String businessId,Map<String, Object> parameters) throws Exception {
//设置流程发起用户信息 当流程启动之后可以到表ACT_HI_PROCINST中查看字段START_USER_ID_的值来验证是否生效
identityService.setAuthenticatedUserId(userId);
if(null == parameters) parameters = new HashMap<String,Object>();
//设置默认回退标志
parameters.put("isBack", false);
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefKey, businessId, parameters);
//自动完成第一个任务
Task task = taskService.createTaskQuery().processDefinitionKey(processDefKey).taskCandidateUser(userId).processInstanceId(processInstance.getId()).singleResult();
//完成任务
completeTask(task.getId(),userId,"","1",parameters);
return processInstance.getId();
}
/**
* 完成任务
* @param taskId 任务ID
* @param userId 用户ID
* @param comment 审批意见
* @param examineResult 审批结果
* @param parameters 变量Map
*/
public void completeTask(String taskId,String userId,String comment,String examineResult,Map<String, Object> parameters) throws Exception{
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//判断当前任务是否有代理人
String assignee = task.getAssignee();
//如果代理人是空,则有可能是因为此任务还处于待认领状态,将此任务的代理人设置为当前登陆人
if(StringUtils.isEmpty(assignee)){
taskService.claim(taskId, userId);
}
//添加此任务的审批意见
taskService.addComment(task.getId(), task.getProcessInstanceId(), StringUtils.isEmpty(comment) ? "无" : comment);
if(null == parameters) parameters = new HashMap<String,Object>();
//设置审批结果及回退标志
if("0".equals(examineResult)){
parameters.put("isBack", true);
taskService.setVariableLocal(task.getId(), "examineResult", "退回");
}else if("1".equals(examineResult)){
parameters.put("isBack", false);
taskService.setVariableLocal(task.getId(), "examineResult", "通过");
}
//设置是否涉密字段设置
if(parameters.containsKey("isSecret") && parameters.get("isSecret") != null){
taskService.setVariableLocal(task.getId(), "isSecret", parameters.get("isSecret").toString());
}
//完成任务
taskService.complete(taskId, parameters);
}
(2)二级审批
/**
* 根据流程实例ID查询历史流程实例
* @param pi 流程实例ID
* @return
* @throws Exception
*/
public HistoricProcessInstance queryHistoricProcessInstanceByPI(String pi) throws Exception {
return historyService.createHistoricProcessInstanceQuery().processInstanceId(pi).singleResult();
}
/**
* 完成任务
* @param taskId 任务ID
* @param comment 审批意见
* @param examineResult 审批结果
* @throws Exception
*/
public void doCompleteTask(String taskId,String comment,String examineResult,String pi,String zjrVar,String nextVarName) throws Exception {
// 获取是否涉密字段
String isSecret = CommonUtil.getRequest().getParameter("isSecret");
/**
* 当审批结果为通过\并且下一步审批人不为空时,设置下一个审批人
*/
Map<String,Object> map = new HashMap<String,Object>();
if("1".equals(examineResult) && StringUtils.isNotEmpty(nextVarName)){
map.put(nextVarName, zjrVar);
}
// 保存此处理步骤的是否涉密字段值
map.put("isSecret", isSecret);
///
workFlowCoreService.completeTask(taskId, CommonUtil.getUserFromSession().getPkSysUsersId(), comment, examineResult, map);
HistoricProcessInstance processInstance = workFlowCoreService.queryHistoricProcessInstanceByPI(pi);//查询历史流程实例
String businessKey = processInstance.getBusinessKey();//获取流程ID
BasDocument basDocument = this.queryByID(businessKey);
if(processInstance.getEndTime() != null){//如果历史流程有结束则整体流程结束,之后修改业务表
basDocument.setFlowstate("已办结");
}else{
if("0".equals(examineResult) && "审批中".equals(basDocument.getFlowstate())){
basDocument.setFlowstate("被退回");
}else if("1".equals(examineResult) && "被退回".equals(basDocument.getFlowstate())){
basDocument.setFlowstate("审批中");
}
}
this.edit(basDocument);
//保存附件
basDocumentAttachmentService.doSaveAttachment(basDocument.getId(),"1");
}
3.总结
(1)activiti有两种配置方式,一种是代码式的,一种是xml配置式的,常用配置式更友好方便
(2)启动
a.配置xml后启动项目会自动创建23张表
b.保存流程发起人ID
identityService.setAuthenticatedUserId(userId);
c. 启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefKey, businessId, parameters);
d.自动完成第一个任务
Task task = taskService.createTaskQuery().processDefinitionKey(processDefKey).taskCandidateUser(userId).processInstanceId(processInstance.getId()).singleResult();
e.从第二个任务开始调用完成任务方法
completeTask(task.getId(),userId,"","1",parameters);
添加审批内容
taskService.addComment(task.getId(), task.getProcessInstanceId(), StringUtils.isEmpty(comment) ? "无" : comment);
添加审批结果或者退回
taskService.setVariableLocal(task.getId(), "examineResult", "退回/通过");
完成任务
taskService.complete(taskId, parameters); ------发起审批结束
f.第二级审批,需要在前段指定审批人,如果无审批人,则流程结束
执行任务----workFlowCoreService.completeTask(taskId, CommonUtil.getUserFromSession().getPkSysUsersId(), comment, examineResult, map);
查看历史流程实例,获取该流程是否有结束时间
HistoricProcessInstance processInstance = workFlowCoreService.queryHistoricProcessInstanceByPI(pi);//查询历史流程实例
String businessKey = processInstance.getBusinessKey();//获取流程ID
BasDocument basDocument = this.queryByID(businessKey);
if(processInstance.getEndTime() != null){//如果历史流程有结束则整体流程结束,之后修改业务表