基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)

简介: 基于若依ruoyi-nbcio支持flowable流程角色,同时修改流转用户为username,流程启动做大调整(三)

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

   接上一个文章。

1、设置多实例等相关参数

//设置单用户下一节点流程数据
    private void setAssigneeFlowNetDto(FlowNextDto flowNextDto,List<SysUser> list,UserTask userTask) {
      flowNextDto.setVars(ProcessConstants.PROCESS_APPROVAL);
      flowNextDto.setType(ProcessConstants.USER_TYPE_ASSIGNEE);
      flowNextDto.setUserList(list);
      flowNextDto.setUserTask(userTask);
    }
    
    //设置多用户下一节点流程数据
    private void setUsersFlowNetDto(FlowNextDto flowNextDto,List<SysUser> list,UserTask userTask) {
      flowNextDto.setVars(ProcessConstants.PROCESS_APPROVAL);
        flowNextDto.setType(ProcessConstants.USER_TYPE_USERS);
        flowNextDto.setUserList(list);
        flowNextDto.setUserTask(userTask);
    }
    
    //设置多实例结束标志
    private void setMultiFinishFlag(Task task,FlowNextDto flowNextDto,List<SysUser> list) {
      String definitionld = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();        //获取bpm(模型)对象
        BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionld);
        //通过节点定义key获取当前节点
        FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
        if(flowNode instanceof UserTask ){
          UserTask curuserTask = (UserTask) flowNode;
          MultiInstanceLoopCharacteristics curmultiInstance = curuserTask.getLoopCharacteristics();
          if (Objects.nonNull(curmultiInstance)) {
            if(list.size()>1) {//多人选择的时候,从redis获取之前监听器写入的会签结束信息
               String smutinstance_next_finish = Constants.MUTIINSTANCE_NEXT_FINISH + task.getProcessInstanceId();  
                 if(Objects.nonNull(RedisUtils.getCacheObject(smutinstance_next_finish))) {
                  flowNextDto.setBmutiInstanceFinish(true);
                 }
                }
          }
        }
    }
    
    //设置多实例流程表达式
    private void setMultiFlowExp(FlowNextDto flowNextDto,UserTask newUserTask,MultiInstanceLoopCharacteristics multiInstance,String methodname,Object[] argsPara) {
      List<SysUser> list = new ArrayList<SysUser>();
    flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    //Object[] argsPara=new Object[]{};
    List<String> templist = new ArrayList<String>();
    try {
      templist = (List<String>) flowexp.invokeMethod(flowexp, methodname,argsPara);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    for(String sysuser : templist) {
          SysUser sysUserTemp = sysUserService.selectUserByUserName(sysuser);
          list.add(sysUserTemp);
        }
    newUserTask.setAssignee("${assignee}");
    newUserTask.setCandidateUsers(templist);
    setMultiFlowNetDto(flowNextDto,list,newUserTask,multiInstance);
    }
    
    //设置多实例流程数据
    private void setMultiFlowNetDto(FlowNextDto flowNextDto,List<SysUser> list,UserTask userTask,MultiInstanceLoopCharacteristics multiInstance) {
      flowNextDto.setVars(ProcessConstants.PROCESS_MULTI_INSTANCE_USER);
        flowNextDto.setType(ProcessConstants.PROCESS_MULTI_INSTANCE);
        flowNextDto.setUserList(list);
        flowNextDto.setUserTask(userTask);
        if(multiInstance.isSequential()) {
          flowNextDto.setBisSequential(true);
        }
        else {
          flowNextDto.setBisSequential(false);
        }
    }

2、校验el表达示例

/**
     * 校验el表达示例
     *
     * @param map
     * @param expression
     * @return
     */
    public static Object result(Map<String, Object> map, String expression) {
      Object result = null; 
      try {
          FelEngine fel = new FelEngineImpl();
          FelContext ctx = fel.getContext();
          for (Map.Entry<String, Object> entry : map.entrySet()) {
              ctx.set(entry.getKey(), entry.getValue());
              System.out.print(entry.getKey() + "-"+ entry.getValue());
          }
          String exp = "";
          if (expression.indexOf("<") >0) {
            exp = expression.substring(0, expression.indexOf("<"));
          }
          else if (expression.indexOf(">") >0) {
            int index =expression.indexOf(">");
            exp = expression.substring(0, index);
          }
          else if (expression.indexOf("==") >0) {
            exp = expression.substring(0, expression.indexOf("=="));
          }
          exp =expression.replace(exp, ctx.get(exp).toString());
          result = fel.eval(exp);
          //result = fel.eval(expression);
    } catch (Exception e) {
      result = null;  
    }
       return result;
    }

3、获取排他网关分支名称、分支表达式是否存在

/**
     * 获取排他网关分支名称、分支表达式是否存在${approved}
     * @param flowElement
     * @param 
     * add by nbacheng
     */
    public static boolean GetExclusiveGatewayExpression(FlowElement flowElement) {
      // 获取所有网关分支
        List<SequenceFlow> targetFlows=((ExclusiveGateway)flowElement).getOutgoingFlows();
        // 循环每个网关分支
        for(SequenceFlow sequenceFlow : targetFlows){
            // 获取下一个网关和节点数据
            FlowElement targetFlowElement=sequenceFlow.getTargetFlowElement();
            // 网关数据不为空
            if (StringUtils.isNotBlank(sequenceFlow.getConditionExpression())) {
                // 获取网关判断条件
              String expression = sequenceFlow.getConditionExpression();
              if(expression.contains("${approved}")) {
                return true;
              }
            }
        }    
      return false;     
    }

4、工作流任务工具类主要是增加username

/**
 * 工作流任务工具类
 *
 * @author konbai
 * @createTime 2022/4/24 12:42
 */
public class TaskUtils {
    public static String getUserId() {
        return String.valueOf(LoginHelper.getUserId());
    }
    public static String getUserName() {
        return LoginHelper.getUserName();
    }
    
    /**
     * 获取用户组信息
     *
     * @return candidateGroup
     */
    public static List<String> getCandidateGroup() {
        List<String> list = new ArrayList<>();
        LoginUser user = LoginHelper.getLoginUser();
        if (ObjectUtil.isNotNull(user)) {
            if (ObjectUtil.isNotEmpty(user.getRoles())) {
                user.getRoles().forEach(role -> list.add(TaskConstants.ROLE_GROUP_PREFIX + role.getRoleId()));
            }
            if (ObjectUtil.isNotNull(user.getDeptId())) {
                list.add(TaskConstants.DEPT_GROUP_PREFIX + user.getDeptId());
            }
        }
        return list;
    }
}

5、效果图如下:


相关文章
|
存储 XML Java
Flowable工作流-高级篇
Flowable工作流-高级篇
10050 1
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
5473 2
|
数据可视化 前端开发 Java
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)(一)
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)
6386 0
|
前端开发
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)
1286 1
|
SQL JavaScript 前端开发
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
1411 2
基于若依ruoyi-nbcio支持flowable流程分类里增加流程应用类型
基于若依ruoyi-nbcio支持flowable流程分类里增加流程应用类型
470 1
|
搜索推荐
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)
774 0
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(三)
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(三)
843 1
|
Java 关系型数据库 数据库连接
mybatis中的useGeneratedKeys和keyProperty
在 MyBatis 中,`useGeneratedKeys` 和 `keyProperty` 是用于处理数据库自动生成主键的关键配置。通过这些配置,可以方便地获取和使用数据库生成的主键值,提高开发效率和代码可读性。确保正确配置和使用这两个属性,可以在应用程序中高效地进行数据库操作。
1051 25
|
前端开发 数据库 JavaScript
基于Flowable的流程挂接自定义业务表单的设计与实践
文章讨论了如何在Flowable流程引擎中挂接自定义业务表单,以及相关设计和实践的步骤。文章中包含了一些前后端代码示例,如Vue组件的模板和脚本部分,这些代码用于实现与Flowable流程引擎交互的界面。例如,有一个按钮组件用于提交申请,点击后会触发applySubmit方法,该方法会与后端API进行交互,处理流程启动、查询关联流程等逻辑。
55058 11