今天在完善OA系统工作流的过程中,对于一直没有处理的动态指定assignee的问题进行了一个处理,因为去网上查了很多资料,但是都不太符合要求,或者感觉可能不太懂,于是自己想了一种方法,如果有什么更好的方法,请大家指导一下我,对于jbpm我也是初学。
首先说一下我的工程以及对于jbpm的需求。现在有一张表,Form,用来存储申请信息,这里可以是请假申请,可以是财务申请,对于这些具体分类,我用额外的表来存储相关的数据。
Form表主要存储的字段有
public class Form {
/** 表单状态常量:审批中 **/
public static final String STATUS_RUNNING = "审批中";
/** 表单常量:已通过 **/
public static final String STATUS_APPROVED = "已通过";
/** 表单常量:未通过 **/
public static final String STATUS_REJECTED = "未通过";
private Long id;
private ApplicationTemplate applicationTemplate; // 申请所用的文档模板
private Set<ApproveInfo> approveInfos = new HashSet<ApproveInfo>();
private User applicant; // 申请人
private String title; // 标题
private Date applyTime; // 申请时间
private String path; // 文档的存储路径
private LeaveFormInfo leaveFormInfo; // 对应请假表信息序号
<pre name="code" class="java">
这里我只做了请假表,具体的以后还需要完善。
jbpm的xml是这样的
<?xml version="1.0" encoding="UTF-8"?>
<process name="员工请假流程" xmlns="http://jbpm.org/4.4/jpdl">
<start g="264,32,48,48" name="start1">
<transition g="-69,-22" name="to 提交申请" to="提交申请"/>
</start>
<end g="264,364,48,48" name="end1"/>
<task g="242,112,92,52" name="提交申请" assignee="#{user.department.name}">
<transition g="-93,-22" name="to 部门经理审批" to="部门经理审批"/>
</task>
<task assignee="zs" g="242,196,92,52" name="部门经理审批">
<transition g="-81,-22" name="to 分公司总经理审批" to="分公司总经理审批"/>
</task>
<task assignee="ls" g="242,280,92,52" name="分公司经理审批">
<transition g="-50,-22" name="to end1" to="end1"/>
</task>
</process>
这里指定的审批人是固定的,所以对于实际使用的OA系统来说,很不方便。
我采用的方法是,在form的表后面加几个字段。
private String bossMax; // 最高领导
private String bossMin; // 第一审批
private String bossSec; // 第二审批
private String bossThi; // 第三审批
private String bossFou; // 第四审批
那么这几个字段的用处就在于指定审批人,然后每次发起任务申请的时候,将审批人存入form表中,这样xml中就可以这样写
<?xml version="1.0" encoding="UTF-8"?>
<process name="员工请假流程" xmlns="http://jbpm.org/4.4/jpdl">
<start g="264,32,48,48" name="start1">
<transition g="-69,-22" name="to 提交申请" to="提交申请"/>
</start>
<end g="264,364,48,48" name="end1"/>
<task g="242,112,92,52" name="提交申请" assignee="#{user.department.name}">
<transition g="-93,-22" name="to 部门经理审批" to="部门经理审批"/>
</task>
<task assignee="#{form.bossMin}" g="242,196,92,52" name="部门经理审批">
<transition g="-81,-22" name="to 分公司总经理审批" to="分公司总经理审批"/>
</task>
<task assignee="#{form.bossSec}" g="242,280,92,52" name="分公司经理审批">
<transition g="-50,-22" name="to end1" to="end1"/>
</task>
</process>
如果有更多的审批,可以继续添加,然后在java中动态指定对应的人即可。
这样做的好处是根据不同的部门对应的不同的领导,发起申请时,都可以确定对应的审批人。
java中的代码实现方法很多,我这里说下我的思路,涉及几个表不太好发出,
department表中,有一个部门序号路径,由当前最高级departmentId到当前departmentId的序列,由“-”隔开,然后通过对序列的处理,可以找出本部门对应的上级领导。从而确定审批人。这个思路是刚相出的,还不完善,大家有什么好的方法,万望不吝赐教。