我们在工作流设计的过程中,是否碰到这样的情况,一个人属于两个岗位(比如经办岗和复核岗),但是,对于同一笔单子(即一个流程实例),不能既经办又复核。业务提出这样的需求是有一定道理的,对于同一笔单子,为了保证安全性,需要经过两个人来确保,对于不同的单子,同一个人,可以在这笔单子做经办,另外一笔单子做复核。可能有的人会说,你直接让一个人不能同时拥有这两个岗位就可以了,确实,那样解决了这个问题,那是一种静态的互斥,但是灵活性差一点。而业务需求的原因就是因为在实际的情况下,可能经办和复核的工作量有差别,而人员又比较少,且现实中确实也是一个人又可以经办、又可以复核。总的来说,这个需求是有一定的实际意义的
总体解决方案
扩展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中国
作者
相关推荐
-
谁知道阿里云河南服务中心是干什么的?
一直接到阿里云服务中心的电话,说是阿里云的授权中心,主要提供阿里云的区域服务的?请问其他地方也有阿里云的服务中 […]
-
API创建影响生产的六个方面
在API创建方面,简单性至关重要。AnyPresence的Vivek Gupta讨论了开发者可以从6个方面处理好API的创建问题,从而加速API生产。
-
来之不易的0.1秒 只为离梦想更进一步
0.1秒可以做什么?弹指一挥间,什么也做不了。我们甚至感受不到它的存在。然而对于云端筑梦的人来说,0.1秒的差距,结局也许就是天壤之别。
-
微服务:是谁看上了这块小鲜肉
微服务——IT领域的又一个新名词。但它是否能如同OpenStack,如同Docker那样成为众人疯抢的“肥肉”呢?从目前来看,可能还没有到达疯抢的地步,但也不乏支持者。