当前位置:   article > 正文

基于若依的ruoyi-vue3.8.7的flowable支持指定接收人的流程审批后端部分_ruoyi-vue-flowable

ruoyi-vue-flowable

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

gitee源代码地址

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

演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/

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

gitee源代码地址

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

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://218.75.87.38:9888

1、后端,主要是提交流程做如下调整

  1. /**
  2. * 启动流程实例
  3. */
  4. private R startProcess(ProcessDefinition procDef, Map<String, Object> variables) {
  5. if (ObjectUtil.isNotNull(procDef) && procDef.isSuspended()) {
  6. throw new ServiceException("流程已被挂起,请先激活流程");
  7. }
  8. // 设置流程发起人Id到流程中
  9. String userIdStr = TaskUtils.getUserId();
  10. identityService.setAuthenticatedUserId(userIdStr);
  11. variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr);
  12. // 设置流程状态为进行中
  13. variables.put(ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.RUNNING.getStatus());
  14. // 发起流程实例
  15. ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables);
  16. // 第一个用户任务为发起人,则自动完成任务
  17. wfTaskService.startFirstTask(processInstance, variables);
  18. // 获取 bpmn 模型
  19. BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
  20. return this.getCurrentUsers(bpmnModel, processInstance.getProcessInstanceId(), variables);
  21. }
  22. /**
  23. * 获取当前任务审批人
  24. * @param bpmnModel bpmn模型
  25. * @param processInsId 流程实例id
  26. * @param userIds 用户ids
  27. */
  28. private R getCurrentUsers(BpmnModel bpmnModel, String processInsId, Map<String, Object> variables) {
  29. // 获取所有节点信息
  30. List<Task> list = taskService.createTaskQuery()
  31. .processInstanceId(processInsId)
  32. .list();
  33. if (list.size() == 0) {
  34. return R.ok("流程启动失败成功");
  35. }
  36. UserTask userTask = ModelUtils.getUserTaskByKey(bpmnModel,list.get(0).getTaskDefinitionKey());
  37. if(StringUtils.equalsAnyIgnoreCase(userTask.getAssignee(), "${getNextApprovalHandler.getApproval(execution)}")) {//对接收人做特殊处理
  38. //返回前端选择人员后跳过发起人流程
  39. WfTaskBo taskBo = new WfTaskBo();
  40. taskBo.setTaskId(list.get(0).getId());
  41. taskBo.setProcInsId(processInsId);
  42. taskBo.setNextUserIds("${approval}");
  43. taskBo.setVariables(variables);
  44. return R.ok(taskBo);
  45. }
  46. return R.ok("流程启动成功");
  47. }

2、与完成流程做如下调整

  1. /**
  2. * 完成任务
  3. *
  4. * @param taskBo 请求实体参数
  5. */
  6. @Transactional(rollbackFor = Exception.class)
  7. @Override
  8. public void complete(WfTaskBo taskBo) {
  9. Task task = taskService.createTaskQuery().taskId(taskBo.getTaskId()).singleResult();
  10. if (Objects.isNull(task)) {
  11. throw new ServiceException("任务不存在");
  12. }
  13. // 获取 bpmn 模型
  14. BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
  15. // 处理下一级接收人
  16. if(ObjectUtil.isNotEmpty(taskBo.getNextApproval())) {
  17. this.assignNextApproval(bpmnModel, taskBo.getProcInsId(), taskBo.getNextApproval());
  18. return;
  19. }
  20. if (DelegationState.PENDING.equals(task.getDelegationState())) {
  21. taskService.addComment(taskBo.getTaskId(), taskBo.getProcInsId(), FlowComment.DELEGATE.getType(), taskBo.getComment());
  22. taskService.resolveTask(taskBo.getTaskId());
  23. } else {
  24. taskService.addComment(taskBo.getTaskId(), taskBo.getProcInsId(), FlowComment.NORMAL.getType(), taskBo.getComment());
  25. taskService.setAssignee(taskBo.getTaskId(), TaskUtils.getUserId());
  26. if (ObjectUtil.isNotEmpty(taskBo.getVariables())) {
  27. // 获取模型信息
  28. String localScopeValue = ModelUtils.getUserTaskAttributeValue(bpmnModel, task.getTaskDefinitionKey(), ProcessConstants.PROCESS_FORM_LOCAL_SCOPE);
  29. boolean localScope = Convert.toBool(localScopeValue, false);
  30. taskService.complete(taskBo.getTaskId(), taskBo.getVariables(), localScope);
  31. } else {
  32. taskService.complete(taskBo.getTaskId());
  33. }
  34. }
  35. // 设置任务节点名称
  36. taskBo.setTaskName(task.getName());
  37. // 处理下一级审批人
  38. if (StringUtils.isNotBlank(taskBo.getNextUserIds())) {
  39. this.assignNextUsers(bpmnModel, taskBo.getProcInsId(), taskBo.getNextUserIds());
  40. }
  41. // 处理抄送用户
  42. if (!copyService.makeCopy(taskBo)) {
  43. throw new RuntimeException("抄送任务失败");
  44. }
  45. }

3、效果图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/852355
推荐阅读
相关标签
  

闽ICP备14008679号