NetBpm如何指定下一流程处理人
本着“软件以应用为本”(潘加宇老师对我的影响在这一点上很深。)的原则,我为ERP搭建了一个用NETBPM作的支持网站,想着能够看着软件得以应用,自是非常高兴。
不过,这个工作流的缺点也是显然的,如何在流程中让上一操作者指定下一个操作者就是一个难点,因为根据预先的组织关系进行的分派很有可能出现流程无法进行下去的危险,这样就会限制软件的应用。想着netbpm脱胎于jbpm,我就想找找答案。当然有很多此类文章,不过,还是没有找到好使的。
于是,只好自己思考了。我觉得有三个解决办法:一是在流程中让用户指定一个actor,不过要增加一些处理的类;二是利用action来进行处理;三是采用decision的方式来判断。
对于第二种思路,我检查代码,发现行不通。原因是我想在事件before-activitystate-assignment触发对actor赋值,但是这两者是分开发生的,无法先行赋值给一个actor,造成了actor的Null值错误。开始还想直接通过数据库进行赋值,通过查询attribute的位置,将值赋好,不过这是绝对违背软件的原则的,而且也行不通。
第三种方法还来不及细想,只好回到第一种方法上来。我想的是直接让用户选择下一个actor。开始想在序列化的时候保存actor.id即可,谁知道总是报错,序列化行不通。只好改在htmlformatter上想办法,竟然成功!非常简单,又容易理解,嘿嘿,看来走了不少弯路。
代码如下:
public String ObjectToHtml(Object valueObject, String parameterName, System.Web.HttpRequest request)
{
System.String temp = "";
IList users=OrganisationUtil.Instance.FindAllUsers();
System.String text = "<select name=\"" + parameterName + "\" >";
foreach(IUser user in users)
{
temp="";
temp="<option value=\""+user.Id+"\">"+user.FirstName+user.LastName+"</option> ";
text+=temp;
}
text+="</select>";
return text;
}
public Object ParseHttpParameter(String text, System.Web.HttpRequest request)
{
IUser user=OrganisationUtil.Instance.GetUser(text);
return user;
}
当然,如何取得所有的用户,需要增加一个方法即可。
解决此问题,耗时6个小时,觉得又增加了一些功力一般。挺高兴的。
注意:发现一个group下一个用户只能有一个role,不然无法查找group.
感谢网上许多的文章,让netbpm变得有点用了。