From 00ad42b44862742b6ff6855b0f78ceae5872381c Mon Sep 17 00:00:00 2001 From: pengqiang Date: Mon, 15 Nov 2021 11:12:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/ActProcInsController.java | 2 +- .../work/service/ActListenerService.java | 76 ++++++++++++------- .../palmte/work/service/ActModelService.java | 14 +++- .../work/service/ActProcInsService.java | 19 +++-- .../work/service/ActTaskDefService.java | 57 +++++++------- .../work/service/ProjectInstanceService.java | 6 +- .../service/ProjectTaskRecordService.java | 6 +- .../java/cn/palmte/work/utils/ActUtil.java | 14 ++++ 8 files changed, 115 insertions(+), 79 deletions(-) diff --git a/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java b/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java index c0bbd04..3cb6a07 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java @@ -94,7 +94,7 @@ public class ActProcInsController extends BaseController { variables.put(ActConstant.START_PROCESS_USERID, InterfaceUtil.getAdminId()); String procInsId = null; try { - procInsId = actProcInsService.startProcessInstance(procDefKey, variables); + procInsId = actProcInsService.startProcessInstance(procDefKey, "", variables); } catch (Exception e) { logger.error("", e); return ResponseMsg.buildFailedMsg("流程启动失败:" + e.getMessage()); diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java index 1b35b6c..3a44ddd 100644 --- a/src/main/java/cn/palmte/work/service/ActListenerService.java +++ b/src/main/java/cn/palmte/work/service/ActListenerService.java @@ -2,9 +2,13 @@ package cn.palmte.work.service; import cn.palmte.work.config.activiti.ActConstant; +import cn.palmte.work.utils.ActUtil; import com.alibaba.fastjson.JSONObject; +import org.activiti.engine.RuntimeService; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.runtime.ProcessInstanceQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -30,14 +34,20 @@ public class ActListenerService { @Autowired private ProjectInstanceService projectInstanceService; + @Autowired + private RuntimeService runtimeService; + + @Autowired + private ActUtil actUtil; + /** - * 节点创建监听 动态设置审批人 + * 任务节点创建后监听 动态设置审批人 * * @param delegateTask * @throws Exception */ public void create(DelegateTask delegateTask) throws Exception { - logger.info("--- {}", JSONObject.toJSONString(delegateTask)); + logger.info("--节点创建后监听-- name:{}, {}", delegateTask.getName(), JSONObject.toJSONString(delegateTask)); String procDefId = delegateTask.getProcessDefinitionId(); String procInsId = delegateTask.getProcessInstanceId(); @@ -45,41 +55,53 @@ public class ActListenerService { List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); logger.info("addCandidateUsers : {}", candidateUsers); - - Object projectIdObj = delegateTask.getVariable(ActConstant.KEY_PROJECT_ID); - logger.info("projectIdObj : {}", projectIdObj); - - if (candidateUsers != null && !candidateUsers.isEmpty() && projectIdObj != null) { - try { - int adminId = Integer.parseInt(candidateUsers.get(0)); - projectInstanceService.updateApprover((Integer) projectIdObj, adminId); - } catch (Exception e) { - logger.error("", e); - } + ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); + List list = processInstanceQuery.list(); + System.out.println(list); + ProcessInstance processInstance = processInstanceQuery.processInstanceId(delegateTask.getProcessInstanceId()).singleResult(); + if (actUtil.isProjectProcessIns(processInstance)) { + updateProjectApprover(candidateUsers, processInstance); } delegateTask.addCandidateUsers(candidateUsers); } - /*public void multiTaskcreate(DelegateTask delegateTask) throws Exception { - logger.info("--- {}", JSONObject.toJSONString(delegateTask)); - - String procDefId = delegateTask.getProcessDefinitionId(); - String procInsId = delegateTask.getProcessInstanceId(); - String taskDefKey = delegateTask.getTaskDefinitionKey(); - Set candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); - logger.info("addCandidateUsers : {}", candidateUsers); - delegateTask.addCandidateUsers(candidateUsers); - }*/ - - - public List multipleInstanceTask(DelegateExecution delegateExecution) throws Exception { + /** + * 多实例任务查询办理人 + * + * @param delegateExecution + * @throws Exception + */ + public List getMultiCandidateUsers(DelegateExecution delegateExecution) throws Exception { + logger.info("--多实例任务查询办理人-- eventName:{}, {}", delegateExecution.getEventName(), delegateExecution); String procInsId = delegateExecution.getProcessInstanceId(); String procDefId = delegateExecution.getProcessDefinitionId(); String taskDefKey = delegateExecution.getCurrentActivityId(); - return actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + logger.info("--getMultiCandidateUsers-- {}", candidateUsers); + return candidateUsers; } + + /** + * 更新项目审批人 四算业务需要 + * + * @param candidateUsers + * @param processInstance + */ + private void updateProjectApprover(List candidateUsers, ProcessInstance processInstance) { + String businessKey = processInstance.getBusinessKey(); + logger.info("businessKey : {}", businessKey); + + if (candidateUsers != null && !candidateUsers.isEmpty() && businessKey != null) { + try { + int adminId = Integer.parseInt(candidateUsers.get(0)); + projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId); + } catch (Exception e) { + logger.error("", e); + } + } + } } diff --git a/src/main/java/cn/palmte/work/service/ActModelService.java b/src/main/java/cn/palmte/work/service/ActModelService.java index e5aa4e4..ade2cb9 100644 --- a/src/main/java/cn/palmte/work/service/ActModelService.java +++ b/src/main/java/cn/palmte/work/service/ActModelService.java @@ -114,6 +114,7 @@ public class ActModelService { BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); BpmnModel model = jsonConverter.convertToBpmnModel(modelNode); + //任务创建后监听器 ActivitiListener activitiListener = new ActivitiListener(); activitiListener.setEvent(TaskListener.EVENTNAME_CREATE); activitiListener.setImplementation("${actListenerService.create(task)}"); @@ -135,20 +136,25 @@ public class ActModelService { taskDef = new ActTaskDef(); taskDef.setTaskName(element.getName()); taskDef.setTaskKey(element.getId()); + MultiInstanceLoopCharacteristics loopCharacteristics = userTaskElement.getLoopCharacteristics(); - if (loopCharacteristics != null) { - taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE); - loopCharacteristics.setInputDataItem("${actListenerService.multipleInstanceTask(execution)}"); + if (loopCharacteristics != null) { //多实列 + loopCharacteristics.setInputDataItem("${actListenerService.getMultiCandidateUsers(execution)}"); loopCharacteristics.setElementVariable("assignee"); userTaskElement.setAssignee("${assignee}"); + + taskDef.setTaskType(ActConstant.TASK_TYPE_MULTI); }else { userTaskElement.setTaskListeners(activitiListenerList); + + taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE); } - if (i == 1) { + if (i == 1) {//画流程图时,要保证第一个用户任务一定要先画 taskDef.setTaskIndex(ActConstant.TASK_INDEX_FIRST_USER_TASK); first = taskDef; } + taskList.add(taskDef); } i ++; diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index 6ac7e85..891650b 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -2,6 +2,7 @@ package cn.palmte.work.service; import cn.palmte.work.bean.ApproveStatusEnum; +import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.model.ActTaskDefRepository; import cn.palmte.work.pojo.ActProcIns; import cn.palmte.work.utils.ActUtil; @@ -71,7 +72,7 @@ public class ActProcInsService { * @param variables * @return */ - public String startProcessInstance(String procDefKey, Map variables) throws Exception { + public String startProcessInstance(String procDefKey, String businessKey, Map variables) throws Exception { List list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(procDefKey).active().orderByProcessDefinitionVersion().desc().list(); if (list == null || list.isEmpty()) { throw new Exception("procDefKey(" + procDefKey + ")未定义"); @@ -80,8 +81,10 @@ public class ActProcInsService { //取最新版本的流程定义进行启动流程实列 ProcessDefinition processDefinition = list.get(0); + String adminId = InterfaceUtil.getAdminId() + ""; + variables.put(ActConstant.START_PROCESS_USERID, adminId); //启动流程 - ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variables); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), businessKey, variables); String procInsId = processInstance.getProcessInstanceId(); Task task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult(); @@ -90,18 +93,18 @@ public class ActProcInsService { } //设置发起人为办理人 然后完成任务 任务转入下一个审批节点 - String assignee = InterfaceUtil.getAdminId() + ""; - task.setAssignee(assignee); + task.setAssignee(adminId); String taskId = task.getId(); String comment = "提交" + processDefinition.getName(); - Authentication.setAuthenticatedUserId(assignee); + Authentication.setAuthenticatedUserId(adminId); taskService.addComment(taskId, procInsId, comment); taskService.complete(taskId); - actTaskDefRepository.updateHiTaskAssign(assignee, procInsId, taskId); - actTaskDefRepository.updateHiActAssign(assignee, procInsId, taskId); - projectTaskRecordService.saveTaskRecord(task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment); + if (actUtil.isProjectProcessIns(processInstance)) { + projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()), + task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment); + } return processInstance.getId(); } diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java index d55c265..82bf297 100644 --- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java +++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject; import org.activiti.engine.*; import org.activiti.engine.impl.identity.Authentication; import org.activiti.engine.impl.persistence.entity.TaskEntity; +import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -42,6 +43,8 @@ public class ActTaskDefService { private ActUtil actUtil; @Autowired private ProjectInstanceService projectInstanceService; + @Autowired + private RuntimeService runtimeService; /** @@ -63,22 +66,22 @@ public class ActTaskDefService { Authentication.setAuthenticatedUserId(userId); taskService.addComment(taskId, procInsId, message); - actTaskDefRepository.updateHiTaskAssign(userId, procInsId, taskId); - actTaskDefRepository.updateHiActAssign(userId, procInsId, taskId); - Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(currentTask.getProcessDefinitionId(), currentTask.getTaskDefinitionKey()); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult(); + taskService.setAssignee(taskId, userId); if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) { - //或签处理 - handleSinge(taskId, procInsId, type, userId, actTaskDef); + handleSinge(processInstance, taskId, type, actTaskDef); } else if (ActConstant.TASK_TYPE_MULTI == actTaskDef.getTaskType()) { - //会签处理 - handleMulti(taskId, procInsId, type, userId, actTaskDef); + //多实列 会签处理 + handleMulti(processInstance, taskId, type, actTaskDef); } - //保存审批记录 - projectTaskRecordService.saveTaskRecord(currentTask, type, message); + if (actUtil.isProjectProcessIns(processInstance)) { + //保存审批记录 + projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()), currentTask, type, message); + } } @@ -105,27 +108,24 @@ public class ActTaskDefService { * 会签处理 * * @param taskId - * @param procInsId + * @param processInstance * @param type - * @param userId * @param actTaskDef */ - private void handleMulti(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { - /* Double instanceCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_INSTANCES))); //会签任务总数 - Double instanceActiveCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_ACTIVE_INSTANCES))); //活动的会签任务数 - Double instanceCompleteCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_COMPLETED_INSTANCES))); //完成会签任务数*/ - + private void handleMulti(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) { if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) { //一个人驳回 整个任务节点驳回 - List taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); + List taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); for (int i = 0; i < taskList.size(); i++) { TaskEntity taskEntity = (TaskEntity) taskList.get(i); if (!taskId.equals(taskEntity.getId())) { - taskEntity.setProcessInstanceId(null); + /* taskEntity.setProcessInstanceId(null); taskEntity.setExecutionId(null); - taskService.saveTask(taskEntity); - taskService.addComment(taskEntity.getId(), procInsId, "会签驳回,任务失效"); - taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录 + taskService.saveTask(taskEntity);*/ + + taskService.addComment(taskEntity.getId(), processInstance.getId(), "会签驳回,任务自动失效"); + taskService.complete(taskEntity.getId()); + //taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录 } } @@ -141,21 +141,19 @@ public class ActTaskDefService { * 或签处理 * * @param taskId - * @param procInsId + * @param processInstance * @param type - * @param userId * @param actTaskDef */ - private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { + private void handleSinge(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) { if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) { //审批通过 - taskService.setAssignee(taskId, userId); taskService.complete(taskId); //执行配置的审批通过脚本 int endScript = actTaskDef.getEndScript(); if (endScript != 0) { - actUtil.invokeEventScript(endScript, procInsId, actTaskDef); + actUtil.invokeEventScript(endScript, processInstance.getId(), actTaskDef); } else { logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName()); } @@ -168,15 +166,14 @@ public class ActTaskDefService { //执行配置的驳回脚本 int rollbackScript = actTaskDef.getRollbackScript(); if (rollbackScript != 0) { - actUtil.invokeEventScript(rollbackScript, procInsId, actTaskDef); + actUtil.invokeEventScript(rollbackScript, processInstance.getId(), actTaskDef); } else { logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName()); } - int projectId = actUtil.getProjectId(procInsId); - if (projectId > 0) { - projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); + if (actUtil.isProjectProcessIns(processInstance)) { + projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); } } } diff --git a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java index e81ec79..ef361a4 100644 --- a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java +++ b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java @@ -89,11 +89,9 @@ public class ProjectInstanceService { private void startProcess(Project project, Admin admin, String processDefkey) throws Exception { HashMap variables = new HashMap<>(); - variables.put(ActConstant.START_PROCESS_USERID, admin.getId()); - variables.put(ActConstant.KEY_PROJECT_ID, project.getId()); variables.put(ActConstant.KEY_PROJECT_TYPE, project.getType()); - - String processInstanceId = actProcInsService.startProcessInstance(processDefkey, variables); + String businessKey = String.valueOf(project.getId()); + String processInstanceId = actProcInsService.startProcessInstance(processDefkey, businessKey, variables); //保存流程实例id与项目的关联关系 ProjectInstanceRelation relation = new ProjectInstanceRelation(); diff --git a/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java index 4b34640..377dbb1 100644 --- a/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java +++ b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java @@ -36,11 +36,7 @@ public class ProjectTaskRecordService { * @param status * @param comment */ - public void saveTaskRecord(Task task, int status, String comment) { - int projectId = actUtil.getProjectId(task.getProcessInstanceId()); - if (projectId == 0) { - return; - } + public void saveTaskRecord(int projectId, Task task, int status, String comment) { task.getProcessDefinitionId(); ProjectTaskRecord record = new ProjectTaskRecord(); record.setProjectId(projectId); diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index 6e84c00..27a4fac 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -13,6 +13,8 @@ import org.activiti.engine.ManagementService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.Task; import org.activiti.image.ProcessDiagramGenerator; @@ -249,6 +251,18 @@ public class ActUtil { } + public boolean isProjectProcessIns(ProcessInstance processInstance) { + if (processInstance == null) { + return false; + } + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult(); + String procDefKey = processDefinition.getKey(); + return procDefKey.equals(ActConstant.PROCESS_DEFKEY_ESTIMATE) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_BUDGET) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_SETTLE) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_FINAL); + } + /** * 生成xml流