2019独角兽企业重金招聘Python工程师标准>>>
一:创建一个ActivitiHandle,就是一个操作类
@Component("activitiHandle")
public class ActivitiHandle {
//该路径为activiti工作流的pbmn图的位置
private static final String PBMN_URL = "com/diagrams/";
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private ActivitiService activitiService;
/**
* 流程部署;对于流程部署来说,需要两个参数;一个该工作流的名字,一个是pbmn文件的文字;这样是为了方便多次部署流程,也可以部署不同的流程;
*/
public void deployFlow(String workflowName, String pbmnName) {
Deployment deployment = repositoryService.createDeployment()//这个service是工作流中的类,无需自己创建,导入相关的jar包即可
.name(workflowName).addClasspathResource(PBMN_URL + pbmnName)
.deploy();
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
/**
* 启动流程:启动已经部署好的流程,即创建流程实例:例如在工单项目中新疆工单的时候就启动一个流程;即创建一个流程实例
*/
public String flowstart(String workflowFlg,Map<String,Object> paramter){
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(ActivitiParamter.WO_VARIABLES, paramter);
// 用key启动时按照最新的流程版本定义启动
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(workflowFlg, variables);
String ss = processInstance.getDescription();
return processInstance.getId();
}
/**
* 查询组内待领取任务
*/
public DataGrid findGroupTask(ActivitiDto activitiDto) {
return activitiService.findGroupTask(activitiDto);
}
/**
* 查询个人待办任务
*/
public DataGrid findPersonTask(ActivitiDto activitiDto) {
return activitiService.findPersonTask(activitiDto);
}
/**
* 认领任务:认领任务,需要任务的标识和员工的标识,因为一般情况下,认领都是个人行为
*/
public void claimTask(String taskId, String userId) {
taskService.claim(taskId, userId);
}
/**
* 重新认领:已经被认领的任务,重新认领,需要参数同认领方法
*
* @param taskId
* @param ouserId
*/
public void reClaimTak(String taskId, String ouserId) {
taskService.setAssignee(taskId, ouserId);
}
/**
* 完成任务:完成任务只需要taskId。
*
* @param taskId
*/
public void completeTask(String taskId) {
taskService.complete(taskId);
System.out.println("完成任务,任务ID:" + taskId);
}
/**
* 完成任务:同样是完成任务,但是可以加入一些工作流变量(全局变量)
*
* @param taskId
* @param paramter
*/
public void completeTask(String taskId, Map<String, Object> va) {
taskService.complete(taskId, va);
System.out.println("完成任务,任务ID:" + taskId);
}
/**
* 查询节点描述:根据taskId查询该任务节点详细:这里是取描述字段,并转化为ActivitiCode对象(工作流码表对象)
* @param taskId
* @return
*/
public ActivitiCode queryTaskDescription(String taskId){
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String des = task.getDescription();
ActivitiCode activitiCode = JSONObject.parseObject(des, ActivitiCode.class);
//String lastNode =activitiCode.getCodeValue().get(activitiCode.getLastNodeName());
return activitiCode;
}
/**
* 流程退回:根据taskId,查询该任务节点:并取出上一个节点,根绝上一个节点完成流程退回
* @param taskId
*/
public void fallBack(String taskId) {
//根据taskId查询任务节点对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//取出该节点描述
String des = task.getDescription();
//将该节点转化成工作流码表对象
ActivitiCode activitiCode = JSONObject.parseObject(des,
ActivitiCode.class);
//然后获取到该节点的上一节点
String lastNode = activitiCode.getCodeValue().get(activitiCode.getLastNodeName()).toString();
if (!StringUtils.isEmpty(lastNode)) {
// 查询上一个节点处理记录taskDefKey即为我们查询出来的lastNode
WoProcessLoggning ps = woProcessLoggningService.lastProcessLogging(
lastNode, task.getExecutionId());
Map<String, Object> variables = new HashMap<String, Object>();
// 设置任务委派类型为个人
variables.put(ActivitiParamter.WO_TYPE,
ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey());
// 设置任务委派人:即上一节点流程处理记录里面的操作者
variables.put(ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey(),
ps.getOperatorFlag());
// 设置不强制结束
variables.put(ActivitiParamter.WO_END_STATUS, "0");
// 设置审核类型为不通过
variables.put(ActivitiParamterCaifu.WO_AUDIT_STATUS,
ActivitiParamterCaifu.AUDIT_STATUS.NO.getKey());
// 设置全局变量
runtimeService.setVariable(task.getExecutionId(),
ActivitiParamter.WO_VARIABLES, variables);
// 完成任务
taskService.complete(taskId, variables);
}
}
/**
* 完成任务
* @param dto
* executionId 和 taskId必填
*/
public void completeTaskByExecution(ActivitiParamter dto) {
if (!StringUtils.isEmpty(dto.getExecutionId())) {
//流程实例id不能为空
Map<String, Object> variables = new HashMap<String, Object>();
if (!StringUtils.isEmpty(dto.getWoAssignee())) {
//如果委托人不为空,那就是个人任务。所以设置流程全局变量的时候就设置为个人
variables.put(ActivitiParamter.WO_TYPE,
ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey());
variables.put(ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey(),
dto.getWoAssignee());
} else if (!StringUtils.isEmpty(dto.getWoGroup())) {
//如果个人为空,组不为空就将全局变量设置为组
variables.put(ActivitiParamter.WO_TYPE,
ActivitiParamter.WO_TYPE_ENUM.GROUP.getKey());
variables.put(ActivitiParamter.WO_TYPE_ENUM.GROUP.getKey(),
dto.getWoGroup());
}
//向全局变量添加完成
variables.put(ActivitiParamter.WO_END_STATUS, dto.getEndStatus());
variables.putAll(dto.getVariables());
//设置该流程实例的流程变量
runtimeService.setVariable(dto.getExecutionId(), ActivitiParamter.WO_VARIABLES, variables);
}
//完成任务
taskService.complete(dto.getTaskId(), dto.getVariables());
}
}