直接修改EOS流程引擎數據,實現單工作項變多工作項

    在客戶需求變化時,可能會碰到流程引擎中單工作項的數據拆分成多工作項,下面提供一種實現方式來達到多工作項的拆分.對於新流程是不需要拆分,只是對於流程實例中已運行到相應環節才需要處理。以下提到方法,不是通過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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章