package org.springblade.flow.base.util;

import org.springframework.stereotype.Component;

/**
 * @author LoveMyOrange
 * @create 2022-01-14 13:58
 * @desc
 *  利用PVM 实现对 流程的跳转 驳回  但实际上 此Util 却做到了  业务要求正确 逻辑数据错误   此不能真正作为流程跳转的标准使用
 */
@Component
public class PVMJumpUtils {

//    @Resource
//    private TaskService taskService;
//    @Resource
//    private RuntimeService runtimeService;
//    @Resource
//    private RepositoryService repositoryService;
//
//    @Transactional(rollbackFor = Exception.class)
//    public synchronized void  goProcessTaskNode(String taskId, String nextTaskId, Map<String, Object> variables) throws Exception {
//        List<Task> taskList = findTaskListByKey(findProcessInstanceByTaskId(taskId).getId(), findTaskById(taskId).getTaskDefinitionKey());
//        for (Task task : taskList) {
//            if(taskId.equals(task.getId())){
//                commitProcess(task.getId(), variables, nextTaskId);
//            }
//        }
//    }
//
//
//    /**
//     * 根据流程实例ID和任务key值查询所有同级任务集合
//     *
//     * @param processInstanceId
//     * @param key
//     * @return
//     */
//    private  List<Task> findTaskListByKey(String processInstanceId, String key) {
//        return taskService.createTaskQuery().processInstanceId(
//                processInstanceId).taskDefinitionKey(key).list();
//    }
//
//
//    /**
//     * 根据任务ID获取对应的流程实例
//     *
//     * @param taskId
//     *            任务ID
//     * @return
//     * @throws Exception
//     */
//    public ProcessInstance findProcessInstanceByTaskId(String taskId)
//            throws Exception {
//        // 找到流程实例
//        ProcessInstance processInstance = runtimeService
//                .createProcessInstanceQuery().processInstanceId(
//                        findTaskById(taskId).getProcessInstanceId())
//                .singleResult();
//        if (processInstance == null) {
//            throw new Exception("流程实例未找到!");
//        }
//        return processInstance;
//    }
//
//    /**
//     * 根据任务ID获得任务实例
//     *
//     * @param taskId
//     *            任务ID
//     * @return
//     * @throws Exception
//     */
//    private TaskEntity findTaskById(String taskId) throws Exception {
//        TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(taskId).singleResult();
//        if (task == null) {
//            throw new Exception("任务实例未找到!");
//        }
//        return task;
//    }
//
//    /**
//     * @param taskId
//     *            当前任务ID
//     * @param variables
//     *            流程变量
//     * @param activityId
//     *            流程转向执行任务节点ID<br>
//     *            此参数为空，默认为提交操作
//     * @throws Exception
//     */
//    private  void commitProcess(String taskId, Map<String, Object> variables,String activityId) throws Exception {
//
//        // 跳转节点为空，默认提交操作
//        if (StrUtil.isEmpty(activityId)) {
//            taskService.complete(taskId, variables);
//        } else {// 流程转向操作
//            turnTransition(taskId, activityId, variables);
//        }
//    }
//
//
//    /**
//     * 流程转向操作
//     *
//     * @param taskId
//     *            当前任务ID
//     * @param activityId
//     *            目标节点任务ID
//     * @param variables
//     *            流程变量
//     * @throws Exception
//     */
//    private  void turnTransition(String taskId, String activityId,
//                                 Map<String, Object> variables) throws Exception {
//        // 当前节点
//        ActivityImpl currActivity = findActivitiImpl(taskId, null);
//
//        // 清空当前流向
//        List<PvmTransition> oriPvmTransitionList = clearTransition(currActivity);
//
//        // 创建新流向
//        TransitionImpl newTransition = currActivity.createOutgoingTransition();
//        // 目标节点
//        ActivityImpl pointActivity = findActivitiImpl(taskId, activityId);
//        try {
//            // 设置新流向的目标节点
//            newTransition.setDestination(pointActivity);
//
//            // 多分支模式，点击button动态给选择分支加监听
//            //List<PvmTransition> pvmTransitionList = currActivity.getOutgoingTransitions();
//            for(PvmTransition pv:oriPvmTransitionList){
//                if(activityId.equals(pv.getDestination().getId())){
//                    TransitionImpl tra = (TransitionImpl) pv;
//                    if(tra.getExecutionListeners()!=null && tra.getExecutionListeners().size()>0){
//                        newTransition.setExecutionListeners(tra.getExecutionListeners());
//                    }
//                    break;
//                }
//            }
//
//            // 执行转向任务
//            taskService.complete(taskId, variables);
//        } catch (Exception e) {
//            throw e;
//        } finally{
//            // 删除目标节点新流入
//            pointActivity.getIncomingTransitions().remove(newTransition);
//
//            // 还原以前流向
//            restoreTransition(currActivity, oriPvmTransitionList);
//        }
//    }
//
//
//    /**
//     * 根据任务ID和节点ID获取活动节点 <br>
//     *
//     * @param taskId
//     *            任务ID
//     * @param activityId
//     *            活动节点ID <br>
//     *            如果为null或""，则默认查询当前活动节点 <br>
//     *            如果为"end"，则查询结束节点 <br>
//     *
//     * @return
//     * @throws Exception
//     */
//    private  ActivityImpl findActivitiImpl(String taskId, String activityId)
//            throws Exception {
//        // 取得流程定义
//        ProcessDefinitionEntity processDefinition = findProcessDefinitionEntityByTaskId(taskId);
//
//        // 获取当前活动节点ID
//        if (StrUtil.isEmpty(activityId)) {
//            activityId = findTaskById(taskId).getTaskDefinitionKey();
//        }
//
//        // 根据流程定义，获取该流程实例的结束节点
//        if (activityId.toUpperCase().equals("END")) {
//            for (ActivityImpl activityImpl : processDefinition.getActivities()) {
//                List<PvmTransition> pvmTransitionList = activityImpl
//                        .getOutgoingTransitions();
//                if (pvmTransitionList.isEmpty()) {
//                    return activityImpl;
//                }
//            }
//        }
//
//        // 根据节点ID，获取对应的活动节点
//        ActivityImpl activityImpl = ((ProcessDefinitionImpl) processDefinition)
//                .findActivity(activityId);
//
//        return activityImpl;
//    }
//
//
//    /**
//     * 根据任务ID获取流程定义
//     *
//     * @param taskId
//     *            任务ID
//     * @return
//     * @throws Exception
//     */
//    public  ProcessDefinitionEntity findProcessDefinitionEntityByTaskId(
//            String taskId) throws Exception {
//        // 取得流程定义
//        ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
//                .getDeployedProcessDefinition(findTaskById(taskId)
//                        .getProcessDefinitionId());
//
//        if (processDefinition == null) {
//            throw new Exception("流程定义未找到!");
//        }
//
//        return processDefinition;
//    }
//
//
//    /**
//     * 清空指定活动节点流向
//     *
//     * @param activityImpl
//     *            活动节点
//     * @return 节点流向集合
//     */
//    private  List<PvmTransition> clearTransition(ActivityImpl activityImpl) {
//        // 存储当前节点所有流向临时变量
//        List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
//        // 获取当前节点所有流向，存储到临时变量，然后清空
//        List<PvmTransition> pvmTransitionList = activityImpl
//                .getOutgoingTransitions();
//        for (PvmTransition pvmTransition : pvmTransitionList) {
//            oriPvmTransitionList.add(pvmTransition);
//        }
//        pvmTransitionList.clear();
//
//        return oriPvmTransitionList;
//    }
//
//    /**
//     * 	还原指定活动节点流向
//     *
//     * @param activityImpl
//     *  	活动节点
//     * @param oriPvmTransitionList
//     * 	原有节点流向集合
//     */
//    private  void restoreTransition(ActivityImpl activityImpl,
//                                    List<PvmTransition> oriPvmTransitionList) {
//        // 清空现有流向
//        List<PvmTransition> pvmTransitionList = activityImpl
//                .getOutgoingTransitions();
//        pvmTransitionList.clear();
//        // 还原以前流向
//        for (PvmTransition pvmTransition : oriPvmTransitionList) {
//            pvmTransitionList.add(pvmTransition);
//        }
//    }

}
