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


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

    gitee源代码地址

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

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

        接上面文章。

    1、获取排他网关分支名称、分支表达式、下一级任务节点

    1. /**
    2. * 获取排他网关分支名称、分支表达式、下一级任务节点
    3. * @param flowElement
    4. * @param data
    5. * add by nbacheng
    6. */
    7. private Map GetExclusiveGatewayUser(FlowElement flowElement,Map variables){
    8. // 获取所有网关分支
    9. List targetFlows=((ExclusiveGateway)flowElement).getOutgoingFlows();
    10. // 循环每个网关分支
    11. for(SequenceFlow sequenceFlow : targetFlows){
    12. // 获取下一个网关和节点数据
    13. FlowElement targetFlowElement=sequenceFlow.getTargetFlowElement();
    14. // 网关数据不为空
    15. if (StringUtils.isNotBlank(sequenceFlow.getConditionExpression())) {
    16. // 获取网关判断条件
    17. String expression = sequenceFlow.getConditionExpression();
    18. if (expression == null ||Boolean.parseBoolean(
    19. String.valueOf(
    20. FindNextNodeUtil.result(variables, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
    21. // 网关出线的下个节点是用户节点
    22. if(targetFlowElement instanceof UserTask){
    23. // 判断是否是会签
    24. UserTask userTask = (UserTask) targetFlowElement;
    25. MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
    26. if (Objects.nonNull(multiInstance)) {//下个节点是会签节点
    27. Map approvalmap = new HashMap<>();
    28. List getuserlist = getmultiInstanceUsers(multiInstance,userTask);
    29. approvalmap.put("approval", getuserlist);
    30. if(multiInstance.isSequential()) {
    31. approvalmap.put("isSequential", true);
    32. }
    33. else {
    34. approvalmap.put("isSequential", false);
    35. }
    36. return approvalmap;
    37. }
    38. }
    39. }
    40. }
    41. }
    42. return null;
    43. }

    2、获取多实例会签用户信息

    1. /**
    2. * 获取多实例会签用户信息
    3. * @param userTask
    4. * @param multiInstance
    5. *
    6. **/
    7. List getmultiInstanceUsers(MultiInstanceLoopCharacteristics multiInstance,UserTask userTask) {
    8. List sysuserlist = new ArrayList<>();
    9. List rolelist = new ArrayList<>();
    10. rolelist = userTask.getCandidateGroups();
    11. List userlist = new ArrayList<>();
    12. userlist = userTask.getCandidateUsers();
    13. if(rolelist.size() > 0) {
    14. List list = new ArrayList();
    15. for(String roleId : rolelist ){
    16. List templist = commonService.getUserListByRoleId(roleId);
    17. for(SysUser sysuser : templist) {
    18. SysUser sysUserTemp = sysUserService.selectUserById(sysuser.getUserId());
    19. list.add(sysUserTemp);
    20. }
    21. }
    22. sysuserlist = list.stream().map(obj-> (String) obj.getUserName()).collect(Collectors.toList());
    23. }
    24. else if(userlist.size() > 0) {
    25. List list = new ArrayList();
    26. for(String username : userlist) {
    27. SysUser sysUser = sysUserService.selectUserByUserName(username);
    28. list.add(sysUser);
    29. }
    30. sysuserlist = list.stream().map(obj-> (String) obj.getUserName()).collect(Collectors.toList());
    31. }
    32. return sysuserlist;
    33. }

    3、获取下一个节点信息

    1. /**
    2. * 获取下一节点
    3. *
    4. * @param flowTaskVo 任务
    5. * @return
    6. */
    7. @Override
    8. public R getNextFlowNode(WfTaskBo flowTaskVo) {
    9. // todo 目前只支持部分功能
    10. FlowNextDto flowNextDto = this.getNextFlowNode(flowTaskVo.getTaskId(), flowTaskVo.getVariables());
    11. if (flowNextDto==null) {
    12. return R.ok(null);
    13. }
    14. return R.ok(flowNextDto);
    15. }
    16. /** modify by nbacheng
    17. * 获取下一个节点信息,流程定义上的节点信息
    18. * @param taskId 当前节点id
    19. * @param values 流程变量
    20. * @return 如果返回null,表示没有下一个节点,流程结束
    21. */
    22. public FlowNextDto getNextFlowNode(String taskId, Map values) {
    23. //当前节点
    24. Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    25. FlowNextDto flowNextDto = new FlowNextDto();
    26. if (Objects.nonNull(task)) {
    27. // 下个任务节点
    28. if (DelegationState.PENDING.equals(task.getDelegationState())) { //对于委派的处理
    29. List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
    30. if (CollectionUtils.isNotEmpty(nextUserTask)) {
    31. flowNextDto.setType(ProcessConstants.FIXED);//委派是按原来流程执行,所以直接赋值返回
    32. return flowNextDto;
    33. }
    34. else {
    35. return null;
    36. }
    37. }
    38. List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, values);
    39. List list = new ArrayList();
    40. if (CollectionUtils.isNotEmpty(nextUserTask)) {
    41. for (UserTask userTask : nextUserTask) {
    42. MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
    43. // 会签节点
    44. if (Objects.nonNull(multiInstance)) {
    45. List rolelist = new ArrayList<>();
    46. rolelist = userTask.getCandidateGroups();
    47. List userlist = new ArrayList<>();
    48. userlist = userTask.getCandidateUsers();
    49. UserTask newUserTask = userTask;
    50. if(rolelist.size() != 0 && StringUtils.contains(rolelist.get(0), "${flowExp.getDynamic")) {//对表达式多个动态角色做特殊处理
    51. String methodname = StringUtils.substringBetween(rolelist.get(0), ".", "(");
    52. Object[] argsPara=new Object[]{};
    53. setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
    54. }
    55. else if(userlist.size() != 0 && StringUtils.contains(userlist.get(0), "${flowExp.getDynamic")) {//对表达式多个动态用户做特殊处理
    56. String methodname = StringUtils.substringBetween(userlist.get(0), ".", "(");
    57. Object[] argsPara=new Object[]{};
    58. setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
    59. }
    60. else if(userlist.size() != 0 && StringUtils.contains(userlist.get(0), "DepManagerHandler")) {//对部门经理做特殊处理
    61. String methodname = "getInitiatorDepManagers";
    62. // 获取流程发起人
    63. ProcessInstance processInstance = runtimeService
    64. .createProcessInstanceQuery()
    65. .processInstanceId(task.getProcessInstanceId())
    66. .singleResult();
    67. String startUserId = processInstance.getStartUserId();
    68. Object[] argsPara=new Object[]{};
    69. argsPara=new Object[]{startUserId};
    70. setMultiFlowExp(flowNextDto,newUserTask,multiInstance,methodname,argsPara);
    71. }
    72. else if(rolelist.size() > 0) {
    73. for(String roleId : rolelist ){
    74. List templist = commonService.getUserListByRoleId(roleId);
    75. for(SysUser sysuser : templist) {
    76. SysUser sysUserTemp = sysUserService.selectUserById(sysuser.getUserId());
    77. list.add(sysUserTemp);
    78. }
    79. }
    80. setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
    81. }
    82. else if(userlist.size() > 0) {
    83. for(String username : userlist) {
    84. SysUser sysUser = sysUserService.selectUserByUserName(username);
    85. list.add(sysUser);
    86. }
    87. setMultiFlowNetDto(flowNextDto,list,userTask,multiInstance);
    88. }
    89. else {
    90. flowNextDto.setType(ProcessConstants.FIXED);
    91. }
    92. } else {
    93. // 读取自定义节点属性 判断是否是否需要动态指定任务接收人员、组,目前只支持用户角色或多用户,还不支持子流程和变量
    94. //String dataType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_DATA_TYPE);
    95. //String userType = userTask.getAttributeValue(ProcessConstants.NAMASPASE, ProcessConstants.PROCESS_CUSTOM_USER_TYPE);
    96. List rolelist = new ArrayList<>();
    97. rolelist = userTask.getCandidateGroups();
    98. List userlist = new ArrayList<>();
    99. userlist = userTask.getCandidateUsers();
    100. String assignee = userTask.getAssignee();
    101. // 处理加载动态指定下一节点接收人员信息
    102. if(assignee !=null) {
    103. if(StringUtils.equalsAnyIgnoreCase(assignee, "${INITIATOR}")) {//对发起人做特殊处理
    104. SysUser sysUser = new SysUser();
    105. sysUser.setUserName("${INITIATOR}");
    106. list.add(sysUser);
    107. setAssigneeFlowNetDto(flowNextDto,list,userTask);
    108. }
    109. else if(StringUtils.contains(assignee, "${flowExp.getDynamicAssignee")) {//对表达式单个动态用户做特殊处理
    110. String methodname = StringUtils.substringBetween(assignee, ".", "(");
    111. SysUser sysUser = new SysUser();
    112. flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    113. Object[] argsPara=new Object[]{};
    114. String username = null;
    115. try {
    116. username = (String) flowexp.invokeMethod(flowexp, methodname,argsPara);
    117. } catch (Exception e) {
    118. e.printStackTrace();
    119. }
    120. sysUser.setUserName(username);
    121. list.add(sysUser);
    122. setAssigneeFlowNetDto(flowNextDto,list,userTask);
    123. }
    124. else if(StringUtils.contains(assignee, "${flowExp.getDynamicList")) {//对表达式多个动态用户做特殊处理
    125. String methodname = StringUtils.substringBetween(assignee, ".", "(");
    126. flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    127. Object[] argsPara=new Object[]{};
    128. try {
    129. list = (List) flowexp.invokeMethod(flowexp, methodname,argsPara);
    130. } catch (Exception e) {
    131. e.printStackTrace();
    132. }
    133. setUsersFlowNetDto(flowNextDto,list,userTask);
    134. }
    135. else if(StringUtils.contains(assignee, "${DepManagerHandler")) {//对部门经理多用户做特殊处理
    136. String methodname = "getInitiatorDepManagers";
    137. // 获取流程发起人
    138. ProcessInstance processInstance = runtimeService
    139. .createProcessInstanceQuery()
    140. .processInstanceId(task.getProcessInstanceId())
    141. .singleResult();
    142. String startUserId = processInstance.getStartUserId();
    143. flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    144. Object[] argsPara=new Object[]{};
    145. argsPara[0] = startUserId;
    146. try {
    147. list = (List) flowexp.invokeMethod(flowexp, methodname,argsPara);
    148. } catch (Exception e) {
    149. e.printStackTrace();
    150. }
    151. setUsersFlowNetDto(flowNextDto,list,userTask);
    152. }
    153. else {
    154. SysUser sysUser = sysUserService.selectUserByUserName(assignee);
    155. list.add(sysUser);
    156. setAssigneeFlowNetDto(flowNextDto,list,userTask);
    157. }
    158. }
    159. else if(userlist.size()>0 && StringUtils.equalsAnyIgnoreCase(userlist.get(0), "${DepManagerHandler.getUsers(execution)}")) {//对部门经理做特殊处理
    160. // 获取流程发起人
    161. ProcessInstance processInstance = runtimeService
    162. .createProcessInstanceQuery()
    163. .processInstanceId(task.getProcessInstanceId())
    164. .singleResult();
    165. String startUserId = processInstance.getStartUserId();
    166. flowExp flowexp = SpringContextUtils.getBean(flowExp.class);
    167. String manager = flowexp.getDynamicManager(startUserId);
    168. SysUser sysUser = sysUserService.selectUserByUserName(manager);
    169. list.add(sysUser);
    170. setUsersFlowNetDto(flowNextDto,list,userTask);
    171. }
    172. else if(userlist.size() > 0) {
    173. for(String username : userlist) {
    174. SysUser sysUser = sysUserService.selectUserByUserName(username);
    175. list.add(sysUser);
    176. }
    177. setUsersFlowNetDto(flowNextDto,list,userTask);
    178. setMultiFinishFlag(task,flowNextDto,list);
    179. }
    180. else if(rolelist.size() > 0) {
    181. for(String roleId : rolelist ){
    182. List templist = commonService.getUserListByRoleId(roleId);
    183. for(SysUser sysuser : templist) {
    184. SysUser sysUserTemp = sysUserService.selectUserByUserName(sysuser.getUserName());
    185. list.add(sysUserTemp);
    186. }
    187. }
    188. setUsersFlowNetDto(flowNextDto,list,userTask);
    189. setMultiFinishFlag(task,flowNextDto,list);
    190. }
    191. else {
    192. flowNextDto.setType(ProcessConstants.FIXED);
    193. }
    194. }
    195. }
    196. return flowNextDto;
    197. } else {
    198. return null;
    199. }
    200. }
    201. return null;
    202. }

  • 相关阅读:
    新增标签未顶格显示(子盒子内容超出父盒子引起的bug)
    虚拟机ubantu系统突然重启失去网络
    从0搭建vue3组件库: 如何完整搭建一个前端脚手架?
    ABTest样本量计算
    读书 | 设计模式之禅 - 责任链模式
    加密算法的简易应用
    Java基础教程(21)-Java连接MongoDB
    重读《纳瓦尔宝典》精彩语录及感悟篇(三)
    大淘客api实现多多进宝的商品查询PHP版
    hive分桶分区表和内部外部表
  • 原文地址:https://blog.csdn.net/qq_40032778/article/details/133338070