工作流参与者动态互斥解决方案_sql版

日期: 2008-10-08 作者:majs 来源:TechTarget中国 英文

  我们在工作流设计的过程中,是否碰到这样的情况,一个人属于两个岗位(比如经办岗和复核岗),但是,对于同一笔单子(即一个流程实例),不能既经办又复核。业务提出这样的需求是有一定道理的,对于同一笔单子,为了保证安全性,需要经过两个人来确保,对于不同的单子,同一个人,可以在这笔单子做经办,另外一笔单子做复核。可能有的人会说,你直接让一个人不能同时拥有这两个岗位就可以了,确实,那样解决了这个问题,那是一种静态的互斥,但是灵活性差一点。而业务需求的原因就是因为在实际的情况下,可能经办和复核的工作量有差别,而人员又比较少,且现实中确实也是一个人又可以经办、又可以复核。总的来说,这个需求是有一定的实际意义的

  总体解决方案

  扩展wfworkitemview

  我的处理方法是在工作列表上进行处理(主要是针对领取),对现有的wfworkitemview进行扩展,其实就是新写个VIEW,然后通过新写的这个视图进行工作任务的塞选,具体思路如下:

  首先查找到对应能领取的任务

  然后找到每个最后完成的workitem

  以上两个进行互斥的结果就是登录人员待领取的

  以上也考虑到了主流程到子流程的情况

  CREATE OR REPLACE VIEW WFWORKITEMVIEWFORACP AS

  SELECT /*+ rule */
  DISTINCT CU.SYS_NAME,
           CU.PROCESSINSTDESC AS PROCESSINSTDESC,
 
           CU.ACTIONURL AS ACTIONURL,

           CU.EXTEND1 AS EXTEND1,

           CU.WORKITEMID,

           CU.WORKITEMNAME,

           CU.WORKITEMDESC,

           CU.WORKITEMTYPE,

           CU.CURRENTSTATE,

           CU.PARTICIPANT,

           CU.PRIORITY,

           CU.ISTIMEOUT,

           CU.LIMITNUM,

           CU.LIMITNUMDESC,
 
           CU.CREATETIME,

           CU.STARTTIME,

           CU.ENDTIME,

           CU.FINALTIME,

           CU.PROCESSINSTID,

           CU.ACTIVITYINSTID,

           CU.STATESLIST,

           CU.TIMEOUTNUM,

           CU.TIMEOUTNUMDESC,

           CU.EXTEND2,

           CU.ACTIVITYINSTNAME AS ACTIVITYINSTNAME,

           CU.CURRENTSTATE AS PROCINSTCURRSTATE,

           DICT.BUSINNAME AS PROCESSINSTNAME,

           CU.CREATETIME AS PROCINSTCREATETIME,

           CU.ENDTIME AS PROCINSTENDTIME,

           CU.PROCESSDEFNAME AS PROCESSDEFNAME,

           CU.PROCESSCHNAME AS PROCESSCHNAME,

           CU.VERSIONSIGN AS VERSIONSIGN,

           CU.CURRENTFLAG AS CURRENTFLAG,

           CU.OPERATORID

   FROM (SELECT SD.SYS_NAME,
               WFPROINS.PROCESSINSTDESC AS PROCESSINSTDESC,

               WITEM.ACTIONURL AS ACTIONURL,

               WFDEF.EXTEND1 AS EXTEND1,
               WITEM.WORKITEMID,
               WITEM.WORKITEMNAME,
               WITEM.WORKITEMDESC,
               WITEM.WORKITEMTYPE,
               WITEM.CURRENTSTATE,
               WITEM.PARTICIPANT,
               WITEM.PRIORITY,
               WITEM.ISTIMEOUT,
               WITEM.LIMITNUM,
               WITEM.LIMITNUMDESC,
               WITEM.CREATETIME,
               WITEM.STARTTIME,
               WITEM.ENDTIME,
               WITEM.FINALTIME,
               WITEM.PROCESSINSTID,
               WITEM.ACTIVITYINSTID,
               WITEM.STATESLIST,
               WITEM.TIMEOUTNUM,
               WITEM.TIMEOUTNUMDESC,
               WITEM.EXTEND2,
               OPER.USERID,
               OPER.OPERATORID,
               WITEM.WORKITEMNAME AS ACTIVITYINSTNAME,

               WFPROINS.CURRENTSTATE AS PROCINSTCURRSTATE,

               WFPROINS.PROCESSINSTNAME AS PROCESSINSTNAME,

               WFPROINS.CREATETIME AS PROCINSTCREATETIME,
               WFPROINS.ENDTIME AS PROCINSTENDTIME,

               WFDEF.PROCESSDEFNAME AS PROCESSDEFNAME,

               WFDEF.PROCESSCHNAME AS PROCESSCHNAME,

               WFDEF.VERSIONSIGN AS VERSIONSIGN,

               WFDEF.CURRENTFLAG AS CURRENTFLAG

          FROM (SELECT * FROM WFWORKITEM WHERE WFWORKITEM.CURRENTSTATE = 4) WITEM,

               EOSOPERATOR OPER,
               EOSORG_T_EMPPOSITION EPOSI,
               EOSORG_T_POSITION POSI,
               WFPROCESSDEFINE WFDEF,
               WFPROCESSINST WFPROINS,
               SYSDESC SD,
               WFWIPARTICIPANT PANT
         WHERE PANT.WORKITEMID = WITEM.WORKITEMID

           AND POSI.POSITIONID = TO_NUMBER(PANT.PARTICIPANT)

           AND EPOSI.POSITIONID = POSI.POSITIONID

           AND PANT.PARTICIPANTTYPE = “position”

           AND OPER.OPERATORID = EPOSI.OPERATORID

           AND WITEM.PROCESSINSTID = WFPROINS.PROCESSINSTID

           AND WFPROINS.PROCESSDEFID = WFDEF.PROCESSDEFID

           AND SD.IDEN = WFDEF.EXTEND1) CU,

       (SELECT WITEM.PROCESSINSTID, WITEM.WORKITEMID, PANT.PARTICIPANT

          FROM WFWORKITEM WITEM,

               WFWIPARTICIPANT PANT,
               (SELECT MAX(WORKITEMID) AS WORKITEMID

                  FROM (SELECT WFWITEM.WORKITEMID,

                               WFWITEM.WORKITEMNAME,

                               WFWITEM.PROCESSINSTID,

                               WFWITEM.ENDTIME

                          FROM WFWORKITEM WFWITEM, WFPROCESSINST PROCESS

                         WHERE WFWITEM.PROCESSINSTID = PROCESS.PROCESSINSTID

                           AND WFWITEM.CURRENTSTATE = 12

                           AND PROCESS.CURRENTSTATE = 2) T

                 GROUP BY PROCESSINSTID) MAXWORK

         WHERE MAXWORK.WORKITEMID = WITEM.WORKITEMID

           AND PANT.WORKITEMID = MAXWORK.WORKITEMID

           AND PANT.PARTICIPANTTYPE = “person”) F,

       (SELECT BUSINID, BUSINNAME

          FROM BNDICT_T_DICTIONARY

         WHERE BUSINTYPEID = “NJDICT_YWDM”) DICT

 WHERE CU.PROCESSINSTID = F.PROCESSINSTID
   AND CU.USERID <> F.PARTICIPANT

   AND CU.PROCESSINSTNAME = DICT.BUSINID(+)

  以上是粗体红色的表示对应的思路1和2 ,蓝色粗体表示进行互斥

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

majs
majs

相关推荐