processworkflow.java

来自「公司自己开发的工作流引擎」· Java 代码 · 共 1,509 行 · 第 1/4 页

JAVA
1,509
字号
      }
      return relList;
    }
    finally{
      WorkflowSession.deleteSunflowClient(userInfo);
    }
  }

  /**
   *  修改返回到指定活动的参与者为当前工作项的发送者。
   * @param currWorkItemId 当前工作项id
   * @param toActId 产生工作项的活动定义id
   * @param toActMethod int  选定的活动办理方式(1推,2拉)
   * @return List 由LaWorkItemRel组成的list
   */
  private List modifyReturnWorkItem(String businessId,long currWorkItemId,
      long toActId,int toActMethod,List workItemTimeList,List participatorList)
      throws Exception{
    logger.info("begin modifyReturnWorkItem...");

    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);
        logger.info("actInsCxt is:"+actInsCxt.getActivityInstanceID());
        //取出目标活动的状态为2的最新实例
        if(actInsCxt.getState()==2){
          if(actInsCxt.getActivityID()==toActId&&
              actInsCxt.getActivityInstanceID()>maxActInstId){
            maxActInstId=actInsCxt.getActivityInstanceID();
          }
        }
      }
      //取得当前工作项的办理人
      String sendUserId="";
      boolean ifAgen=false;
      String consignUserId="";
      //如果参与者不为空
      if(participatorList!=null&&participatorList.size()>0){
        Participator participator=(Participator)participatorList.get(0);
        if(participator!=null){
          sendUserId=participator.getId();
          ifAgen=participator.isIfAgen();
          consignUserId=participator.getConsignUserId();
        }
      }
      //
      else{
        //设置返回活动的参与者为当前活动的发送者
        sendUserId=getReturnActor(workItemCtx.getProInstanceID(),toActId);
      }

      List actParticipator=new ArrayList();
      if(sendUserId!=null&&!sendUserId.equals("")){
        Participator actor=new Participator();
        logger.info("sendUserId is:"+sendUserId);
        actor.setId(sendUserId);
        actor.setType("user");
        actor.setName("");
        actor.setIfAgen(ifAgen);
        actor.setConsignUserId(consignUserId);
        actParticipator.add(actor);
      }
      if(maxActInstId>0){
        //修改指定活动实例id所产生工作项的得参与者,并取得要保存的工作项关联信息
        relList=this.modifyWorkItemParticipator(sunflowClient,businessId,
            workItemCtx.getWorkItemName(),currWorkItemId,
            workItemCtx.getProInstanceID(),maxActInstId,toActMethod,
            actParticipator,workItemTimeList);
      }
      return relList;
    }
    finally{
      WorkflowSession.deleteSunflowClient(userInfo);
    }
  }

  /**
   *  结束节点处理
   * @param currWorkItemId 当前工作项id
   * @param toActId 产生工作项的活动定义id
   * @param toActMethod int  选定的活动办理方式(1推,2拉)
   * @return List 由LaWorkItemRel组成的list
   */
  private List doEndNode(String businessId,long currWorkItemId,long toActId,
      int toActMethod,List workItemTimeList)
      throws Exception{
    logger.info("begin doEndNode...");
    SunflowClient sunflowClient=WorkflowSession.getSunflowClient(userInfo);
    List relList=new ArrayList();
    try{
      //取得当前工作项信息
      WorkItemContext workItemCtx=sunflowClient.findWorkItem(currWorkItemId);
      //如果当前流程实例已经完成
      if(workItemCtx.getProInstanceState()==5){
        ProcessInstanceContext proCtx=sunflowClient.findProcessInstance(
            workItemCtx.getProInstanceID());
        //如果该流程实例为子流程
        if(proCtx.getSubflowContextID()>0){
          ParentProcessContext ppCtx=sunflowClient.
              findParentProcessBySubflowProcID(proCtx.getSubflowContextID());
          if(ppCtx!=null){
            //取得父流程实例信息
            ProcessInstanceContext parentProCtx=sunflowClient.
                findProcessInstance(ppCtx.getParentProcInstID());
            //如果流程处于激活状态
            if(parentProCtx!=null&&parentProCtx.getInstanceState()==1){
              WorkItemContextCollection wkiCtxCol=sunflowClient.
                  listWorkitemByProInstID(parentProCtx.getProInstanceID());
              for(int i=0;i<wkiCtxCol.size();i++){
                //如果产生的工作项状态为1,2,3,且id值比当前工作项大
                if(wkiCtxCol.get(i)!=null&&wkiCtxCol.get(i).getState()<4&&
                    wkiCtxCol.get(i).getWorkItemID()>currWorkItemId){
                  //取得工作项关联信息
                  WfWorkItemRel itemRel=new WfWorkItemRel();
                  itemRel.setFromActivityName(workItemCtx.getWorkItemName());
                  itemRel.setFromItemId(currWorkItemId);
                  itemRel.setFromProInstId(workItemCtx.getProInstanceID());
                  itemRel.setFromUserId(userInfo.getUserId());
                  itemRel.setToActivityName(wkiCtxCol.get(i).getWorkItemName());
                  itemRel.setToItemId(wkiCtxCol.get(i).getWorkItemID());
                  itemRel.setToProInstId(wkiCtxCol.get(i).getProInstanceID());
                  relList.add(itemRel);
                  //保存工作项办理期限信息
                  WfWorkitemProcessTime pro=new WfWorkitemProcessTime();
                  pro.setWorkitemId(wkiCtxCol.get(i).getWorkItemID());
                  workItemTimeList.add(pro);
                }
              }
            }
          }
        }
      }
      return relList;
    }
    finally{
      WorkflowSession.deleteSunflowClient(userInfo);
    }
  }

  /**
   * 取出要返回活动的办理人
   * @param workitemId 当前流程实例id
   * @param returnToActId 要返回的活动定义id
   * @return String
   * @throws Exception
   */
  private String getReturnActor(long proInstId,long returnToActId)
      throws Exception{
    logger.info("begin getReturnActor...");
    ProcessWorkflowDAO dao=new ProcessWorkflowDAO();
    return dao.getReturnActor(proInstId,returnToActId);
  }

  /**
   * 修改指定活动实例id所产生工作项的得参与者,并取得要保存的工作项关联信息
   * @param businessId 申诉登记号
   * @param currWorkItemName 当前工作项名称
   * @param currWorkItemId 当前工作项id
   * @param currProInstId 当前流程实例id
   * @param toActInstId 选定的活动实例id
   * @param toActMethod 选定的活动办理方式(1推,2拉)
   * @param actParticipator 参与者
   * @throws Exception
   * @return 由LaWorkItemRel组成的list
   */
  public List modifyWorkItemParticipator(SunflowClient sunflowClient,
      String businessId,String currWorkItemName,long currWorkItemId,
      long currProInstId,long toActInstId,int toActMethod,List actParticipator,
      List workItemTimeList)
      throws Exception{
    logger.info("begin modifyWorkItemParticipator...");
    List relList=new ArrayList();
    WorkItemContextCollection workItemCtxClt=sunflowClient.
        listWorkItemsByActInsID(toActInstId);
    if(workItemCtxClt!=null&&workItemCtxClt.size()>0){
      //取得工作项关联信息
      for(int i=0;i<workItemCtxClt.size();i++){
        WorkItemContext toWorkItemCtx=workItemCtxClt.get(i);
        WfWorkItemRel itemRel=new WfWorkItemRel();
        itemRel.setFromActivityName(currWorkItemName);
        itemRel.setFromItemId(currWorkItemId);
        itemRel.setFromProInstId(currProInstId);
        itemRel.setFromUserId(userInfo.getUserId());

        itemRel.setToActivityName(toWorkItemCtx.getWorkItemName());
        itemRel.setToItemId(toWorkItemCtx.getWorkItemID());
        itemRel.setToProInstId(toWorkItemCtx.getProInstanceID());
        relList.add(itemRel);

        //保存工作项办理期限信息
        WfWorkitemProcessTime pro=new WfWorkitemProcessTime();
        pro.setWorkitemId(toWorkItemCtx.getWorkItemID());
        workItemTimeList.add(pro);
      }
      WfWorkItemRel itemRel=new WfWorkItemRel();
      itemRel.setFromActivityName("");
      itemRel.setFromItemId(0);
      itemRel.setFromProInstId(currProInstId);
      itemRel.setFromUserId(userInfo.getUserId());
      itemRel.setToActivityName(currWorkItemName);
      itemRel.setToItemId(currWorkItemId);
      itemRel.setToProInstId(currProInstId);
      relList.add(itemRel);

      //保存工作项办理期限信息
      WfWorkitemProcessTime pro1=new WfWorkitemProcessTime();
      pro1.setWorkitemId(currWorkItemId);
      workItemTimeList.add(pro1);

      //设定参与者
      logger.info("toActMethod is:"+toActMethod);
      if(actParticipator!=null){
        logger.info("actParticipator is:"+actParticipator);
        //推的方式
        if(toActMethod==WorkflowConstant.ACTIVITY_METHOD_PUSH){
          //设定推方式的参与者
          HashMap agenMap=this.modifyPushTypeWorkitemParticipator(sunflowClient,
              workItemCtxClt,actParticipator);
          //设置代理信息
          if(agenMap!=null&&agenMap.size()>0&&relList!=null&&relList.size()>0){
            for(int l=0;l<relList.size();l++){
              WfWorkItemRel rel=(WfWorkItemRel)relList.get(l);
              Object consignUserId=agenMap.get(Long.toString(rel.getToItemId()));
              if(consignUserId!=null){
                rel.setIfConsign(true);
                rel.setConsignId((String)consignUserId);
              }
            }
          }
        }
        //拉的方式
        else if(toActMethod==WorkflowConstant.ACTIVITY_METHOD_PULL){
          //设定拉方式的参与者
          this.modifyPullTypeWorkitemParticipator(businessId,toActInstId,
              workItemCtxClt,actParticipator);
        }
      }
    }
    return relList;
  }

  /**
   * 设定拉方式toActInstId确定的工作项的参与者
   * @param businessId 申诉登记号
   * @param sunflowClient
   * @param toActInstId 指定的活动实例id
   * @param actParticipator
   * @return List
   */
  private void modifyPullTypeWorkitemParticipator(String businessId,
      long toActInstId,WorkItemContextCollection workItemCtxClt,
      List actParticipator)
      throws Exception{
    logger.info("begin modifyPullTypeWorkitemParticipator...");
    if(actParticipator!=null&&actParticipator.size()>0){
      StringBuffer sbUser=new StringBuffer();
      StringBuffer sbOrg=new StringBuffer();
      StringBuffer sbRole=new StringBuffer();
      /*直接更新修改更新活动、工作项的变量数据的功能暂时去掉
             //封装组合参与者字符串
       this.AssembleActorString(businessId,actParticipator,sbUser,sbOrg,sbRole);

             //将变量值更新到数据库
             //封装组合更新活动实例相关数据
             List newActDataList=new ArrayList();
             List oldActDataList=new ArrayList();
       this.AssembleActiInsReleUpdateData(toActInstId,areaId,sbUser.toString(),
          sbOrg.toString(),sbRole.toString(),newActDataList,oldActDataList);
       if(newActDataList!=null&&newActDataList.size()>0&&oldActDataList!=null&&
          oldActDataList.size()>0){
        //修改参数变量值
        ActiInsReleDataDAO dao=new ActiInsReleDataDAO();
        dao.update(newActDataList,oldActDataList);
             }
             //封装组合更新工作项相关数据
             List newWkDataList=new ArrayList();
             List oldWkDataList=new ArrayList();
             this.AssembleWorkItemInsReleUpdateData(areaId,sbUser.toString(),
          sbOrg.toString(),sbRole.toString(),workItemCtxClt,newWkDataList,
          oldWkDataList);
       if(newWkDataList!=null&&newWkDataList.size()>0&&oldWkDataList!=null&&
          oldWkDataList.size()>0){
        //修改参数变量值
        WorkItemReleDataDAO dao=new WorkItemReleDataDAO();
        dao.update(newWkDataList,oldWkDataList);
             }
       */
    }
  }

  /**
   * 封装组合参与者字符串
   * @param businessId String
   * @param areaId String
   * @param actParticipator List
   */
  private void assembleActorString(String businessId,List actParticipator,
      StringBuffer sbUser,StringBuffer sbOrg,StringBuffer sbRole)
      throws Exception{
    //取得行政区id
    logger.info("begin AssembleActorString...");
    //String areaId=baseDAO.getCaseAreaIdByRegisterId(businessId);
    String areaId="02";
    //临时测试数据
    if(areaId==null||areaId.equals("")){
      areaId="02";
    }
    String userIds="";
    String orgIds="";
    String roleIds="";
    for(int i=0;i<actParticipator.size();i++){
      Participator actor=(Participator)actParticipator.get(i);
      if(actor.getType().equals("user")){
        //目前只支持设定一个用户
        userIds=actor.getId();
      }
      else if(actor.getType().equals("org")){
        //将按org-role-fixed的类型转化为role
        if(actor.getRoleId()!=null&&!actor.getRoleId().equals("")&&
            !actor.getRoleId().equals("0")){
          roleIds=roleIds+","+actor.getRoleId()+":"+actor.getId();
        }
        else{
          orgIds=orgIds+","+actor.getId()+":"+actor.getParentId();
        }
      }
      else if(actor.getType().equals("role")){
        roleIds=roleIds+","+actor.getId()+":"+actor.getParentId();
      }
    }
    if(orgIds!=null&&orgIds.length()>0){
      //去掉“,”
      orgIds=orgIds.substring(1);
      orgIds="varActor;org;"+areaId+";"+orgIds;
    }
    if(roleIds!=null&&roleIds.length()>0){
      //去掉“,”
      roleIds=roleIds.substring(1);
      roleIds="varActor;role;"+areaId+";"+roleIds;
    }
    logger.info("userIds is:"+userIds+" orgIds is:"+orgIds+" roleIds is:"+
        roleIds);
    sbUser.append(userIds);
    sbRole.append(roleIds);
    sbOrg.append(orgIds);
  }

  /**
   * 封装组合更新数据
   * @param toActInstId String
   * @param userIds String
   * @param orgIds String
   * @param roleIds String
   * @param newDataList List
   * @param oldDataList List
   */
  private void assembleActiInsReleUpdateData(long toActInstId,String areaId,
      String userIds,String orgIds,String roleIds,List newDataList,
      List oldDataList){
    logger.info("begin AssembleActiInsReleUpdateData...");
    ActiInsReleData oldData=new ActiInsReleData();
    ActiInsReleData newData=new ActiInsReleData();
    //设置变量值,格式为:varActor;[user,role,org];areaId;[id1:parentid1,id2:parentid2,id3:parentid3]
    if(userIds!=null&&userIds.length()>0){
      oldData.setAirAtiId(toActInstId);
      oldData.setAirVariableName("actUserActor");
      newData.setAirStringValue(userIds);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?