(一) 部署流程图
1.读取resources目录下的processes目录下的后缀为.bpmn文件,代码如下:
List<ProcessFileModel> processFileModels = new ArrayList<ProcessFileModel>();
try {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:processes/*.*");
if(resources != null && resources.length > 0) {
int i = 1;
for(Resource resource : resources) {
if (!resource.getFilename().contains(".bpmn")) {
continue;
}
ProcessFileModel processFileModel = new ProcessFileModel();
processFileModel.setId(i);
processFileModel.setFileName(resource.getFilename());
log.info("文件名称:" + resource.getFilename());
String filePath = resource.getURL().toString();
log.info("文件路径:" + filePath);
filePath = filePath.substring(0, filePath.lastIndexOf("."));
processFileModel.setPicPath(filePath + ".png");
processFileModels.add(processFileModel);
i++;
}
}
} catch (IOException e) {
e.printStackTrace();
}
2.返回到页面以列表形式展示,然后有部署按钮。
部署的代码如下:
public void deploymentProcess(String procName, String procCategory, String fileName) throws Exception{
String bpmnPath = "processes/"+fileName;
String pngPath = "processes/"+fileName.substring(0, fileName.lastIndexOf("."))+".png";
repositoryService.createDeployment()//创建一个部署对象
.name(procName)//添加部署的名称
.category(procCategory)
.addClasspathResource(bpmnPath)
.addClasspathResource(pngPath)
.deploy();
}
(二) 启动流程
2.1 在发起申请时。查询流程最大版本号,代码如下:
public List<ProcessDefinition> listLastVersionProcessDefinition() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion().asc().list();
Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
if (list != null && list.size() > 0) {
for (ProcessDefinition pd : list) {
if(!(ActivitiContants.ACT_PROC_TYPE_SPECIAL.equals(pd.getCategory()) ||
ActivitiContants.ACT_PROC_TYPE_RES.equals(pd.getCategory()))) {
map.put(pd.getKey(), pd);
}
}
}
List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values());
return pdList;
}
2.2 把数据渲染到页面让用户选择申请哪个流程。
2.3查询需要的数据到页面,填好资料后提交到后台。然后启动流程
获取下一个节点,代码如下(注activitiId是当前节点,类似于startEvent)
/**
* @Title: getNextNodeByProcInsId
* @Description: 根据流程实例,节点编号获取流程下一个节点
* @param @param procDefId
* @param @param activitiId
* @param @return 参数
* @return List<PvmActivity> 返回类型
*/
public List<PvmActivity> getNextNodeByProcInsId(String procDefId, String activitiId) {
List<PvmActivity> pvmActivitys = new ArrayList<PvmActivity>();
//然后根据当前任务获取当前流程的流程定义,然后根据流程定义获得所有的节点
ProcessDefinitionEntity defEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(procDefId);
List<ActivityImpl> activitiList = defEntity.getActivities();
//然后循环activitiList 并判断出当前流程所处节点,然后得到当前节点实例,根据节点实例获取所有从当前节点出发的路径,然后根据路径获得下一个节点实例:
for (ActivityImpl activityImpl : activitiList) {
String id = activityImpl.getId();
if (activitiId.equals(id)) {
System.out.println("当前任务:" + activityImpl.getProperty("name")); // 输出某个节点的某种属性
List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();// 获取从某个节点出来的所有线路
for (PvmTransition pt : outTransitions) {
PvmActivity ac = pt.getDestination(); // 获取线路的终点节点
System.out.println("下一步任务任务:" + ac.getProperty("name"));
pvmActivitys.add(ac);
}
break;
}
}
return pvmActivitys;
}
//启动流程
Authentication.setAuthenticatedUserId(userId+"");//设置流程发起人
pi = runtimeService.startProcessInstanceByKey(procInsKey, variables);
(三) 任务审批
//设置批注及流程变量
addComment(ActivitiContants.METHOD_COMPLETE_TASK, taskId, task.getTaskDefinitionKey(), result, comment);
/**
* @Title: addComment
* @Description: 流程添加批注
* @param @param methodType 方法类型
* @param @param taskId 任务编号
* @param @param TaskDefKey 任务节点编号
* @param @param result 审批结果
* @param @param comment 审批批注 参数
* @return void 返回类型
*/
private void addComment(String methodType, String taskId, String taskDefKey, String result, String comment) {
String _comment = comment;
if(methodType.equals(ActivitiContants.METHOD_COMPLETE_TASK)) {
if(CompleteResultEnum.AGREE.getValue().equals(result)) {
_comment = "同意_"+_comment;
}else if(CompleteResultEnum.DISAGREE.getValue().equals(result)) {
_comment = "不同意_"+_comment;
}else if(CompleteResultEnum.REJECT.getValue().equals(result)) {
_comment = "不同意_"+_comment;
}
}else if(methodType.equals(ActivitiContants.METHOD_REJECT_TASK)) {
if(StringUtils.isNotEmpty(result)){
if("3".equals(result)){
_comment = "不同意_"+_comment;
}else{
_comment = "驳回_"+_comment;
}
}
}else if(methodType.equals(ActivitiContants.METHOD_CALLBACK_PROCESS)) {
_comment = "流程取回_"+_comment;
}else if(methodType.equals(ActivitiContants.METHOD_STOP_PROCESS)) {
_comment = "发起人撤回_"+_comment;
}else if(methodType.equals(ActivitiContants.METHOD_ROLLBACK_WORKFLOW)) {
_comment = "流程被退回_"+_comment;
}
// 设置批注
taskService.addComment(taskId, null, _comment);
// 设置变量
Map<String, Object> procVariables = new HashMap<String, Object>();
procVariables.put(taskDefKey + "result", result);
procVariables.put(taskDefKey + "comment", comment);
taskService.setVariables(taskId, procVariables);
}
taskService.complete(taskId,variables);
项目中有一个表单配置和节点配置
一个很重要的表。以这个表为核心