
8 changed files with 457 additions and 131 deletions
@ -0,0 +1,46 @@ |
|||||
|
package com.yxt.anrui.flowable.biz.flow3; |
||||
|
|
||||
|
import com.yxt.anrui.flowable.api.flow.UpdateFlowFieldVo; |
||||
|
import com.yxt.anrui.flowable.sqloperationsymbol.BusinessVariables; |
||||
|
import com.yxt.common.core.result.ResultBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @description: |
||||
|
* @author: dimengzhe |
||||
|
* @date: 2025/1/24 |
||||
|
**/ |
||||
|
@RestController |
||||
|
@RequestMapping("v3/flow") |
||||
|
public class Flow3Rest { |
||||
|
|
||||
|
@Autowired |
||||
|
private Flow3Service flowService; |
||||
|
|
||||
|
public ResultBean<UpdateFlowFieldVo> startProcess2(BusinessVariables bv) { |
||||
|
ResultBean<UpdateFlowFieldVo> rb = ResultBean.fireFail(); |
||||
|
//获取表单中的参数
|
||||
|
Map<String, Object> formVariables = bv.getFormVariables(); |
||||
|
formVariables = formVariables == null ? new HashMap<>() : formVariables; |
||||
|
//发起人的组织全路径
|
||||
|
String orgPath = bv.getOrgSidPath(); |
||||
|
formVariables.put("createrOrgPath", orgPath); |
||||
|
formVariables.put("businessSid", bv.getBusinessSid()); |
||||
|
//启动流程实例
|
||||
|
ResultBean<UpdateFlowFieldVo> startResultBean = flowService.businessStartProcessInstanceById2(bv); |
||||
|
return startResultBean; |
||||
|
} |
||||
|
|
||||
|
@PostMapping("/submit2") |
||||
|
public ResultBean submit222() { |
||||
|
return flowService.submit222(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,250 @@ |
|||||
|
package com.yxt.anrui.flowable.biz.flow3; |
||||
|
|
||||
|
import com.yxt.anrui.flowable.api.flow.UpdateFlowFieldVo; |
||||
|
import com.yxt.anrui.flowable.api.flowcomment.FlowComment; |
||||
|
import com.yxt.anrui.flowable.biz.flowtask.FlowTaskService; |
||||
|
import com.yxt.anrui.flowable.biz.process.ProcessService; |
||||
|
import com.yxt.anrui.flowable.biz.processcomment.ProcessCommentService; |
||||
|
import com.yxt.anrui.flowable.common.ProcessConstants; |
||||
|
import com.yxt.anrui.flowable.feign.MessageFeign; |
||||
|
import com.yxt.anrui.flowable.sqloperationsymbol.BusinessVariables; |
||||
|
import com.yxt.anrui.portal.api.sysflowableconfig.SysFlowableConfigFeign; |
||||
|
import com.yxt.anrui.portal.api.sysflowcc.SysFlowccFeign; |
||||
|
import com.yxt.anrui.portal.api.sysuser.SysUserFeign; |
||||
|
import com.yxt.anrui.portal.api.sysuser.SysUserVo; |
||||
|
import com.yxt.common.core.result.ResultBean; |
||||
|
import org.flowable.engine.*; |
||||
|
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; |
||||
|
import org.flowable.engine.repository.Deployment; |
||||
|
import org.flowable.engine.repository.ProcessDefinition; |
||||
|
import org.flowable.engine.runtime.ProcessInstance; |
||||
|
import org.flowable.identitylink.service.IdentityLinkService; |
||||
|
import org.flowable.task.api.Task; |
||||
|
import org.flowable.task.api.history.HistoricTaskInstance; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
|
||||
|
import java.util.*; |
||||
|
|
||||
|
import static org.junit.Assert.*; |
||||
|
|
||||
|
/** |
||||
|
* @description: |
||||
|
* @author: dimengzhe |
||||
|
* @date: 2025/1/24 |
||||
|
**/ |
||||
|
@Service |
||||
|
public class Flow3Service { |
||||
|
|
||||
|
@Autowired |
||||
|
RepositoryService repositoryService; |
||||
|
@Autowired |
||||
|
RuntimeService runtimeService; |
||||
|
|
||||
|
@Autowired |
||||
|
ManagementService managementService; |
||||
|
@Autowired |
||||
|
ProcessEngineConfigurationImpl processEngineConfiguration; |
||||
|
@Autowired |
||||
|
private SysUserFeign sysUserFeign; |
||||
|
|
||||
|
@Autowired |
||||
|
protected IdentityService identityService; |
||||
|
@Autowired |
||||
|
protected TaskService taskService; |
||||
|
@Autowired |
||||
|
private SysFlowableConfigFeign sysFlowableConfigFeign; |
||||
|
@Autowired |
||||
|
private FlowTaskService flowTaskService; |
||||
|
@Autowired |
||||
|
private ProcessCommentService processCommentService; |
||||
|
|
||||
|
@Autowired |
||||
|
protected HistoryService historyService; |
||||
|
|
||||
|
@Autowired |
||||
|
private ProcessService processService; |
||||
|
|
||||
|
@Autowired |
||||
|
private MessageFeign messageFeign; |
||||
|
@Autowired |
||||
|
private SysFlowccFeign sysFlowccFeign; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 启动流程 |
||||
|
* |
||||
|
* @param bv |
||||
|
* @return |
||||
|
*/ |
||||
|
public ResultBean<UpdateFlowFieldVo> businessStartProcessInstanceById2(BusinessVariables bv) { |
||||
|
ResultBean<UpdateFlowFieldVo> rb = ResultBean.fireFail(); |
||||
|
UpdateFlowFieldVo updateFlowFieldVo = new UpdateFlowFieldVo(); |
||||
|
String procDefId = bv.getModelId(); |
||||
|
String userSid = bv.getUserSid(); |
||||
|
String nextNodeUserSids = bv.getNextNodeUserSids(); |
||||
|
Map<String, Object> variables = bv.getFormVariables(); |
||||
|
Map<String, Object> variablesSeconds = bv.getFormVariables(); |
||||
|
//根据流程定义id查询
|
||||
|
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId) |
||||
|
.latestVersion().singleResult(); |
||||
|
if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { |
||||
|
return rb.setMsg("流程已被挂起,请先激活流程"); |
||||
|
} |
||||
|
// 设置流程发起人Id到流程中
|
||||
|
ResultBean<SysUserVo> sysUserVoResultBean = sysUserFeign.fetchBySid(userSid); |
||||
|
SysUserVo sysUser = sysUserVoResultBean.getData(); |
||||
|
identityService.setAuthenticatedUserId(sysUser.getSid()); |
||||
|
variables.put(ProcessConstants.PROCESS_INITIATOR, userSid); |
||||
|
variables.put(ProcessConstants.USER_TYPE_ASSIGNEE, userSid); |
||||
|
ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); |
||||
|
// 给第一步申请人节点设置任务执行人和意见 todo:第一个节点不设置为申请人节点有点问题?
|
||||
|
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); |
||||
|
if (Objects.nonNull(task)) { |
||||
|
taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.START.getType(), |
||||
|
sysUser.getName() + "发起流程申请"); |
||||
|
taskService.setAssignee(task.getId(), userSid); |
||||
|
taskService.complete(task.getId(), variables); |
||||
|
} |
||||
|
List<String> aggigneeList = (List<String>) variables.get("approvers"); |
||||
|
// 获取多实例任务的所有实例
|
||||
|
List<Task> tasks = taskService.createTaskQuery() |
||||
|
.processInstanceId(processInstance.getProcessInstanceId()) // 使用流程实例ID进行过滤
|
||||
|
.taskDefinitionKey("Activity_1f8o20w") // 指定多实例任务的定义Key
|
||||
|
.list(); // 查询所有相关的任务实例
|
||||
|
// 确保查询到了多条任务实例
|
||||
|
if (!tasks.isEmpty()) { |
||||
|
// 遍历任务列表并为每个任务设置执行人
|
||||
|
for (int i = 0; i < tasks.size(); i++) { |
||||
|
Task taskss = tasks.get(i); |
||||
|
// 确保任务和用户数量匹配,避免索引越界
|
||||
|
if (i < aggigneeList.size()) { |
||||
|
String assignee = aggigneeList.get(i); // 获取用户
|
||||
|
taskService.setAssignee(taskss.getId(), assignee); // 为任务设置执行人
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return rb.success().setData(updateFlowFieldVo).setMsg("流程启动成功"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public ResultBean submit222() { |
||||
|
String userSid = "7f56f6ec-4a5f-47b0-aaab-158d64cb97b1"; |
||||
|
// 或签任务候选人
|
||||
|
List<String> userIds = new ArrayList<>(); |
||||
|
userIds.add("dc6b9e36-1b31-4b94-908b-d2d7f78a0977"); |
||||
|
userIds.add("657bf5a5-7665-440e-9cbd-ab87eccfbdcc"); |
||||
|
userIds.add("2737e5ee-5ffd-4127-919b-e6694dfc8361"); |
||||
|
|
||||
|
// 会签任务候选人
|
||||
|
List<String> approvers = new ArrayList<>(); |
||||
|
approvers.add("1d85d1fe-e527-4ec5-a5e4-c37a76a36518"); |
||||
|
approvers.add("64e289bc-80cd-487a-9498-5ae61e260f71"); |
||||
|
approvers.add("7ffcd76a-4fa0-4c9c-87ca-a0c2116bb2ed"); |
||||
|
|
||||
|
Map<String, Object> variables = new HashMap<>(); |
||||
|
variables.put("userSids", userIds); |
||||
|
variables.put("approvers", approvers); |
||||
|
variables.put(ProcessConstants.PROCESS_INITIATOR, userSid); |
||||
|
variables.put(ProcessConstants.USER_TYPE_ASSIGNEE, userSid); |
||||
|
// 设置流程发起人Id到流程中
|
||||
|
ResultBean<SysUserVo> sysUserVoResultBean = sysUserFeign.fetchBySid(userSid); |
||||
|
SysUserVo sysUser = sysUserVoResultBean.getData(); |
||||
|
identityService.setAuthenticatedUserId(sysUser.getSid()); |
||||
|
// 启动流程实例
|
||||
|
ProcessInstance processInstance = runtimeService.startProcessInstanceById("process_rrqxpsu8:5:16907561", variables); |
||||
|
|
||||
|
// 断言流程实例是否成功启动
|
||||
|
assertNotNull(processInstance); |
||||
|
System.out.println("流程实例ID: " + processInstance.getId()); |
||||
|
|
||||
|
// 查询用户任务
|
||||
|
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); |
||||
|
// 模拟申请人完成任务
|
||||
|
for (int i = 0; i < tasks.size(); i++) { |
||||
|
Task task = tasks.get(i); |
||||
|
taskService.complete(task.getId(), variables); |
||||
|
} |
||||
|
|
||||
|
tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); |
||||
|
assertEquals(approvers.size(), tasks.size()); |
||||
|
|
||||
|
// 验证每个任务是否正确分配给指定的用户
|
||||
|
for (Task task : tasks) { |
||||
|
System.out.println("用户任务ID: " + task.getId()); |
||||
|
System.out.println("任务名称: " + task.getName()); |
||||
|
System.out.println("任务分配给的执行人员: " + task.getAssignee()); |
||||
|
// 添加候选人
|
||||
|
for (String approver : approvers) { |
||||
|
taskService.addCandidateUser(task.getId(), approver); // 将候选人添加到任务
|
||||
|
} |
||||
|
|
||||
|
// 验证任务分配给的执行人员(此时任务没有assignee)
|
||||
|
assertNull(task.getAssignee()); // 确保没有直接分配执行人员
|
||||
|
// 验证任务分配给的执行人员
|
||||
|
// assertTrue(approvers.contains(task.getAssignee()));
|
||||
|
} |
||||
|
//为候选人分配 任务
|
||||
|
for (int i = 0; i < tasks.size(); i++) { |
||||
|
Task task = tasks.get(i); |
||||
|
taskService.claim(task.getId(), approvers.get(i)); // 由候选人认领任务
|
||||
|
} |
||||
|
|
||||
|
// 模拟两个用户完成任务
|
||||
|
for (int i = 0; i < 2; i++) { |
||||
|
Task task = tasks.get(i); |
||||
|
taskService.complete(task.getId()); |
||||
|
} |
||||
|
|
||||
|
// 检查流程实例是否仍然处于活动状态
|
||||
|
boolean isEnded = runtimeService.createProcessInstanceQuery() |
||||
|
.processInstanceId(processInstance.getId()) |
||||
|
.singleResult() == null; |
||||
|
assertFalse(isEnded); |
||||
|
|
||||
|
// 处理最后一个人
|
||||
|
Task lastTask = tasks.get(tasks.size() - 1); |
||||
|
taskService.complete(lastTask.getId()); |
||||
|
|
||||
|
|
||||
|
//======================================================================================
|
||||
|
//===或签任务
|
||||
|
List<Task> approvalTasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); |
||||
|
//为候选人分配 任务
|
||||
|
for (int i = 0; i < approvalTasks.size(); i++) { |
||||
|
Task task = approvalTasks.get(i); |
||||
|
taskService.claim(task.getId(), userIds.get(0)); // 由候选人认领任务
|
||||
|
} |
||||
|
// 模拟只有一个人完成任务
|
||||
|
approvalTasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); |
||||
|
Task approvalTask = approvalTasks.get(0); |
||||
|
|
||||
|
taskService.complete(approvalTask.getId()); |
||||
|
|
||||
|
//==待定
|
||||
|
// 手动更新历史记录中的 `ASSIGNEE_` 和 `END_TIME_`
|
||||
|
HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() |
||||
|
.taskId(approvalTask.getId()).singleResult(); |
||||
|
if (historicTask != null) { |
||||
|
// 只有在实际完成的用户任务记录中才更新这些字段
|
||||
|
System.out.println("Task completed by: " + historicTask.getAssignee()); |
||||
|
System.out.println("Task end time: " + historicTask.getEndTime()); |
||||
|
} |
||||
|
|
||||
|
//======================================================================================
|
||||
|
//===总经理审批
|
||||
|
List<Task> approvalTasks2 = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); |
||||
|
Task approvalTask2 = approvalTasks2.get(0); |
||||
|
taskService.claim(approvalTask2.getId(), "503efb39-7889-4185-807f-624271a951aa"); |
||||
|
taskService.complete(approvalTask2.getId()); |
||||
|
// 检查流程实例是否已经结束
|
||||
|
boolean isEnded2 = runtimeService.createProcessInstanceQuery() |
||||
|
.processInstanceId(processInstance.getId()) |
||||
|
.singleResult() == null; |
||||
|
assertTrue(isEnded2); |
||||
|
|
||||
|
return ResultBean.fireSuccess(); |
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue