本站首页    管理页面    写新日志    退出


«August 2020»
1
2345678
9101112131415
16171819202122
23242526272829
3031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7244021
建立时间:2006年5月29日




[JBoss]一个JBPM工作流管理示例
软件技术,  电脑与网络

lhwork 发表于 2006-6-30 16:24:18

示例:在某一公司中,部门员工要休假的话需要部门主管的批准。如果休假天数大于10天的话,在部门主管的同意后,还必须上级主管批准。如果是部门主管要休假只要上级主管批准即可。在休假被批准之前,申请人可以撤销休假申请。每 个员工还有多少天休假必须管理起来,在员工提交休假申请时要检查申请天数是否超过可用天数。申请批准后,要在可用天数里减去申请天数。每次休假申请结束之 后,不管通过未通过或是否取消,都必须记录下来。主管在批复申请之后,系统要将批复结果Email给申请人。对于大于10天的申请,如果部门主管已批准同 意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。   processdefinition.xml如下:<?xml version="1.0" encoding="UTF-8"?><!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by keller (zju) --><!DOCTYPE process-definition PUBLIC    "-//jBpm/jBpm Mapping DTD 2.0//EN"    "http://jbpm.org/dtd/processdefinition-2.0.dtd"><process-definition  name="RequestLeave"> <swimlane name="requester">  <description>申请者</description> </swimlane> <swimlane name="chief">  <description>部门主管</description>  <delegation class="kellerdu.jbpm.delegation.ChiefSwimlane"/> </swimlane> <swimlane name="boss">  <description>上级主管</description>  <delegation class="kellerdu.jbpm.delegation.BossSwimlane"/> </swimlane> <start-state name="request" swimlane="requester">  <transition to="BeginRequest"/> </start-state> <fork name="BeginRequest">  <transition to="RequesterCancel"/>  <transition to="IsChief"/> </fork> <decision name="IsChief">  <delegation class="kellerdu.jbpm.delegation.ChiefDecision"/>  <transition name="BossApprove"  to="BossApprove"/>  <transition name="ChiefApprove"  to="ChiefApprove"/> </decision> <state name="RequesterCancel">  <assignment swimlane="requester"/>  <transition name="cancel" to="Decided">   <action>    <!-- 将请假的状态改变为“取消”-->    <delegation class="kellerdu.jbpm.action.RequestCancel"/>   </action>  </transition> </state> <state name="ChiefApprove">  <assignment swimlane="chief"/>  <transition name="approve" to="NeedBossApprove">   <action>    <!-- 将请假的状态改变为“主管批准”-->    <delegation class="kellerdu.jbpm.action.ChiefApprove"/>   </action>  </transition>  <transition name="disapprove" to="Decided">   <action>    <!-- 将请假的状态改变为“主管否决”-->    <delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>   </action>  </transition> </state> <state name="BossApprove">  <assignment swimlane="boss"/>  <transition name="approve" to="Decided">   <action>    <!-- 将请假的状态改变为“老板批准”-->    <delegation class="kellerdu.jbpm.action.BossApprove"/>   </action>  </transition>  <transition name="disapprove" to="Decided">   <action>    <!-- 将请假的状态改变为“老板否决”-->    <delegation class="kellerdu.jbpm.action.BossDisapprove"/>   </action>  </transition> </state> <decision name="NeedBossApprove">  <!-- 请假天数大于10天的要老板批准  -->  <delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>  <transition name="need" to="BossApprove"/>  <transition name="notNeed" to="Decided"/> </decision> <join name="Decided">  <description>有一个先到达即进行父Token</description>  <delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>  <transition to="DoSomething"/> </join> <decision name="DoSomething">  <description>    根据请求的状态决定。    (1)“主管或者老板批准”-‘approve’:修改员工休假的总天数,设定发给用户E-Mail的信息。    (2)“主管或者老板否决”-“disapprove”:设定发给用户E-Mail的信息。    (3)“撤销”-"cancel"-设定发给用户E-Mail的信息。如果主管批准,要发给主管消息说明已经撤销。    </description>  <delegation class="kellerdu.jbpm.delegation.DoSomethingDecision"/>  <transition name="disapprove" to="Finished">   <action>    <delegation class="kellerdu.jbpm.action.Disapprove"/>   </action>  </transition>  <transition name="approve" to="Finished">   <action>    <delegation class="kellerdu.jbpm.action.Approve"/>   </action>  </transition>  <transition name="cancel" to="Finished">   <action>    <delegation class="kellerdu.jbpm.action.Cancel"/>   </action>  </transition> </decision> <end-state name="Finished"/> <action event-type="process-end">  <!-- 发送E-Mail消息给申请者,记录请假日志 -->  <delegation class="kellerdu.jbpm.action.ProcessEndAction"/> </action></process-definition> Action指明的是当前状态要执行的一些额外的操作,如记录log、发邮件等。(1)Swimline的delegation要做的就是判别当前Actor的身份。package kellerdu.jbpm.delegation;import org.jbpm.delegation.*;import kellerdu.jbpm.LogsFactory;import org.apache.commons.logging.Log;public class BossSwimlane implements AssignmentHandler {    public BossSwimlane() {    }    /**     * 当前的状态有哪个actor来具体负责处理,选择是老板的actor来处理。     *     * 如果王林是老板,那么他请假可以用他的名称来开始一个请假流程,当他检查他需要批示的     * 请假时,使用actorId=boss来找出所有的批示。这时selectActor返回的值就是一个常量“boss”     *     *     * @param assignmentContext AssignmentContext     * @return String     * @todo Implement this org.jbpm.delegation.AssignmentHandler method     */    public String selectActor(AssignmentContext assignmentContext) {        Log log = LogsFactory.getLogInstance(this.getClass());        log.info("任务分配给老板");        return "boss";    }}========================================ackage kellerdu.jbpm.delegation;import org.jbpm.delegation.*;import kellerdu.jbpm.LogsFactory;import org.apache.commons.logging.Log;public class ChiefSwimlane implements AssignmentHandler {    public ChiefSwimlane() {    }    /**     * selectActor     * @see BossSwimlane     *     * @param assignmentContext AssignmentContext     * @return String     * @todo Implement this org.jbpm.delegation.AssignmentHandler method     */    public String selectActor(AssignmentContext assignmentContext) {       Log log = LogsFactory.getLogInstance(this.getClass());        log.info("任务分配给上级主管");       return "chief";    }}(二)Decisionpackage kellerdu.jbpm.delegation;import org.jbpm.delegation.*;import kellerdu.jbpm.LogsFactory;import org.apache.commons.logging.Log;import kellerdu.jbpm.Constants;public class ChiefDecision implements DecisionHandler {    public ChiefDecision() {    }    /**     * 判断是否需要主管批准,决定下一个要进行的transition     *     * @param executionContext ExecutionContext     * @return String     * @todo Implement this org.jbpm.delegation.DecisionHandler method     */    public String decide(ExecutionContext executionContext) {        Log log=LogsFactory.getLogInstance(this.getClass());        String ac=(String)executionContext.getVariable(Constants.USER_NAME);        if(ac!=null&&(ac.equals("dali")||ac.equals("wang"))){            log.info(ac+"需要老板批准!");            return "BossApprove";        }else{            log.info(ac+"需要先经主管批准");            return "ChiefApprove";        }    }}=======================(三)forkpackage kellerdu.jbpm.delegation;import org.jbpm.*;import org.jbpm.delegation.*;import org.jbpm.model.execution.*;import java.util.*;public class DecidedJoin implements JoinHandler {    public DecidedJoin() {    }    /**     * fork,只要一个分支到达,即可进行下一步操作,同时取消其它同时进行的分支。     * 这里就是用户如果取消,请假就取消。如果用户请假批准,则用户不能取消。     *     * @param forkContext ForkContext     * @throws ExecutionException     * @todo Implement this org.jbpm.delegation.ForkHandler method     */    public void join(JoinContext joinContext) throws ExecutionException {        Iterator it=joinContext.getConcurrentTokens().values().iterator();        Token arrivingToken = joinContext.getToken();        while(it.hasNext()){            Token to=(Token)it.next();            if(to.getId().equals(arrivingToken.getId())){                //取消其它执行的Token                joinContext.getExecutionService().cancelToken(to.getId());            }        }         // reactivate the parent token.          joinContext.reactivateToken( arrivingToken.getParent() );    }} (一)  开始一个请假流程       //user是请假人的actorId       ExecutionService es=JbpmServiceFactory.getInstance().openExecutionService(user);        HashMap vs=new HashMap();       //一些参数        vs.put(Constants.REQUEST_STATUS,String.valueOf(0));        vs.put(Constants.REQUEST_RETURN_INFO,"No info!");        vs.put(Constants.USER_NAME,EncodeTransfer.toISO(user));        vs.put(Constants.REQUEST_DAYS,String.valueOf(rea.getDays()));        try {           //开启请假流程            es.startProcessInstance(Constants.WORK_NAME, vs);            log.info("["+user+"]"+"申请假期开始!请假"+rea.getDays()+"天!");            return am.findForward("main");        } catch (ExecutionException ex) {            ex.printStackTrace();            log.error("请假进程无法开始!");            return am.findForward("error");        }finally{            es.close();        }(二)当前执行任务    对于部门经理或者老板,找到要处理的请假。       String actorId = (String) req.getSession().getAttribute(Constants.USER);            if(actorId.equals("wang")){                actorId="boss";            }else if(actorId.equals("bigli")){                actorId="chief";            }            // get the execution service            ExecutionService executionService = JbpmServiceFactory.getInstance().                                                openExecutionService(actorId);            // get the tasklist from jbpm for user            List tasks = new ArrayList();            // add the jbpm tasks            tasks.addAll(executionService.getTaskList(actorId));            // put the tasklist into the form            mf.setTasks(tasks);            // get the tasklist from jbpm for user            List definitions = new ArrayList();            // add the jbpm definitions            definitions.addAll(executionService.getLatestDefinitions());            // put the tasklist into the form            mf.setRequests(definitions);            // close the execution service            executionService.close();            req.getSession().setAttribute("mainForm",mf);            log.debug("任务: " + tasks);            log.debug("当前可以执行的请求: " + definitions);(三)处理请假           String actorId = (String) reqrest.getSession().getAttribute(Constants.                    USER);            Long tokenId=new Long(req.getParameter("tokenId"));            // get the execution service            ExecutionService executionService = JbpmServiceFactory.getInstance().                                                openExecutionService(actorId);            Map hm=executionService.getVariables(tokenId);//变量            String act=req.getParameter("action");//进行转换的transition            executionService.endOfState(tokenId,hm,act);            executionService.close();


阅读全文(47369) | 回复(32) | 编辑 | 精华
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

奋斗(游客)发表评论于2013-9-5 16:47:27

你好,能否给我一份源代码吗,我正在学习JBPM,谢谢!!邮箱地址:lidongdroid@gmail.com


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

chendangxian@126.com(游客)发表评论于2013-7-24 17:25:32

楼主,可以给一份源代码吗?非常感谢!

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

replcica watches(游客)发表评论于2012-10-13 18:36:40

能发给我一份原码吗 正在学习 930035142@qq.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

旭日(游客)发表评论于2012-8-15 16:27:01

能给一份源代码吗?让我学习一下,谢谢了,我的邮箱是:243535027@qq.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

michal(游客)发表评论于2012-5-9 17:26:46

你好,能否给我一份源代码吗,我正在学习JBPM,谢谢!!邮箱地址:michalhzm@gmail.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

葉知秋(游客)发表评论于2011-6-7 17:17:23

能发一份源码吗?谢谢 my_style_li@163.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

xianhaowang(游客)发表评论于2010-12-24 15:44:18

给我一份源代码吧,不胜感激! xianhaowang@126.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

学龄前(游客)发表评论于2010-11-16 10:39:11

你好 嫩给我一份源代码吗? 不胜感激 jevaisbien4587@hotmail.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

zccmp(游客)发表评论于2010-11-8 21:38:26

你好,能否给我一份源代码,我正在学习这块,谢谢!!邮箱地址:zccmp@163.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:一个JBPM工作流管理示例
软件技术,  电脑与网络

追鸿(游客)发表评论于2010-11-4 15:18:21

正在学习中,不知道现在能不能给我一份源码?谢谢!邮箱:ln2199@sohu.com

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 2 3 4 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144430877 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号