1. 流程定义节点
a) <processname=”” xmlns=”” key=””, version=””>
b) name:
i. 流程定义的名称;
c) key:
i. 流程关键字(键值);
ii. 如果默认不写key值,就是name值;
iii. 在程序通过key值去启动一个流程实例;
d) version:
i. 必须在数据库中存入指定版本号;
ii. 如果版本之前已经存在,报错;
iii. 不指定,数据库完成自增;
e) xmlns:
i. 引入schema约束,编写文件提示效果;
ii. 配置该文件会有提示;
iii. 解压目录src/jpdl-4.4.xsd;
2. transition流转节点:(指向线条)
a) 节点适用:
i. 一个活动可以指定一个或多个transition节点;
ii. start只能有一个transition流转节点;
iii. end没有;
iv. 活动可以添加transition流转,可以添加一个或多个
3. 多transition流转选择;
a) 通过TaskService完成时指定:
i. 完成任务时,指定任务流转节点名称;
ii. 适用于当前正在执行任务,
taskService.complateTask(任务id, transition名字);
b) 示例:
public voidtestTransitionByTaskService() { //获取流程实例对学校 ProcessInstanceprocessInstance = processEngine.getExecutionService() .startProcessInstanceByKey("transition"); //获取任务对象 Task task = processEngine.getTaskService() .createTaskQuery() .processInstanceId(processInstance.getId()) .uniqueResult(); System.out.println(task.getId()); //下一步流程的transitionName String transitionName = "to 审核【经理】"; //控制下一步流转 //传入当前任务的id,下一个节点的name processEngine.getTaskService() .completeTask(task.getId(), transitionName); }
c) 通过ExecutionService指定:
i. 用于状态停留节点(state),无任务;
executionService.singalExecutionById(执行id, transition名字) processEngine.getExecutionService().signalExecutionById("transition.10001",transitionName);
ii. 执行id获取方法:
1. jbpm4_execution表的id字段;
2. ProcessInstance#getId():执行流程获取id;
d) 示例:
public voidtestTransitionTest() { //下一个流程执行节点name String transitionName = "to 审核【经理】"; processEngine.getExecutionService() .signalExecutionById("transition.10001", transitionName); }
4. start
a) 开始节点;
5. end:
a) 结束节点;
b) end-cancel:
i. 取消结束;
c) end-error:
i. 异常结束节点
6. task任务节点:
a) 条件:
i. 存在负责人,由指定的负责人进行任务的办理;
ii. Assignment--->assignee
b) 指定负责人的方式:
i. 绘图时指定(个人、#{变量名})
ii. 通过<task>中添加<assignment-handler class=””>指定类;
7. task任务——指定个人:
a) 绘图时指定;
Assignment--->assignee---->个人名称
b) 缺点:
i. 与人就行耦合,人离职就不能使用了;
c) 通过变量指定;
Assignment--->assignee---->#{变量名}
d) 运行中,通过变量指定负责人:
i. 定义Map变量;
ii. 通过executionService、TaskService设置;
e) 示例:
Map<String, Object> assigne = new HashMap<String, Object>(); assigne.put("userName", "张三"); processEngine.getExecutionService().startProcessInstanceByKey("task", assigne);
8. task任务——指定类
a) 方式:
i. <task>中添加<assignment-handler class=””>指定类;
b) 类:
i. 实现接口AssignmentHandler
c) 重写方法:
i. assign(assignable,openExecution)
d) 参数:
i. assignable:指定负责人的
1. assignable.setAssignee(负责人)
ii. openExecution:获取变量的;
1. .getVariable();
e) 好处:
i. 可以有效控制任务的负责人;
ii. 可以添加逻辑;
f) 示例:
public class AssignmentHandlerTest implements AssignmentHandler{ @Override public void assign(Assignable assignable, OpenExecution openExecution) throws Exception { //通过获取变量指定 // String userName=(String)openExecution.getVariable("userName"); // assignable.setAssignee(userName); assignable.setAssignee("李四"); } }
9. task任务——强制指定负责人
a) 用途:
i. 当前任务已经有负责人了,强制更换负责人;
ii. 可以在任务完成之前的任何时候;
b) 方式:
taskService.assignTask(任务id,负责人)
c) 示例:
processEngine.getTaskService().assignTask("30010", "王五");
10. 组任务candidate---多用户(绘图):
a) 用途:
i. 存在一个任务,该任务由指定一组人来完成;
ii. 组内任何人都可以完成;
b) 方式:
i. 绘图时:Assignment----type---candidate-user
ii. Assignment----expression---多个用户之间“,”隔开;
iii. 小王,小丽,小六
iv.
c) 表jbpm4_participation:
i. 多用户数据被存在于jbpm4_participation中;
ii. 在jbpm4_task表中当前任务没有负责人;
d) 查询组任务:
i. taskService.findGroupTasks(组中定义的用户名之一)
e) 拾取任务:
taskService.takeTask(任务id,任务负责人)
i. 任务被拾取后,其它人将不可再次查询,拾取
ii. 组任务被拾取后,就变成个人任务了,不再是组任务;
f) 拾取任务后操作:
i. 自己完成;
ii. 改变任务负责人
iii. 将任务归还任务组;
g) 改变任务负责人:
taskService.assignTask(任务id,其它用户);
h) 将任务归还任务组
taskService.assignTask(任务id,null);
i) 查询个人任务:
findPersonalTask();
11. 组用户——多用户(assignment-handler)
a) <task>节点,添加:
<assignment-handlerclass=””>
b) 组用户类:
i. 实现AssignmentHandler接口;
ii. 重写方法assign(assignable, openExecution)
c) 添加组用户:
assignable.addCandidate(用户之一);
d) 实例:
public class GroupTaskAssignmentHandler implements AssignmentHandler{ @Override public void assign(Assignable assignable, OpenExecution openExecution) throwsException { //指定组内候选人 assignable.addCandidateUser("一毛"); assignable.addCandidateUser("二毛"); assignable.addCandidateUser("三毛"); } }
12. 组任务—已存在组添加用户:
a) 添加方法:
public void testTaskGroupAssignPersonal() { String user = "四毛"; //将任务指派给组内某个成员 processEngine.getTaskService().addTaskParticipatingUser("80009", user, Participation.CANDIDATE); }
13. state:
a) 状态节点;
i. 自动完成的一些任务的节点;
ii. 同其它节点的执行;
14. decision判断节点:
a) 作用:
i. 主要用于分支情况;
ii. 根据 自定义方式控制节点的流转;
b) handler class :
i. 指定判断类;
ii. 实现接口:DecisionHandler;
iii. 重写方法decide():
iv. 参数openExcution:
1. 用于获得流程运行过程中的一些变量;
2. .getVarable(“变量name”);
v. 返回值:
1. 下一个流程节点的“name”
c) 实例:
i. DecisionHandler:
public class DecisionHandlerTest implements DecisionHandler{ @Override public Stringdecide(OpenExecution openExecution) { //获取参数 double money = (Double)openExecution.getVariable("money"); if(money< 10000) { return "to结束"; } else{ return "to审批【总经理】"; } } }
15. fork/join分支、合并节点:
a) 作用:
i. 表示并行的、一定要执行的任务;
ii. 在fork分支后,一定要用join将分支合并;
b) 整个任务必须所有的分支都执行完毕,方可完成;