并行会签/串行会签


会签的规则:

  1. 全部同意
    不管有没有通过都需要审核完所有的,只要有一会签参与人没同意整个会签都不通过
    并设置流程变量: confirm=2 ;会签不通过 confirm=3 会签通过

  2. 同意人数
    超过指定的人数就结束会签流程流转到下一个节点
    并设置流程变量: confirm=2 ;会签不通过 confirm=3 会签通过

  3. 同意占比
    超过指定的人数的百分比就结束会签流程流转到下一个节点
    并设置流程变量: confirm=2 ;会签不通过 confirm=3 会签通过

  4. 一票否决
    不管有多少人参与会签流程,只要有一个人”不同意”流程就会流转到下一个流程节点
    并设置流程变量: confirm=2 ;会签不通过 confirm=3 会签通过

  5. 自定义
    可以在后台自定义会签的审核统计类,决定什么时候结束会签返回结果.一般是用于深度二开的项目场景.
    继承自定义的统计基类 CounterSignVoteResultBase
    “一票否决”会签结果统计源码如下:

     package com.kdayun.z1.core.workflow.service.impl;
    
     import com.kdayun.workflow.engine.impl.pvm.delegate.ActivityExecution;
     import com.kdayun.z1.core.workflow.util.WorkFlowConst.ConfirmResult;
    
     /**
      * 一票否决人数的会签统计类
      *
      */
     public class YipfjVoteResult extends CounterSignVoteResultBase {
         /**
         * 注意自定义的会签统计类必须实现以下两个参数的类
         **/
         public YipfjVoteResult(ActivityExecution execution, Object param) throws Exception {
             super(execution, param);
             this.signResult = ConfirmResult.cfTongy;
         }
    
         @Override
         public Boolean getIsComplete() throws Exception {
             if (instanceOfNumbers == 0) {
                 return true;
             }
             //获取"不同意"的数量
             Integer refuseCount = this.getRefuseVoteCount(execution);
             if (refuseCount.intValue() > 0) {
                 //返回设置会审的结果: 不同意
                 this.signResult = ConfirmResult.cfButy;
                 //返回true结束流程
                 return true;
             } else if (completeCounter.intValue() >= instanceOfNumbers.intValue()) {
                 this.signResult = ConfirmResult.cfTongy;
                 return true;
             }
             //返回false说明流程还可以继续,并没有结束
             return false;
         }
     }

    并在流程设计模式下填入: 类名,参数名

会签的结果变量 confirm

动态指定人参与会签

  1. 在流程设计时候设置参与会签的人员

  2. 发起/审核流程时候通过设置__assignee 来指定会签人员

    以下是发起/审核流程时候的代码

     function btnStart_onClickScript(cxt: ScriptContext, btn: Button) {
         let page = btn.getPage();
         let auditMemo = page.components.txtAUDITMEMO.getValue();
         var attachment=page.components.UploadCmp1.getValue()
         let nodes = page.components.Tree1.getSelectNodes()
         let wfParams={};
         if (nodes.length > 0) {
             let assignList=[]
             nodes.forEach((node,index)=>{
                 //WFUSERID 格式: 机构ID_部门ID_角色ID_用户ID.
                 //如: 7575860D9D21457ABF7162AF4DF177BA_26777BB29CBD4F2D89D240FF26D70F0C_7FCABE692E5E4E06AA42CAA67802644C_3D369D8414B34FD1B04AADDA18E47A32
                 assignList.push(node.WFUSERID);
             })
             //设置会签的指定人参数
             wfParams['__assignee']=assignList
         }
         btn.getPage().raiseEvent('startProcess', '1', null, auditMemo,attachment,wfParams)
         page.close();
     }
    

    注意: 指定assignee 参与会签人员的优先级别比流程设计时选的人员优先级高.通过assignee设置的参与会签人员必须在流程设计选择的人员范围内(如果流程设计时候未选择参与人就无此限制)

会签参与人的自定义筛选

  • 自定义查询参与者的Where 语句’
      ROLECODE in('003','002') //角色'003'或者 002 的人参与会签
      DEPTID='yyyy'//部门id
      DEPTCODE ='xxx' //部门编号
      ORGID='xxx' //机构id
      USERCODE ='xxx' //用户编号
      USERNAME='xxx' //用户账户名
      USERID ='xxx' //用户ID
      ROLEID ='xxx' //角色id
      ROLECODE='xxx' //角色编号
      ROLENAME='xxx' //角色名
    如下图: 部门deptcode1 001角色 或者 部门deptcode2 010角色 参与会签
作者:texbox  创建时间:2023-04-07 11:23
最后编辑:texbox  更新时间:2024-04-26 09:11