diff --git a/klp-admin/src/main/java/com/klp/web/controller/workflow/WfProcessController.java b/klp-admin/src/main/java/com/klp/web/controller/workflow/WfProcessController.java index 4470268f..203b2c87 100644 --- a/klp-admin/src/main/java/com/klp/web/controller/workflow/WfProcessController.java +++ b/klp-admin/src/main/java/com/klp/web/controller/workflow/WfProcessController.java @@ -201,9 +201,9 @@ public class WfProcessController extends BaseController { @SaCheckPermission("workflow:process:start") @PostMapping("/start/{processDefId}") public R start(@PathVariable(value = "processDefId") String processDefId, @RequestBody Map variables) { + // 如果包含审批人信息,则处理审批人信息 processService.startProcessByDefId(processDefId, variables); return R.ok("流程启动成功"); - } /** diff --git a/klp-system/src/main/java/com/klp/workflow/service/impl/WfProcessServiceImpl.java b/klp-system/src/main/java/com/klp/workflow/service/impl/WfProcessServiceImpl.java index d1a48395..e407e4d1 100644 --- a/klp-system/src/main/java/com/klp/workflow/service/impl/WfProcessServiceImpl.java +++ b/klp-system/src/main/java/com/klp/workflow/service/impl/WfProcessServiceImpl.java @@ -689,11 +689,77 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr); // 设置流程状态为进行中 variables.put(ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.RUNNING.getStatus()); + // 发起流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables); + + // 如果包含审批人信息,则设置下一个任务的审批人 + try { + if (variables.containsKey("flowable") && variables.get("flowable") != null) { + Object flowableObj = variables.get("flowable"); + if (flowableObj instanceof Map) { + @SuppressWarnings("unchecked") + Map flowable = (Map) flowableObj; + if (flowable.containsKey("candidateUsers")) { + Object candidateUsersObj = flowable.get("candidateUsers"); + if (candidateUsersObj != null) { + String candidateUsers = candidateUsersObj.toString(); + if (StringUtils.isNotBlank(candidateUsers)) { + // 获取流程模型 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); + // 设置下一个任务的审批人 + this.assignNextUsers(bpmnModel, processInstance.getProcessInstanceId(), candidateUsers); + } + } + } + } + } + } catch (Exception e) { + // 记录异常但不影响流程启动 + e.printStackTrace(); + } + // 第一个用户任务为发起人,则自动完成任务 wfTaskService.startFirstTask(processInstance, variables); } + + /** + * 设置下一个任务的审批人 + * + * @param bpmnModel 流程模型 + * @param processInstanceId 流程实例ID + * @param candidateUsers 候选人字符串 + */ + private void assignNextUsers(BpmnModel bpmnModel, String processInstanceId, String candidateUsers) { + if (StringUtils.isBlank(candidateUsers)) { + return; + } + + try { + // 获取当前流程实例的所有任务 + List tasks = taskService.createTaskQuery() + .processInstanceId(processInstanceId) + .list(); + + if (CollUtil.isEmpty(tasks)) { + return; + } + + // 为每个任务设置候选人 + for (Task task : tasks) { + // 解析候选人字符串,格式可能是:userId1,userId2,userId3 + String[] userIds = candidateUsers.split(","); + for (String userId : userIds) { + if (StringUtils.isNotBlank(userId)) { + // 添加候选人 + taskService.addCandidateUser(task.getId(), userId.trim()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } /** diff --git a/klp-ui/src/views/workflow/work/start.vue b/klp-ui/src/views/workflow/work/start.vue index 205ce57f..157c9709 100644 --- a/klp-ui/src/views/workflow/work/start.vue +++ b/klp-ui/src/views/workflow/work/start.vue @@ -6,21 +6,108 @@
- + +
+ + + +
+ 审批人设置 +
+ + + + 指定用户 + 角色 + 部门 + 发起人 + + + + + + {{ item.nickName }} + + + + +
+ + +
+ 提交 + 重置
+ + + + + + + +
+ 部门列表 +
+
+ + +
+
+
+ + + + + + + + + +
+ + 取 消 + 确 定 + +