文章目录
- ☃️7.1 画图
- ☃️7.2 配置
- 7.2.1 配置任务办理人
- 7.2.1.1 写死的方式配置任务办理人(不推荐)
- 7.2.1.2 #{}方式配置任务办理人
- 7.2.1.3 实现接口方式配置任务办理人
- 7.2.1.4 方法指定方式分配任务办理人
- 7.2.2 配置节点属性
- 7.2.2.1 判断节点(decision)
- 7.2.2.2 分支/聚合节点
- 7.3 ☃️完成画图与配置后的效果
- 7.3.1 完成后的图
- 7.3.2 完成后配置的xml文件
☃️7.1 画图
完成以上的配置和概念了解后,我们来画图实际操作吧:
首先,我们画出如下图这样的一个流程图出来:(下图彩线箭头和汉语文字为辅助添加的,不包含在原流程图中)
☃️7.2 配置
7.2.1 配置任务办理人
7.2.1.1 写死的方式配置任务办理人(不推荐)
当我们点击流程图中的每个节点,流程图下方都会出现如下图示的 属性编辑 框。
如果没有弹出该框。请在myeclipse 工具 ,按下图操作:
弹出该框后,我们看到该框有两个编辑栏可编辑:
点击 General 属性,可以在 右侧 输入框 输入 该节点的名称 ,输入名称后 该名称将会作为 该节点的name显示在流程图中和保存在数据库的相关表中(如下图示)。
点击 Assignment 属性,可以在右侧 输入框 配置该节点的
我们将本案例的流程图的 task1 和 task2 的任务办理人按照同样的方式分别设置成 “张三” 和 “李四” 。
7.2.1.2 #{}方式配置任务办理人
如下图操作:
然后,这样设置的是一个动态的,我们在完成 该节点的上一步 的任务的时候去设置该处的具体任务办理人。
具体代码在办理任务的时候添加。
7.2.1.3 实现接口方式配置任务办理人
该方式不需要在画图处设置,但是要在 流程图 的 xml 文件里设置。
我们此处是要设置 task4 的办理人,所以我们打开 流程图 的Source文件(如上图示):
找到 task4 的节点 ,加入如下节点,在该节点指定该处任务办理人的处理类的全路径名(完成后效果如下)。
<task name="task4" g="512,360,92,52"><assignment-handler class="com.snow.config.User3AssignmentHandlerImpl"> </assignment-handler><transition name="to join1" to="join1" g="-49,-22"/></task>
注意:该类必须是实现了 AssignmentHandler 接口的类(如下)。
public class User3AssignmentHandlerImpl implements AssignmentHandler {private static final long serialVersionUID = 1L;@Overridepublic void assign(Assignable assignable, OpenExecution execution) throws Exception {// 模拟从 数据库 拿到 的 相关人String userName = "王五";// 将 获取到的办理人 设置 给 该任务assignable.setAssignee(userName); }
}
该类的调用时机是在 流程图 的流走到该节点自动调用。
7.2.1.4 方法指定方式分配任务办理人
此方式不需要在流程图中指定。需要在流程走到该节点之前的任何时机指定。
代码如下:
// 使用默认配置文件,先获取流程引擎
ProcessEngine processEngine = Configuration.getProcessEngine();
// 获取任务serviec
TaskService taskService = processEngine.getTaskService();
String tasjId = "1010101";
String userId = "赵六";
askService.assignTask(taskId, userId);
7.2.2 配置节点属性
7.2.2.1 判断节点(decision)
这是一个判断节点,流程走到这一步会根据该流程的特定属性进行判断,判断条件写在一个实现了 DecisionHandler 接口的类里,并在这里指定类的全限定类名。
实现类如下:
public class My3DecisionHandlerImpl implements DecisionHandler {private static final long serialVersionUID = 2L;// 根据指定的属性进行流程下一步的判断@Overridepublic String decide(OpenExecution execution) { // 获取申请数额 (这里的属性是在 流程到达该节点前指定的)Double money = Double.parseDouble((String) execution.getVariable("money"));// 重新分配流程下一步走向if(money > 100000){// task6 节点名称 具体在画图时已指定 return "to task6";}// end1 介绍节点名称 具体在画图时已指定return "to end1";}
}
该类控制下图的走向:
7.2.2.2 分支/聚合节点
如上图示:
流程完成 task2 后,会进入 fork(分支) 节点,流程一分为二:指向 task3 和 task4 。此时 task3 和 task4 节点任务办理人分别在他们的任务列表会看到该任务,只有当他们完成了各自的任务后,该流程才能继续往下走(task3 和 task4 任何一个节点任务没有完成,流程都不会再继续往下走),汇入 join 节点。
注意:区别于decision判断节点,分支与聚合节点本身是不需要额外的代码控制的,这两个节点本身自带的逻辑控制功能。
7.3 ☃️完成画图与配置后的效果
7.3.1 完成后的图
至此,我们的流程图 层面的配置就完了,流程图如下:
7.3.2 完成后配置的xml文件
流程图产生的xml文件如下(注意看配置相关节点节后与原xml文件的对比):
<?xml version="1.0" encoding="UTF-8"?><process name="test" xmlns="http://jbpm.org/4.4/jpdl"> <start g="472,32,48,48" name="start1"> <transition g="-46,-17" name="to task1" to="task1"/> </start> <task assignee="张三" g="450,112,92,52" name="task1"> <transition g="-47,-10" name="to task2" to="task2"/> </task> <decision g="472,608,48,48" name="exclusive1"> <handler class="com.snow.config.My3DecisionHandlerImpl" /> <transition g="6,-19" name="to end1" to="end1"/> <transition g="-45,-17" name="to task6" to="task6"/> </decision> <task assignee="李四" g="450,196,92,52" name="task2"> <transition g="-44,-8" name="to fork1" to="fork1"/> </task> <task assignee="#{user3}" g="388,360,92,52" name="task3"> <transition g="-49,-22" name="to join1" to="join1"/> </task> <task g="512,360,92,52" name="task4"> <assignment-handler class="com.snow.config.User3AssignmentHandlerImpl"/> <transition g="-49,-22" name="to join1" to="join1"/> </task> <fork g="472,280,48,48" name="fork1"> <transition g="-44,-15" name="to task3" to="task3"/> <transition g="4,-10" name="to task4" to="task4"/> </fork> <join g="472,444,48,48" name="join1"> <transition g="-52,-22" name="to task5" to="task5"/> </join> <task g="450,524,92,52" name="task5"> <transition g="-79,-22" name="to exclusive1" to="exclusive1"/> </task> <end g="472,772,48,48" name="end1"/> <task g="378,688,92,52" name="task6"> <transition g="-50,-22" name="to end1" to="end1"/> </task></process>