diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/aspect/ProcessAspect.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/aspect/ProcessAspect.java index 7e815f3d..e422f808 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/aspect/ProcessAspect.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/aspect/ProcessAspect.java @@ -2,12 +2,14 @@ package com.jero.modules.activiti.process.aspect; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.jero.common.constant.enums.LanguageEnum; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; import com.jero.common.util.MessageUtils; import com.jero.modules.activiti.entity.ProcessAll; import com.jero.modules.activiti.entity.ProcessApprovalRecord; +import com.jero.modules.activiti.process.esinspectplan.common.EsInspectPlanCommon; import com.jero.modules.activiti.service.ProcessApprovalRecordService; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.model.Process; @@ -17,8 +19,10 @@ import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.task.Task; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @@ -26,9 +30,7 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; /** * @ClassName: 流程aop @@ -49,6 +51,8 @@ public class ProcessAspect { private RepositoryService repositoryService; @Resource private ProcessApprovalRecordService processApprovalRecordService; + private static final String PROCESS_ALL = "processAll"; + private static final List SPECIAL_NODE = Arrays.asList(EsInspectPlanCommon.PROCESS_NODE_3); // 流程审批 @Pointcut("execution(public * com.jero.modules.activiti.process..*Controller.flowApproval(..))") @@ -71,7 +75,7 @@ public class ProcessAspect { log.info("==========流程合法性校验前置方法开始=========="); if (!Objects.isNull(jp.getArgs())) { Map map = JSON.parseObject(JSON.toJSONString(jp.getArgs()[0]), Map.class); - Object object = map.get("processAll"); + Object object = map.get(PROCESS_ALL); ProcessAll processAll = JSON.parseObject(JSON.toJSONString(object), ProcessAll.class); if (checkTaskExistence(processAll.getTaskId())){ if (LanguageEnum.CN.getValue().equals(MessageUtils.getLanguage().getValue())){ @@ -99,7 +103,7 @@ public class ProcessAspect { log.info("==========流程会签节点驳回一票否决前置方法开始=========="); if (!Objects.isNull(jp.getArgs())) { Map map = JSON.parseObject(JSON.toJSONString(jp.getArgs()[0]), Map.class); - Object object = map.get("processAll"); + Object object = map.get(PROCESS_ALL); ProcessAll processAll = JSON.parseObject(JSON.toJSONString(object), ProcessAll.class); Object objectMap = map.get("map"); @@ -120,6 +124,53 @@ public class ProcessAspect { log.info("==========流程会签节点驳回一票否决前置方法结束=========="); } + @AfterReturning("processServiceFlowReject()") + public void doAfter(JoinPoint jp) { + log.info("==========流程驳回,若驳回到的节点之前经过转办,则驳回到转办人手里后置方法开始=========="); + if (!Objects.isNull(jp.getArgs())) { + Map map = JSON.parseObject(JSON.toJSONString(jp.getArgs()[0]), Map.class); + Object object = map.get(PROCESS_ALL); + ProcessAll processAll = JSON.parseObject(JSON.toJSONString(object), ProcessAll.class); + + Object objectMap = map.get("map"); + Map stringObjectMap = JSON.parseObject(JSON.toJSONString(objectMap), Map.class); + // 特殊节点排除 + if ((stringObjectMap.containsKey("pass") && !(boolean) stringObjectMap.get("pass")) && !SPECIAL_NODE.contains(processAll.getNodeId())){ + // 驳回的节点 + List processApprovalRecordList = processApprovalRecordService.list( + new LambdaQueryWrapper() + .eq(ProcessApprovalRecord::getProcessInstanceId, processAll.getProcessInstanceId()) + .orderByDesc(ProcessApprovalRecord::getCreateTime)); + if (!processApprovalRecordList.isEmpty()){ + ProcessApprovalRecord processApprovalRecord = processApprovalRecordList.get(0); + processApprovalRecordList.remove(0); + Optional optional = processApprovalRecordList.stream().filter(v -> + v.getTaskName().equals(processApprovalRecord.getTaskName()) + && v.getNodeId().equals(processApprovalRecord.getNodeId())).findFirst(); + optional.ifPresent(v -> { + // 是否转办过 + if (StringUtils.isNotBlank(v.getTransferBy())){ + // 转办给转办人 + taskService.setAssignee(processApprovalRecord.getTaskId(), v.getUserId()); + // 更新流程审批记录表 + processApprovalRecordService.update( + new LambdaUpdateWrapper() + .eq(ProcessApprovalRecord::getTaskId, processApprovalRecord.getTaskId()) + .set(ProcessApprovalRecord::getUserId, v.getUserId()) + .set(ProcessApprovalRecord::getOriginUserId, v.getUserId())); + } + }); + } + } + } + log.info("==========流程驳回,若驳回到的节点之前经过转办,则驳回到转办人手里后置方法结束=========="); + } + + /** + * 是否会签节点 + * @param taskId + * @return + */ public boolean isMultiTask(String taskId){ // 根据流程实例id查询 Task task = taskService.createTaskQuery()