在客户需求变化时,可能会碰到流程引擎中单工作项的数据拆分成多工作项,下面提供一种实现方式来达到多工作项的拆分.对于新流程是不需要拆分,只是对于流程实例中已运行到相应环节才需要处理。以下提到方法,不是通过EOS流程引擎修改,而是通过直接更新数据库实现。
单工作项的拆分成多工作为如下几步:
1.列出需要拆分工作项的流程实例,并更新流程图,发布时,不要生成新的版本。
2.工作项的循环拆分,并将以前的工作项表中记录的删除或者将工作项记录状态修改为12
3.删除工作项对应的参与者,并按多工作项要求增加参与者记录。
如下提供了一种拆分的实例:是通过ORACLE的存储过程实现。
create or replace procedure UPDATE_WORKITEM_INFO is
begin
declare
k number default - 5000000;---工作项ID
i number default - 1000000;---参与者ID
--每一次使用都需要调整这个值 这个值用来做参与者表主键
begin
--迭代所有需要修改的工作项
FOR each in (select *
from wfworkitem wf
where (wf.currentstate = 4)
and wf.activitydefid = "Provider"
and wf.processdefid = 15) LOOP
--删除与者表中参与者信息
update wfwiparticipant wfw
set wfw.wiparticid = 0 - wfw.wiparticid,
wfw.workitemid = 0 - wfw.workitemid
where wfw.workitemid = each.workitemid;
--根据工作项的流程实例找到相应的参与者
for tt in (select distinct busman
from t_mm_material tmm
where tmm.materialid in
(select t.materialid
from t_mm_orderinfodetail t
where t.orderid in
(select tm.orderid
from t_mm_orderinfo tm
where tm.processinstid = each.processinstid))) loop
i := i + 1;
k := k + 1;
--更新参与者表信息
insert into wfwiparticipant
(wiparticid,
workitemid,
participanttype,
participant,
participant2,
workitemstate,
partiintype,
extend1)
values
(i,
k,
"person",
tt.busman,
tt.busman,
"10",---工作项状态
"EXE",
"P{" || tt.busman || "}");----相应的参与才类型,根据实现业务的不同,会有区别
--更新工作项信息
insert into wfworkitem
(workitemid,
workitemname,
workitemtype,
workitemdesc,
currentstate,
participant,
priority,
istimeout,
limitnum,
limitnumdesc,
createtime,
starttime,
endtime,
finaltime,
actionurl,
processinstid,
activityinstid,
stateslist,
timeoutnum,
timeoutnumdesc,
extend1,
extend2,
processinstname,
activityinstname,
processdefid,
processdefname,
processchname,
activitydefid,
assistant,
bizstate,
allowagent
)
(select k as workitemid,
workitemname,
workitemtype,
workitemdesc,
"10" as currentstate,---多工作项的状态为10
tt.busman as participant,
priority,
istimeout,
limitnum,
limitnumdesc,
createtime,
starttime,
endtime,
finaltime,
actionurl,
each.processinstid as processinstid,
each.activityinstid as activityinstid,
stateslist,
timeoutnum,
timeoutnumdesc,
extend1,
"NPNYYNYNN" as extend2,-----多工作项与单工作项区别
processinstname,
activityinstname,
processdefid,
processdefname,
processchname,
activitydefid,
assistant,
bizstate,
allowagent
from wfworkitem wftp
where wftp.workitemid = each.workitemid);
end loop;
--更新工作项表信息
update wfworkitem wfwor
set wfwor.workitemid = 0 - each.workitemid,
wfwor.processinstid = 0 - each.processinstid ,
wfwor.currentstate= 12
where wfwor.workitemid = each.workitemid ;
END LOOP;
commit;
end;
end;