一直在搞工作流(activiti),总结一下关于工作流(activiti)中同时并发处理多个子流程的操作方法。

先说下我要实现的业务:

1、办公室发通知(在系统申报页面上,勾选科室,被选中的科室执行第二步)

2、科室科员填报数据

3、科室科长做审核(注意这里的科长审核是对应第二步的科室,本科科长去审核本单位填报完的任务)

4、办公室编制立项书,汇总数据

好,需求就先这样,这里主要是给讲解一下关于子流程的使用,所以其他的需求就不往上写了。

先看一眼画好后的流程图:

activiti并发多实例子流程任务处理

可以看到任务发起时(启动流程实例时)就进入了子流程中,这里需要关心的是怎么才能生成多个子流程呢,请看:

activiti并发多实例子流程任务处理

接下来我们对这个子流程进行配置:

activiti并发多实例子流程任务处理

注:1、Collection:可以存放集合,集合中可以存任意值,工作流会根据你集合里的值个数,去生成对应的子流程,

     例如:我这里存的是3个科室code,{0001,0002,0003},那么就会生成出3个子流程,

     其实这里我简单说明一下,如果只传入1个值会生成4个流程实例,

     传2个会生成出6个流程实例(多出的两个,一个是子流程subprocess的,一个是流程中第一个任务的),以此类推。

      2、Element variable:顾名思义就是节点流程变量,用于在流程图中代替集合中表示当前子流程的变量(我这存的是科室code,所以表示的就是科室code)。

    这个节点流程变量可以在当前子流程中任意的task中使用,例如 子流程中的任务我就用到了这个变量,稍后会有图详细说明

  3、Completion condition:顾名思义就是完成条件,这里写的表达式如果满足即可到(第三步:立项书编制)这个任务,关于这里的配置,

    给大家推荐一个网址介绍:http://my.oschina.net/winHerson/blog/139267?fromerr=ApnxMXj5

接下来继续配置,我的业务需求是 选中的科室做填报,并且有这个科室的科长去审核,那么我们接着去配置具体的用户任务(userTask)

activiti并发多实例子流程任务处理

这里简单讲一下我做的这个项目的权限控制,我这里是通过权限点去控制显示每个任务的待办的权限,假如张三 有PM10000101权限点,

他就能看到任务中配置了PM10000101的待办,因为我的系统是三级树权限控制,用户--角色--权限点(功能点),

所以我在工作流Candiate groups中配置的是功能点,各位可以根据自己系统的需要去合理配置。

顺便在讲一下将${candiateUser}配置到Candidate users或者Candidate groups的后果,

它会根据你集合中存的变量个数生成出任务来比较恶心的是这种形式,例如:

candiateUserList中存了{001,002,003},按照规则会生成出3个子流程(A、B、C),

但是在生成任务的时候会生成出这种A(001)、A(002)、A(003)、B(001)、B(002)、B(003)、C(001)、C(002)、C(003)

问题是我这里不需要这么生成任务,只需要一个流程对应1个任务就OK,所以我将${candiateUser}配置到了userTask的描述信息中

activiti并发多实例子流程任务处理

配置到了这一步基本告一段落,下面我将我的查询待办sql贴出来,相信大家都懂了

SELECT T.SERIAL_NUMBER,
        (SELECT Q.DO_USERNAME FROM  ACT_HI_TASKREMARK Q WHERE Q.P_ID=T.PROC_INST_ID_ AND Q.TASK_ID IS NULL AND ROWNUM <2 ) AS  CREAT_USER,
       T.ID_ AS ID,
       T.PROC_INST_ID_ AS PID,
       T.EXECUTION_ID_ AS EID,
       P.NAME_ AS TASKTYPE,
       T.NAME_ AS FLOWNAME,
       TO_CHAR(T.CREATE_TIME_, 'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIME,
       TIMEHEADER((REPLACE(SUBSTR(TO_CHAR(NUMTODSINTERVAL((SELECT CEIL((TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') -
                    TO_DATE(TO_CHAR(T.CREATE_TIME_, 'YYYY-MM-DD HH24:MI:SS'),
                             'YYYY-MM-DD HH24:MI:SS')) * 24 * 60)
          FROM DUAL),'MINUTE')),'12','5'),':','小时')||'' )) STAY_TIME,
        DECODE((SELECT V.TEXT_ FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_ = T.PROC_INST_ID_ AND V.NAME_ = 'IS_URGENCY'),'2','<FONT COLOR="RED">【紧急】</FONT>','3','<FONT COLOR="PURPLE">【特急】</FONT>','<FONT COLOR="GREEN">【常规】</FONT>')||(SELECT V.TEXT_ FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_ = T.PROC_INST_ID_ AND V.NAME_ = 'TASKNAME') TASKNAME,
        (SELECT V.TEXT_ FROM ACT_RU_VARIABLE V WHERE V.PROC_INST_ID_ = T.PROC_INST_ID_ AND V.NAME_ = 'DEADLINE') DEADLINE,
        (SELECT COUNT(1) FROM  CT_PURSUE C WHERE C.TASKID = T.ID_) URGE_TIME
        
  FROM ACT_RU_TASK T, ACT_RU_IDENTITYLINK F, ACT_RE_PROCDEF P
  WHERE T.ID_ = F.TASK_ID_(+)
   AND T.PROC_DEF_ID_ = P.ID_
    AND ('当前登录用户名' IN (SELECT U.USERNAME FROM PERM_ROLE_FUNC R, PERM_USERS U WHERE U.ROLE LIKE '%' || R.ROLEID || '%' AND R.FUNCCODE IN (F.GROUP_ID_) GROUP BY U.USERNAME)  
       OR '科室code' IN (T.DESCRIPTION_))
   AND 1=1
   AND 1=1 
   AND (NVL(T.DESCRIPTION_,'1')='1' OR T.DESCRIPTION_ ='科室code')
我的待办

相关文章: