package com.hotent.runtime.utils; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StopWatch; import com.hotent.base.exception.BaseException; import com.hotent.base.exception.WorkFlowException; import com.hotent.base.util.AppUtil; import com.hotent.base.util.BeanUtils; import com.hotent.base.util.StringUtil; import com.hotent.base.util.string.StringPool; import com.hotent.bpm.api.constant.NodeType; import com.hotent.bpm.api.model.identity.BpmIdentity; import com.hotent.bpm.api.model.process.def.BpmProcessDef; import com.hotent.bpm.api.model.process.def.BpmProcessDefExt; import com.hotent.bpm.api.model.process.def.NodeProperties; import com.hotent.bpm.api.model.process.inst.BpmProcessInstance; import com.hotent.bpm.api.model.process.nodedef.BpmNodeDef; import com.hotent.bpm.api.model.process.nodedef.NodeInMulti; import com.hotent.bpm.api.model.process.nodedef.ext.CallActivityNodeDef; import com.hotent.bpm.api.model.process.nodedef.ext.SubProcessNodeDef; import com.hotent.bpm.api.model.process.nodedef.ext.extmodel.Button; import com.hotent.bpm.api.model.process.task.BpmTask; import com.hotent.bpm.api.service.BpmDefinitionAccessor; import com.hotent.bpm.api.service.BpmSignDataService; import com.hotent.bpm.persistence.manager.BpmProStatusManager; import com.hotent.bpm.persistence.manager.BpmProcessInstanceManager; import com.hotent.bpm.persistence.manager.BpmTaskManager; import com.hotent.bpm.persistence.model.DefaultBpmTask; import com.hotent.bpm.persistence.util.BpmStackRelationUtil; import com.hotent.bpm.util.BpmUtil; import com.hotent.runtime.params.TaskToRejectVo; /** * 驳回相关 * @author jason */ public class RejectUtil { private static Logger logger = LoggerFactory.getLogger(RejectUtil.class); /** * 驳回构建 获取可驳回的节点需要按照顺序最近当前任务的节点放到数组中 * * @param taskId * @param backMode * @return * @throws Exception */ public static TaskToRejectVo toReject(String taskId, String backMode) throws Exception { BpmTaskManager bpmTaskManager = AppUtil.getBean(BpmTaskManager.class); BpmDefinitionAccessor bpmDefinitionAccessor = (BpmDefinitionAccessor) AppUtil.getBean("bpmDefinitionAccessor"); boolean canRejectToStart = false; // 是否可以驳回发起人 boolean canRejectToAnyNode = false; // 是否可以驳回指定节点 boolean canReject = false; // 是否可以驳回 boolean canRejectPreAct = false; // 是否可以驳回到上一步 String rejectRecallMode = Button.REJECT_RECALL_MODE; // 驳回重提模式 String defaultRejectMode = Button.DEFAULT_REJECT_MODE; // 默认选中的驳回模式 String defaultRejectRecallMode = Button.DEFAULT_REJECT_RECALL_MODE; // 默认选中的驳回重提模式 DefaultBpmTask task = bpmTaskManager.get(taskId); if (BeanUtils.isEmpty(task)) { throw new WorkFlowException("当前任务已办理,不可重复办理!"); } checkTargetNode(null,task); String defId = task.getProcDefId(); String nodeId = task.getNodeId(); BpmNodeDef taskNodeDef = bpmDefinitionAccessor.getBpmNodeDef(defId, nodeId); BpmProcessDef bpmProcessDef = bpmDefinitionAccessor.getBpmProcessDef(defId); List