Activiti工作流那些事

           本来这篇博客应该早一点写,已经过去快两个月了,之前在公司一个项目组开发了基于Activiti流程系统设计。其实技术层面上很简单,就是封装成与项目或者说自身系统相关的一套API,便于其他开发人员使用,让开发人员在使用工作流的时候很方便。本来业务流程和业务就应该解耦合,这里就会涉及到抽象设计(所有业务类继承工作流抽象类),这也是我们在设计业务框架必备的,这里就不啰嗦抽象设计相关的了。

         做过J2EE相关业务系统对JBPM并不陌生,今天我们将揭开它的一层面纱,工作流一种抽象的概念,对于工作流引擎的解释请参考百度百科:工作流引擎,我们软件工程师的职责就将抽象编程现实,很多语言都应该有这方面的解决方案,目前也有很多公司专注于这块的解决方案。

         Java这块是之前一直是JBPM,  Activity与JBPM是什么关系呢? 这里就是一些八卦的事情了.........。对于我这这种喜欢八卦的人来说,下面是我找到的Activi八卦段落,IT是一种文化,而不再是一种技能.....。就像我们喜欢去阅读一些计算机发展史一样。
          对jBPM来说,今年最大的事件莫过于jBPM的创建者Tom Baeyens离开JBoss了。Tom Baeyens离开的具体原因尚不清楚,但他的离开产生了两个结果:一是jBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过;二是Tom Baeyens加入Alfresco后很快推出了新的基于jBPM4的开源工作流系统Activiti。由此不难推测Tom Baeyens离开的部分原因:JBoss内部对jBPM未来版本的架构实现产生了严重的意见分歧。更加巧合的是12月1日Activiti5刚发布,紧接着12月2日jBPM5就发布了第一个候选发布版本,jBPM与Activiti之间的微妙关系可见一般。

        废话少说,上代码,也许这才是实际该干的事情,环境搭建这类似的问题,我就不介绍了。

1、这是Activiti的一些基于Spring的服务注入,因为涉及到保密的原因,与业务相关的代码我是做了部分处理。

/**
 *
 * <p>Title: JBPM核心业务抽象类
 * <p>版本:1.0
 * <p>Company:XX信息系统有限公司</p>
 * <p>作者: 左钦菠 
 * <p>创建时间:2014-11-13
 * @author zuoqinbo
 * <p>部门:软件所
 * <p>修改者:zuoqb
 * <p>修改时间:下午07:06:47
 */
public abstract class JBPMService {
    /**
     * 流程引擎
     */
    @Autowired
    protected ProcessEngine ProcessEngine;
    /**
     * 流程引擎任务服务
     */
    @Autowired
    private TaskService taskService;
   
    /**
     * 流程定义接服务
     */
    @Autowired
    private RepositoryService repositoryService;
    /**
     * 流程引擎正在执行服务
     */
    @Autowired
    private RuntimeService runtimeService;

}

2、开始开启一个工作流程,传入的就是业务单据唯一编号,这样就可以通过业务编号去查找该工作流程处于哪一环节。

       /**
     *
     *方法说明: 启动流程引擎
     *@param
     *@return void
     *@author zuoqinbo
     * @throws Exception
     *@throws
     *@创建时间 2014-11-19
     */
    public  void startProcess(String businessKey) throws Exception{
        try {
            Map<String , Object> variable = new HashMap<String, Object>();
            String businessProcessModule = getProcessModule();//流程图变更时,新发起流程模板就选择当前最新的模板
            ProcessInstance instance = runtimeService.startProcessInstanceByKey(businessProcessModule,businessKey, variable);//开始流转
            Task task = taskService.createTaskQuery().executionId(instance.getId()).singleResult();//第一个节点任务提交
            taskService.complete(task.getId());//过了启动环节之后,流程流转到下一个环节
            saveDBSY(businessProcessModule,businessKey);//保存到待办事宜信息
        }catch (Exception e) {
            throw new RuntimeException("流程引擎启动报错:"+e);
        }
    }


3、下面这个方法就是流程流转,我理解的也是首次是这样理解流程的,但是不知道是不对的,如有看到这样理解不准确的,请留言。流程继续往下走,要么是True或者是false,就是就是nextProcess()
    /**
     *
     *方法说明:流程流转其实就是往下一个流程的进行,

     *不需要进行判断什么状态和什么业务方法进行绑定,传入审批结果和审批意见就行

     *@return void
     *@author zuoqinbo
     * @throws Exception
     *@创建时间 2014-11-18
     */
    public void nextProcess(String businessKey,String spjg,String spyj) throws Exception{
            String businessProcessModule = getProcessModule(businessKey);//新发起一个流程就选择当前最新的模板、如果流程已经在运行中,那么就选择待办事项中的流程图模板
            ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey,businessProcessModule).singleResult(); //再次获取实例对象
              if(instance==null){
                    throw new RuntimeException("该业务在流程引擎中不存在");
                }
            String executionId = instance.getId();//根据流程实例找到对应的任务
            Task task = taskService.createTaskQuery().executionId(executionId).singleResult();//获取到任务实例
            Map<String , Object> variables = getPassConditionMap(spjg, businessKey);
            taskService.complete(task.getId(),variables);    //提交任务(审批完毕)
            task = taskService.createTaskQuery().executionId(executionId).singleResult();//想判断出是终审结束还是不继续结束
            String processStatusMC = "已终审结束";//终审
            String processStatus  = "结束";
            if(task!=null){
                processStatusMC = task.getName();//获取已经到的流程环节名称和状态更新代办事宜
                processStatus = "审核中";//更新代办事宜 获取最新的任务在哪个环节,如果流程结束则没有任务了
            }else{//如果是终审
                dealFinalBusiness(businessKey);//如果是终审就执行终审业务
            }
           updateDBSY(businessKey,processStatusMC,processStatus,spjg,spyj);//更新代办事宜
    }
   


//子类继承父类,实现其抽象方法,抽象方法可以获取业务Id,业务流程Key 业务类型
  
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值