登录 注册

BPS流程--动态指定节点中的参与人并按顺序执行完以后才能进入下一人工活动(外)

发布时间:Jun 12, 2019 10:57:18 AM 发布人:管理员


归属栏目: BPS工作流开发


外部链接: 


关键字: 


归属栏目: BPS工作流开发


文章来源: 


摘要: 

BPS流程--动态指定节点中的参与人并按顺序执行完以后才能进入下一人工活动()

本文介绍使用BPS流程引擎时,如何动态制定活动参与者,并且在执行完成后如何进入下一个活动环节。

1   需求描述

由于企业内部每年组织机构都会发生变化,而如果按平常的流程来定义,一个多级审核的流程定义里需要多个人工活动,这样一旦组织机构变动,流程定义也需要做相应的调整。企业想实现所有流程定义里只有一个审核的人工活动,并且就算组织机构人员变动也不影响流程使用。

逻辑如下图所示:

2   示例描述

先在default中创建组织结构(这里以部门来做示例)


用户启动流程发起申请,进入循环审核的节点,循环审核节点中根据流程的发起者进行判断,如果发起人是五级部门的人,则由四级部门的人来进行审核,审核完以后再由三级部门审核,一直到一级部门审核完再结束流程。如果发起人不属于这五个部门,那则从第五级部门开始审核,直到一级部门审核完成结束流程。

3   最终效果

  • 如果发起流程的是五级部门的人

005用户登录default应用后台启动流程


再到我的任务中发起流程


进入workspace后台可以看到流程节点中下一个审核人是四级部门

 


用四级部门中的人员004登录default后台,执行流程


workspace后台刷新流程可以看到流程节点中下一个审核人是三级部门 


再用三级部门中的人员003登录default后台,执行流程


再用二级部门中的人员002登录default后台,执行流程


最后再用一级部门中的人员001登录default后台,执行流程


再到workspace后台刷新流程可以看到流程节点已结束 

  • 如果发起流程的是二级部门的人员,下一审批人则是一级部门的人:

用一级人员进入default应用进行流程审核

 

  • 如果发起流程的不是这五个部门内的人员

进入workspace中可以看到流程下一节点审批人为五级部门 


.......

当五级部门、四级部门、三级部门、二级部门、一级部门人员顺序审核完后流程结束。

4   实现步骤:

设置流程定义的相关数据:


设置人工活动的触发事件(获取参与人并设置顺序后再返回):

GetWFParticipant.java源代码:

package com.primeton.bps;

import com.eos.common.connection.ConnectionHelper;

import com.eos.data.datacontext.DataContextManager;

import com.eos.data.datacontext.IMUODataContext;

import com.eos.data.datacontext.IUserObject;

import com.eos.workflow.omservice.WFParticipant;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

 

public class GetWFParticipant {

 

      /**获取下一节点的所有参与者

       * @return

       */

      public WFParticipant[] getAllParentParticipants()

        {

          String userid="";

          String orgid = "";

          String deptpath=".21.22.41.42.43.zj.";

          IMUODataContext muo = DataContextManager.current().getMUODataContext();

          if (muo != null) {

                IUserObject userobject = muo.getUserObject();

                if (userobject != null) {

                   userid = userobject.getUserId();

                   orgid=userobject.getUserOrgId();

                   System.out.println(orgid+"=============启动流程的用户==================="+userid);

                }

          }

 

            List<WFParticipant>  wfp = new ArrayList<WFParticipant>();

          String orgseq = getOrgseq(null,orgid);

          if(""==orgseq||!deptpath.contains(orgid)){//如果不是当前5个部门内的人发起的流程

             orgseq=deptpath;

          }

          if ((!("".equals(orgseq))) && (orgseq != null)) {

             String[] orgids = orgseq.split("\\.");

 

              for(int i=orgids.length-2;i >0 ;i--){

                  String orgname = getOrgnameByOrgid(null,orgids[i]);

                  WFParticipant  a = new WFParticipant(orgids[i],orgname,"org");

                  wfp.add(a);

              }

          }

          int size = wfp.size();

          WFParticipant[] arr = (WFParticipant[])wfp.toArray(new WFParticipant[size]);

          return arr;

        }

 

        /**

         * 获取机构名称

       * @param dsName

       * @param orgId

       * @return

       */

      public static String getOrgnameByOrgid(String dsName,String orgId)

        {

                String orgname = "";

                if ((dsName == null) || (dsName.length() == 0))

                dsName = "default";

                Connection conn = ConnectionHelper.getCurrentContributionConnection(dsName);

                Statement stmt = null;

                ResultSet rs = null;

                if (orgId != null) {

                  StringBuilder sql = new StringBuilder("select t.orgname from ORG_ORGANIZATION t where t.orgid='" + orgId + "' ");

                  try {

                    stmt = conn.createStatement();

                    rs = stmt.executeQuery(sql.toString());

                    while (rs.next())

                        orgname = rs.getString("orgname");

                  }

                  catch (Throwable e) {

                    throw new RuntimeException(e);

                  } finally {

                    close(rs);

                    close(stmt);

                    close(conn);

                  }

                }

                return orgname;

                }

 

        /**

         * 获取机构path

       * @param dsName

       * @param orgId

       * @return

       */

      public static String getOrgseq(String dsName, String orgId)

        {

          String orgseq = "";

          if ((dsName == null) || (dsName.length() == 0))

            dsName = "default";

          Connection conn = ConnectionHelper.getCurrentContributionConnection(dsName);

          Statement stmt = null;

          ResultSet rs = null;

          if (orgId != null) {

            StringBuilder sql = new StringBuilder("select t.orgseq from ORG_ORGANIZATION t where t.orgid='" + orgId + "' ");

            try {

              stmt = conn.createStatement();

              rs = stmt.executeQuery(sql.toString());

              while (rs.next())

                orgseq = rs.getString("orgseq");

            }

            catch (Throwable e) {

              throw new RuntimeException(e);

            } finally {

              close(rs);

              close(stmt);

              close(conn);

            }

          }

          return orgseq;

        }

 

 

        /**

         * 关闭rs

       * @param rs

       */

      private static void close(ResultSet rs) {

                if (rs == null)

                  return;

                try {

                  rs.close();

                } catch (SQLException localSQLException) {

                }

              }

 

              private static void close(Connection conn) {

                if (conn == null)

                  return;

                try {

                  conn.close();

                } catch (SQLException localSQLException) {

                }

              }

 

              private static void close(Statement stmt) {

                if (stmt == null)

                  return;

                try {

                  stmt.close();

                }

                catch (SQLException localSQLException)

                {

                }

              }

}

设置人工活动触发事件(设置下一人工活动参与者)

设置循环审核节点的多工作项:

 

 


相关文章

返回