processworkflow.java
来自「公司自己开发的工作流引擎」· Java 代码 · 共 1,509 行 · 第 1/4 页
JAVA
1,509 行
throws Exception{
//提交当前工作项,应用到工作流引擎
long startTime=System.currentTimeMillis();
long procInstId=0;
long actiInstId=0;
logger.info("begin checkInWorkItem");
logger.info("workItemId is:"+workItemId);
SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
try{
logger.info("Execution getSunflowClient time: "+(System.currentTimeMillis()-
startTime)+" ms.");
sunflowClient.checkInWorkItem(workItemId);
//
WorkItemContext workitemContext=sunflowClient.findWorkItem(workItemId);
procInstId=workitemContext.getProInstanceID();
actiInstId=workitemContext.getActivityInstanceID();
//
logger.info("Execution sunflowClient.checkInWorkItem time: "+
(System.currentTimeMillis()-startTime)+" ms.");
}
finally{
WorkflowSession.deleteSunflowClient(userInfo);
}
//提交处理
List workItemRelList=new ArrayList();
List afterAutoNodeActiList=new ArrayList();
for(int i=0;i<actParticipator.size();i++){
Activity act=(Activity)actParticipator.get(i);
NextActivityInfo nextInfo=this.getActivityInfoById(act.getActId(),
nextActInfo);
//==========为当前手工接点后续的自动接点、路由接点执行后的手工接点建立关联 =======
if(nextInfo.getActType()==3||nextInfo.getActType()==4){
getNextActiInstDef(nextInfo,afterAutoNodeActiList,actiInstId,procInstId);
for(int actiNum=0;actiNum<afterAutoNodeActiList.size();actiNum++){
NextActivityInfo nextActi=(NextActivityInfo)afterAutoNodeActiList.get(
actiNum);
workItemRelList.addAll(establishRelation(nextActi,businessId,
workItemId,workItemTimeList,nextActi.getActivityID(),null));
}
}
else{
workItemRelList=establishRelation(nextInfo,businessId,workItemId,
workItemTimeList,act.getActId(),act.getParticipatorList());
//保存传递给后续活动的活动变量的值
saveActivityVariable(workItemId,act);
}
//================== end ================
}
logger.info("Execution checkInWorkItem time: "+(System.currentTimeMillis()-
startTime)+" ms.");
return workItemRelList;
}
private void saveActivityVariable(long workitemId,Activity act)
throws Exception{
List variableList=act.getVariablesList();
long activityId=act.getActId(),maxActInstId=0;
SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
try{
//取得当前工作项信息
WorkItemContext workItemCtx=sunflowClient.findWorkItem(workitemId);
if(workItemCtx==null){
throw new CannotFindPreferWorkItemInfoException("找不到指定的工作项信息。");
}
//取得指定活动定义id的实例id
ActivityInstanceContextCollection actInsCxtClt=sunflowClient.
listActivityInstanceByProInsID(workItemCtx.getProInstanceID());
if (actInsCxtClt!=null){
for(int i=0;i<actInsCxtClt.size();i++){
ActivityInstanceContext actInsCxt=actInsCxtClt.get(i);
//取出目标活动的状态为2的最新实例
if(actInsCxt.getState()==2){
if(actInsCxt.getActivityID()==activityId&&
actInsCxt.getActivityInstanceID()>maxActInstId){
maxActInstId=actInsCxt.getActivityInstanceID();
}
}
}
}
}
catch(Exception ex){
ex.printStackTrace();
throw ex;
}
finally{
WorkflowSession.deleteSunflowClient(userInfo);
}
new WorkItemReleDataDAO().updateWKIReleData(variableList,maxActInstId);
}
private List establishRelation(NextActivityInfo nextInfo,String businessId,
long workItemId,List workItemTimeList,long actiId,List participatorList)
throws Exception{
List workItemRelList=null;
int actMethod=nextInfo.getActMethod();
int actType=nextInfo.getActType();
int tranType=nextInfo.getTranType();
//如果是推的方式,则要根据已经选择的人员设定工作项的参与者
if(tranType!=1&&actType!=2&&actType!=6){
workItemRelList=this.modifyWorkItemActivityId(businessId,workItemId,
actiId,actMethod,participatorList,workItemTimeList);
}
//如果下一活动对应的变迁的“是否循环”为“是”,则该类型流向为返回方式,承办人为前次该活动的承办人
else if(tranType==1&&actType!=2&&actType!=6){
workItemRelList=this.modifyReturnWorkItem(businessId,workItemId,actiId,
actMethod,workItemTimeList,participatorList);
}
//如果下一活动为嵌套子流程方式
else if(actType==2&&tranType!=1&&actType!=6){
//取得第一个节点的类型
actMethod=nextInfo.getFirstNestingActivity().getActMethod();
logger.info("actMethod is:"+actMethod);
workItemRelList=this.modifySubflowWorkItem(businessId,workItemId,actiId,
actMethod,participatorList,workItemTimeList);
}
//其它:结束节点
else if(actType==6){
workItemRelList=this.doEndNode(businessId,workItemId,actiId,actMethod,
workItemTimeList);
}
return workItemRelList;
}
/**
* 提交子流程,修改子流程的承办人
* @param workItemId long 工作项id
* @param toActId String 要启动的流向活动id
* @param nextActInfo NextActivityInfo
* @param toActMethod int 选定的活动办理方式(1推,2拉)
* @param actParticipator 活动参与者
* @return List 由LaWorkItemRel组成的list
*/
private List modifySubflowWorkItem(String businessId,long workItemId,
long toActId,int toActMethod,List actParticipator,List workItemTimeList)
throws Exception{
logger.info("begin modifySubflowWorkItem...");
SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
List relList=null;
try{
//取得当前工作项信息
WorkItemContext workItemCtx=sunflowClient.findWorkItem(workItemId);
if(workItemCtx==null){
throw new CannotFindPreferWorkItemInfoException("找不指定的工作项信息。");
}
//取得当前流程实例id
long currProInstId=workItemCtx.getProInstanceID();
//取得toActId活动实例id
logger.info("currProInstId is:"+currProInstId);
logger.info("toActId is:"+toActId);
//取得指定活动定义id的实例id
ActivityInstanceContextCollection actInsCxtClt=sunflowClient.
listActivityInstanceByProInsID(workItemCtx.getProInstanceID());
long maxActInstId=0;
for(int i=0;i<actInsCxtClt.size();i++){
ActivityInstanceContext actInsCxt=actInsCxtClt.get(i);
logger.info("actInsCxt.getActivityInstanceID is:"+
actInsCxt.getActivityInstanceID());
//取出目标活动的状态为4的最新实例
//if(actInsCxt.getState()==4 ){
if(actInsCxt.getActivityID()==toActId&&
actInsCxt.getActivityInstanceID()>maxActInstId){
maxActInstId=actInsCxt.getActivityInstanceID();
}
//}
}
logger.info("maxActInstId is:"+maxActInstId);
if(maxActInstId>0){
//取得toActId子流程实例id
Vector vector=this.getSubflowInstIdByActInstId(sunflowClient,
maxActInstId);
if(vector!=null&&vector.size()>0){
for(int k=0;k<vector.size();k++){
long subProInstId=Long.parseLong((String)vector.get(k));
logger.info("subProInstId is:"+subProInstId);
//取得子流程的活动实例id
long subMaxActInstId=0;
ActivityInstanceContextCollection subActInstCtxClt=sunflowClient.
listActivityInstanceByProInsID(subProInstId);
if(subActInstCtxClt!=null&&subActInstCtxClt.size()>0){
//取出目标活动的状态为2的最新实例
for(int i=0;i<subActInstCtxClt.size();i++){
ActivityInstanceContext subActInsCxt=subActInstCtxClt.get(i);
if(subActInsCxt.getState()==2&&
subActInsCxt.getActivityInstanceID()>subMaxActInstId){
subMaxActInstId=subActInsCxt.getActivityInstanceID();
}
}
}
logger.info("subMaxActInstId is:"+subMaxActInstId);
List tempActList=new ArrayList();
if(actParticipator!=null&&actParticipator.size()>k){
tempActList.add(actParticipator.get(k));
}
//修改指定活动实例id所产生工作项的得参与者,并取得要保存的工作项关联信息
if(subMaxActInstId>0){
List tempList=this.modifyWorkItemParticipator(sunflowClient,
businessId,workItemCtx.getWorkItemName(),workItemId,
workItemCtx.getProInstanceID(),subMaxActInstId,toActMethod,
tempActList,workItemTimeList);
relList=addToWorkitemRelList(relList,tempList);
}
}
}
}
return relList;
}
finally{
WorkflowSession.deleteSunflowClient(userInfo);
}
}
private List addToWorkitemRelList(List targetList,List srcList){
if(targetList==null){
targetList=new ArrayList();
}
if(srcList!=null&&srcList.size()>0){
for(int i=0;i<srcList.size();i++){
int iTag=0;
WfWorkItemRel rel1=(WfWorkItemRel)srcList.get(i);
for(int j=0;j<targetList.size();j++){
WfWorkItemRel rel2=(WfWorkItemRel)targetList.get(j);
if(rel1.getFromItemId()==rel2.getFromItemId()&&
rel1.getToItemId()==rel2.getToItemId()){
iTag=1;
break;
}
}
if(iTag!=1){
targetList.add(rel1);
}
}
}
return targetList;
}
/**
* 根据由WfWorkItemRel组成的list,将信息保存到表wf_workitem_rel中
* @param list List
* @return 返回由WfProcessBusinessRel组成的list;
*/
public List saveWorkItemRel(String businessId,List list)
throws Exception{
long startTime=System.currentTimeMillis();
logger.info("begin saveWorkItemRel...");
List infoList=new ArrayList();
if(list!=null){
//取得返回结果
for(int i=0;i<list.size();i++){
WfWorkItemRel rel=(WfWorkItemRel)list.get(i);
if(!checkExistInList(businessId,rel.getFromProInstId(),
rel.getToProInstId(),infoList)){
WfProcessBusinessRel info=new WfProcessBusinessRel();
info.setProjectId(projectId);
info.setBusinessId(businessId);
if(rel.getFromProInstId()==rel.getToProInstId()){
info.setFlowType("0");
info.setParentProInstId(0);
//是辅助子流程,则设置辅助子流程标记
if(aidSubflowTag!=null&&aidSubflowTag.equals("1")&&parentProInstId!=null&&
!parentProInstId.equals("")){
info.setFlowType("2");
info.setParentProInstId(Long.parseLong(this.parentProInstId));
}
}
else{
info.setFlowType("1"); //嵌套子流程
info.setParentProInstId(rel.getFromProInstId());
}
info.setProInstId(rel.getToProInstId());
infoList.add(info);
}
}
//保存wf_workitem_rel信息
WfWorkItemRelDAO dao=new WfWorkItemRelDAO();
dao.insert(list);
}
logger.info("Execution saveWorkItemRel time: "+(System.currentTimeMillis()-
startTime)+" ms.");
return infoList;
}
/**
* 检查是否在由WfProcessBusinessRel组成的lst存在由businessId,parentnstId,Id确定的记录
* @param businessId String
* @param parentInstId long
* @param intId long
* @param list List
* @return boolean
*/
private boolean checkExistInList(String businessId,long parentInstId,
long instId,List list){
boolean b=false;
for(int i=0;i<list.size();i++){
WfProcessBusinessRel info=(WfProcessBusinessRel)list.get(i);
if(info.getBusinessId().equals(businessId)&&
info.getParentProInstId()==parentInstId&&info.getProInstId()==instId){
b=true;
break;
}
}
return b;
}
/**
* 根据由WfProcessBusinessRel组成的list,将信息保存到表wf_process_business_rel中
* @param list List
*/
public void saveProcessBusinessRel(List list)
throws Exception{
//保存wf_process_business_rel信息
long startTime=System.currentTimeMillis();
logger.info("begin saveProcessBusinessRel...");
WfProcessBusinessRelDAO dao=new WfProcessBusinessRelDAO();
dao.insert(list);
logger.info("Execution saveProcessBusinessRel time: "+
(System.currentTimeMillis()-startTime)+" ms.");
}
/**
* 修改由活动定义产生的工作项的参与者
* @param currWorkItemId 当前工作项id
* @param toActId 产生工作项的活动定义id
* @param actParticipator 活动参与者
* @param actMethod int 选定的活动办理方式(1推,2拉)
* @return List 由LaWorkItemRel组成的list
*/
private List modifyWorkItemActivityId(String businessId,long currWorkItemId,
long toActId,int actMethod,List actParticipator,List workItemTimeList)
throws Exception{
logger.info("begin modifyWorkItemActivityId...");
SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
List relList=new ArrayList();
try{
//取得当前工作项信息
WorkItemContext workItemCtx=sunflowClient.findWorkItem(currWorkItemId);
if(workItemCtx==null){
throw new CannotFindPreferWorkItemInfoException("找不到指定的工作项信息。");
}
//取得指定活动定义id的实例id
ActivityInstanceContextCollection actInsCxtClt=sunflowClient.
listActivityInstanceByProInsID(workItemCtx.getProInstanceID());
long maxActInstId=0;
for(int i=0;i<actInsCxtClt.size();i++){
ActivityInstanceContext actInsCxt=actInsCxtClt.get(i);
//取出目标活动的状态为2的最新实例
if(actInsCxt.getState()==2){
if(actInsCxt.getActivityID()==toActId&&
actInsCxt.getActivityInstanceID()>maxActInstId){
maxActInstId=actInsCxt.getActivityInstanceID();
}
}
}
logger.info("maxActInstId is:"+maxActInstId);
if(maxActInstId>0){
//修改指定活动实例id所产生工作项的得参与者,并取得要保存的工作项关联信息
relList=this.modifyWorkItemParticipator(sunflowClient,businessId,
workItemCtx.getWorkItemName(),currWorkItemId,
workItemCtx.getProInstanceID(),maxActInstId,actMethod,
actParticipator,workItemTimeList);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?