From d216984d8c1024f72c136076b68f091efeb09ea0 Mon Sep 17 00:00:00 2001 From: lijiarao Date: Thu, 20 Jun 2024 18:04:13 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=B5=8B=E8=AF=95=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ProcessApprovalRecord.java | 7 ++ .../activiti/enums/ProcessTypeEnum.java | 1 + .../listener/MyGlobalEventListener.java | 49 +++++++-- .../process/common/entity/ProcessDraft.java | 6 + .../fb/common/ProcessDefinitionKey.java | 4 + .../fb/service/IProcessHandleService.java | 2 + .../impl/ProcessHandleServiceImpl.java | 44 +++++++- .../activiti/process/fb/vo/ProcessInfoVO.java | 5 + .../activiti/service/ProcessAllService.java | 12 ++ .../main/resources/bpmn/测试流程_主流程.bpmn | 104 ++++++++++-------- .../resources/bpmn/测试流程_解读人子流程.bpmn | 32 +++--- .../bpmn/测试流程_重新分发子流程.bpmn | 22 ++-- 12 files changed, 208 insertions(+), 80 deletions(-) diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java b/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java index b260c6bd..d94485d5 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/entity/ProcessApprovalRecord.java @@ -40,6 +40,13 @@ public class ProcessApprovalRecord { @ApiModelProperty(value = "任务名称") private String taskName; + /** + * 父任务id + */ + @TableField(value = "parent_task_id") + @ApiModelProperty(value = "父任务id") + private String parentTaskId; + /** * 流程实例id */ diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java b/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java index 72af0fe2..312fdd00 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java @@ -12,6 +12,7 @@ import lombok.Getter; public enum ProcessTypeEnum { + DEMO("测试流程",0, "com.jero.modules.activiti.process.demo.service.ProcessDemoService","/workCenter/StandardEntryOrChangeProcess","/workCenter/StandardEntryOrChangeProcess"), FB_ENTRY_CHANGE("标准法规入库/变更流程",1, "com.jero.modules.activiti.process.fb.service.impl.ProcessFbEntryChangeServiceImpl","/workCenter/StandardEntryOrChangeProcess","/workCenter/StandardEntryOrChangeProcess"), FB_STANDARD_CONSULTATION("标准征求意见流程",2, "com.jero.modules.activiti.process.fb.service.impl.ProcessFbStandardConsultationServiceImpl","/workCenter/StandardConsultationProcess","/workCenter/StandardConsultationProcess"), PROJECT_ASSESS("项目合规评估流程",3, "com.jero.modules.activiti.process.projectassess.service.ProcessProjectAssessService","/workCenter/ProjectComplianceEvaluationProcess","/workCenter/ProjectComplianceEvaluationProcess"), diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/listener/MyGlobalEventListener.java b/laws-modules/src/main/java/com/jero/modules/activiti/listener/MyGlobalEventListener.java index e5bccac5..9668c1d2 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/listener/MyGlobalEventListener.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/listener/MyGlobalEventListener.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.jero.common.api.dto.message.HiworkTodoAdd; import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.system.vo.LoginUser; +import com.jero.modules.activiti.common.ActivitiCommon; import com.jero.modules.activiti.entity.ProcessAll; import com.jero.modules.activiti.entity.ProcessApprovalRecord; import com.jero.modules.activiti.entity.ProcessNode; @@ -22,12 +23,14 @@ import com.jero.modules.activiti.service.ProcessNodeService; import com.jero.modules.activiti.util.SpringContextUtil; import com.jero.modules.laws.common.util.CurrentUserUtil; import lombok.extern.slf4j.Slf4j; +import org.activiti.engine.TaskService; import org.activiti.engine.delegate.event.ActivitiEvent; import org.activiti.engine.delegate.event.ActivitiEventListener; import org.activiti.engine.delegate.event.impl.ActivitiEntityEventImpl; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.persistence.entity.ExecutionEntityImpl; import org.activiti.engine.impl.persistence.entity.TaskEntity; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.util.*; @@ -84,6 +87,10 @@ public class MyGlobalEventListener implements ActivitiEventListener { String processInstanceId = execution.getProcessInstanceId(); String processDefinitionId = execution.getProcessDefinitionId(); ExecutionEntityImpl parent = execution.getParent(); + String mainInstanceId = (String) execution.getVariable(ActivitiCommon.MAIN_INSTANCE_ID); + if (mainInstanceId != null){ + return; + } String name = parent.getProcessDefinitionName(); //新增流程总表信息(剩余的内容在启动流程时填充) ProcessAll processAll = new ProcessAll(); @@ -114,20 +121,21 @@ public class MyGlobalEventListener implements ActivitiEventListener { ProcessAllService processAllService = SpringContextUtil.getBean(ProcessAllService.class); ProcessApprovalRecordService recordService = SpringContextUtil.getBean(ProcessApprovalRecordService.class); ProcessNodeService processNodeService = SpringContextUtil.getBean(ProcessNodeService.class); - log.info("id = " + delegateTask.getId()); - log.info("name = " + delegateTask.getName()); - log.info("taskEntity.getAssignee() = " + delegateTask.getAssignee()); - log.info("taskEntity.getIdentityLinks() = " + delegateTask.getIdentityLinks()); - log.info("taskEntity.getVariables() = " + delegateTask.getVariables()); - log.info("execution.getActivityId() = " + execution.getActivityId()); String id = delegateTask.getId(); String name = delegateTask.getName(); - String processInstanceId = delegateTask.getProcessInstanceId(); Date createTime = delegateTask.getCreateTime(); String assignee = delegateTask.getAssignee(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); String processDefinitionId = delegateTask.getProcessDefinitionId(); + Map variables = delegateTask.getVariables(); + + log.info("id = " + delegateTask.getId()); + log.info("name = " + delegateTask.getName()); + log.info("taskEntity.getAssignee() = " + delegateTask.getAssignee()); + log.info("taskEntity.getIdentityLinks() = " + delegateTask.getIdentityLinks()); + log.info("taskEntity.getVariables() = " + variables); + log.info("execution.getActivityId() = " + execution.getActivityId()); //判断是否需要创建待办 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ProcessNode::getProcessDefinitionId,processDefinitionId); @@ -140,10 +148,17 @@ public class MyGlobalEventListener implements ActivitiEventListener { return; } } + String mainInstanceId = (String) variables.get(ActivitiCommon.MAIN_INSTANCE_ID); + String processInstanceId = mainInstanceId != null ? mainInstanceId : delegateTask.getProcessInstanceId(); + + String parentInstanceId = (String) variables.get(ActivitiCommon.PARENT_INSTANCE_ID); + String parentTaskId = (String) variables.get(ActivitiCommon.PARENT_TASK_ID); //新增待审批记录 ProcessApprovalRecord approvalRecord = new ProcessApprovalRecord(); approvalRecord.setTaskId(id); approvalRecord.setTaskName(name); + //approvalRecord.setMainInstanceId(mainInstanceId != null ? mainInstanceId : processInstanceId); + approvalRecord.setParentTaskId(parentTaskId); approvalRecord.setProcessInstanceId(processInstanceId); approvalRecord.setUserId(assignee); approvalRecord.setOriginUserId(assignee); @@ -273,10 +288,11 @@ public class MyGlobalEventListener implements ActivitiEventListener { if (isFirstNodeTask(approvalRecord)) { approvalRecord.setCreateTime(DateUtil.offsetSecond(createTime, -1)); } - + String mainInstanceId = (String) variables.get(ActivitiCommon.MAIN_INSTANCE_ID); + String processInstanceId = mainInstanceId != null ? mainInstanceId : delegateTask.getProcessInstanceId(); recordService.updateById(approvalRecord); //更新最新完成任务时间 - ProcessAll processAll = processAllService.getByProcessInstanceId(delegateTask.getProcessInstanceId()); + ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(ProcessAll::getId,processAll.getId()); updateWrapper.set(ProcessAll::getCompletedTaskTime,date); @@ -301,8 +317,9 @@ public class MyGlobalEventListener implements ActivitiEventListener { ExecutionEntityImpl execution = (ExecutionEntityImpl) activitiEntityEvent.getEntity(); //流程信息 ProcessAllService processAllService = SpringContextUtil.getBean(ProcessAllService.class); - - String processInstanceId = execution.getProcessInstanceId(); + //根据mainInstanceId是否存在判断是否子流程 + String mainInstanceId = (String) execution.getVariable(ActivitiCommon.MAIN_INSTANCE_ID); + String processInstanceId = mainInstanceId != null ? mainInstanceId : execution.getProcessInstanceId(); ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId); Date createTime = processAll.getCreateTime(); DateTime date = DateUtil.date(); @@ -315,6 +332,16 @@ public class MyGlobalEventListener implements ActivitiEventListener { wrapper.set(ProcessAll::getEndTime, date); wrapper.set(ProcessAll::getOverTime, between.toString()); processAllService.update(wrapper); + //如果有父id,判断所有子流程是否都完成,如果都完成,那么父流程的任务开始流转 + String parentInstanceId = (String) execution.getVariable(ActivitiCommon.PARENT_INSTANCE_ID); + String parentTaskId = (String) execution.getVariable(ActivitiCommon.PARENT_TASK_ID); + if (StringUtils.isNotBlank(parentTaskId)){ + int i = processAllService.countByParentTaskId(parentTaskId); + if (i == 0){ + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + taskService.complete(parentTaskId); + } + } log.info("id = " + execution.getId()); log.info("name = " + execution.getName()); log.info("taskEntity.getActivityName() = " + execution.getActivityName()); diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/entity/ProcessDraft.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/entity/ProcessDraft.java index 332fb2e6..3fcdb190 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/entity/ProcessDraft.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/entity/ProcessDraft.java @@ -65,6 +65,12 @@ public class ProcessDraft implements Serializable { @ApiModelProperty(value = "流程类型") private String prcName; + /** + * 主流程实例id + */ + @ApiModelProperty(value="主流程实例id") + private String mainInstanceId; + /** * 流程实例id */ diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/common/ProcessDefinitionKey.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/common/ProcessDefinitionKey.java index a8c1b8db..6327f495 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/common/ProcessDefinitionKey.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/common/ProcessDefinitionKey.java @@ -22,5 +22,9 @@ public class ProcessDefinitionKey { public static final String PROJECT_NOT_MET = "project-not-met"; //项目合规评估流程 public static final String PROJECT_STANDARD = "standard-assessment"; + //demo流程 + public static final String DEMO_MAIN = "demo_main"; + public static final String DEMO_JDR = "demo_jdr"; + public static final String DEMO_CXFF = "demo_cxff"; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/IProcessHandleService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/IProcessHandleService.java index b2f44923..655cea0f 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/IProcessHandleService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/IProcessHandleService.java @@ -20,6 +20,8 @@ public interface IProcessHandleService { **/ String startProcess(ProcessInfoVO processInfoVO); + String startChildrenProcess(ProcessInfoVO processInfoVO); + /** * @Author: liao * @Date: 2023/11/6 11:56 diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/impl/ProcessHandleServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/impl/ProcessHandleServiceImpl.java index a4e2af27..c4bc94ca 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/impl/ProcessHandleServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/service/impl/ProcessHandleServiceImpl.java @@ -89,6 +89,10 @@ public class ProcessHandleServiceImpl implements IProcessHandleService { String processDefinitionId = basicProcessInfoDTO.getProcessDefinitionId(); // 流程定义id // 根据流程定义id启动流程 Map variables = setProcessVariables(userInfoMap); + Map processVariables = processInfoVO.getProcessVariables(); + if (processVariables != null){ + variables.putAll(processVariables); + } ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); String processInstanceId = processInstance.getId(); // 流程实例id @@ -156,6 +160,44 @@ public class ProcessHandleServiceImpl implements IProcessHandleService { return processInstanceId; } + /** + * @Author: liao + * @Date: 2023/11/2 17:04 + * @Description: 启动子流程 + **/ + @Override + public String startChildrenProcess(ProcessInfoVO processInfoVO) { + BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO(); // 流程信息 + Map userInfoMap = processInfoVO.getUserInfoMap(); // 用户变量map + BasicTaskInfoDTO basicTaskInfoDTO = processInfoVO.getBasicTaskInfoDTO(); // 流程审批信息 + // 删除自己的草稿 + String draftId = processInfoVO.getDraftId(); + if (StringUtils.isNotBlank(draftId)) { + processDraftService.removeById(draftId); + } + String processDefinitionId = basicProcessInfoDTO.getProcessDefinitionId(); // 流程定义id + // 根据流程定义id启动流程 + Map variables = setProcessVariables(userInfoMap); + Map processVariables = processInfoVO.getProcessVariables(); + if (processVariables != null){ + variables.putAll(processVariables); + } + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); + String processInstanceId = processInstance.getId(); // 流程实例id + // 根据流程实例id更新流程总表 + basicProcessInfoDTO.setProcessInstanceId(processInstanceId); + updateProcessAll(processInfoVO); + + // 保存选人信息 + processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap); + + log.info("================================启动子流程================================="); + log.info("流程定义id: {}", processDefinitionId); + log.info("流程实例id: {}", processInstanceId); + log.info("======================================================================="); + + return processInstanceId; + } /** * @Author: liao @@ -332,7 +374,7 @@ public class ProcessHandleServiceImpl implements IProcessHandleService { ProcessDTO processDTO = new ProcessDTO(); ProcessApprovalRecord processApprovalRecord = processApprovalRecordService.getToDoByTaskId(taskId); Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); - String processInstanceId = task.getProcessInstanceId(); + String processInstanceId = processApprovalRecord.getProcessInstanceId(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); String processDefinitionId = processInstance.getProcessDefinitionId(); Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/vo/ProcessInfoVO.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/vo/ProcessInfoVO.java index df54d3cf..693bf98b 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/vo/ProcessInfoVO.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/fb/vo/ProcessInfoVO.java @@ -56,5 +56,10 @@ public class ProcessInfoVO implements Serializable { */ @ApiModelProperty(value="保存来源(1:待办 2:草稿 3:初始信息)") private String saveSource; + /** + * 流程变量 + */ + @ApiModelProperty(value="流程变量") + private Map processVariables; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/service/ProcessAllService.java b/laws-modules/src/main/java/com/jero/modules/activiti/service/ProcessAllService.java index 52a438d0..67cb293c 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/service/ProcessAllService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/service/ProcessAllService.java @@ -415,4 +415,16 @@ public class ProcessAllService extends ServiceImpl processAllLambdaQueryWrapper.eq(ProcessAll::getProcessInstanceId, prcId); remove(processAllLambdaQueryWrapper); } + + /** + * 查询未完成的子任务数量 + * @param parentTaskId + * @return + */ + public int countByParentTaskId(String parentTaskId){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessApprovalRecord::getParentTaskId,parentTaskId); + wrapper.eq(ProcessApprovalRecord::getFinishFlag,FinishFlagEnum.INCOMPLETE.getValue()); + return approvalRecordService.count(wrapper); + } } diff --git a/laws-modules/src/main/resources/bpmn/测试流程_主流程.bpmn b/laws-modules/src/main/resources/bpmn/测试流程_主流程.bpmn index 88b658d3..2a8c5f88 100644 --- a/laws-modules/src/main/resources/bpmn/测试流程_主流程.bpmn +++ b/laws-modules/src/main/resources/bpmn/测试流程_主流程.bpmn @@ -2,15 +2,13 @@ - Flow_1g6zc95 Flow_0m3rvt8 + Flow_0hbqlad Flow_06h9ihd - Flow_1g6zc95 + Flow_0xdvtnf - - Flow_06h9ihd Flow_0m3rvt8 @@ -23,80 +21,98 @@ Flow_0wenf4n Flow_0aofle0 - Flow_04r2zel + Flow_0aofle0 Flow_04r2zel - + + + + + + + Flow_0xdvtnf + Flow_0hbqlad + + + + + + Flow_0y71vm8 Flow_0wenf4n - - - + - - - - - - - - + - + - + - + - + + + + + + + + + + + - - - - - - + + - - - - + + + + - + - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + diff --git a/laws-modules/src/main/resources/bpmn/测试流程_解读人子流程.bpmn b/laws-modules/src/main/resources/bpmn/测试流程_解读人子流程.bpmn index 1d9dda06..acf0e58d 100644 --- a/laws-modules/src/main/resources/bpmn/测试流程_解读人子流程.bpmn +++ b/laws-modules/src/main/resources/bpmn/测试流程_解读人子流程.bpmn @@ -5,9 +5,7 @@ Flow_0bf22p9 - - - + Flow_0bf22p9 Flow_0l0nol7 @@ -23,17 +21,24 @@ Flow_15yh4zu - - - Flow_15yh4zu - Flow_1u81jlq - - - + + ${pass} + + + ${!pass} + + Flow_1l70pxs Flow_14abzg6 + + + + + Flow_15yh4zu + Flow_1u81jlq + @@ -50,14 +55,13 @@ - - - - + + + diff --git a/laws-modules/src/main/resources/bpmn/测试流程_重新分发子流程.bpmn b/laws-modules/src/main/resources/bpmn/测试流程_重新分发子流程.bpmn index fc651e28..e88c7039 100644 --- a/laws-modules/src/main/resources/bpmn/测试流程_重新分发子流程.bpmn +++ b/laws-modules/src/main/resources/bpmn/测试流程_重新分发子流程.bpmn @@ -21,18 +21,21 @@ Flow_0aofle0 - - Flow_0y71vm8 - Flow_0wenf4n - ${unallocatedQuantity > 0} - - + + + + + + + Flow_0y71vm8 + Flow_0wenf4n + @@ -43,10 +46,6 @@ - - - - @@ -56,6 +55,9 @@ + + +