Example #1
0
  /** 校验目标节点是否可以回退. */
  public boolean validateTargetActivity(String targetActivityId) {
    JdbcTemplate jdbcTemplate = ApplicationContextHelper.getBean(JdbcTemplate.class);
    String historyTaskId =
        jdbcTemplate.queryForObject(
            "select id_ from ACT_HI_TASKINST where act_id_=? order by END_TIME_ desc",
            String.class,
            targetActivityId);

    // 先找到历史任务
    HistoricTaskInstanceEntity historicTaskInstanceEntity =
        Context.getCommandContext()
            .getHistoricTaskInstanceEntityManager()
            .findHistoricTaskInstanceById(historyTaskId);

    // 再反向查找历史任务对应的历史节点
    HistoricActivityInstanceEntity historicActivityInstanceEntity =
        getHistoricActivityInstanceEntity(historyTaskId);

    logger.info("historic activity instance is : {}", historicActivityInstanceEntity.getId());

    Graph graph =
        new ActivitiHistoryGraphBuilder(historicTaskInstanceEntity.getProcessInstanceId()).build();

    Node node = graph.findById(historicActivityInstanceEntity.getId());

    if (!this.checkCouldRollback(node)) {
      logger.info("cannot rollback {}", taskId);

      return false;
    }

    return true;
  }
Example #2
0
  /** 根据任务历史,创建待办任务. */
  public void processHistoryTask(
      HistoricTaskInstanceEntity historicTaskInstanceEntity,
      HistoricActivityInstanceEntity historicActivityInstanceEntity) {
    /*
     * historicTaskInstanceEntity.setEndTime(null); historicTaskInstanceEntity.setDurationInMillis(null);
     * historicActivityInstanceEntity.setEndTime(null); historicActivityInstanceEntity.setDurationInMillis(null);
     */

    // 创建新任务
    TaskEntity task = TaskEntity.create(new Date());
    task.setProcessDefinitionId(historicTaskInstanceEntity.getProcessDefinitionId());
    // task.setId(historicTaskInstanceEntity.getId());
    // task.setAssigneeWithoutCascade(historicTaskInstanceEntity.getAssignee());
    task.setAssigneeWithoutCascade(this.userId);
    task.setParentTaskIdWithoutCascade(historicTaskInstanceEntity.getParentTaskId());
    task.setNameWithoutCascade(historicTaskInstanceEntity.getName());
    task.setTaskDefinitionKey(historicTaskInstanceEntity.getTaskDefinitionKey());
    task.setExecutionId(historicTaskInstanceEntity.getExecutionId());
    task.setPriority(historicTaskInstanceEntity.getPriority());
    task.setProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
    task.setExecutionId(historicTaskInstanceEntity.getExecutionId());
    task.setDescriptionWithoutCascade(historicTaskInstanceEntity.getDescription());
    task.setTenantId(historicTaskInstanceEntity.getTenantId());

    Context.getCommandContext().getTaskEntityManager().insert(task);

    // 把流程指向任务对应的节点
    ExecutionEntity executionEntity =
        Context.getCommandContext()
            .getExecutionEntityManager()
            .findExecutionById(historicTaskInstanceEntity.getExecutionId());
    executionEntity.setActivity(getActivity(historicActivityInstanceEntity));

    // 创建HistoricActivityInstance
    Context.getCommandContext().getHistoryManager().recordActivityStart(executionEntity);

    // 创建HistoricTaskInstance
    Context.getCommandContext().getHistoryManager().recordTaskCreated(task, executionEntity);
    Context.getCommandContext().getHistoryManager().recordTaskId(task);
    // 更新ACT_HI_ACTIVITY里的assignee字段
    Context.getCommandContext().getHistoryManager().recordTaskAssignment(task);

    try {
      // humanTask
      this.createHumanTask(task, historicTaskInstanceEntity);
    } catch (Exception ex) {
      logger.error(ex.getMessage(), ex);
    }
  }
  /**
   * 撤销流程.
   *
   * @return 0-撤销成功 1-流程结束 2-下一结点已经通过,不能撤销
   */
  public Integer execute(CommandContext commandContext) {
    // 获得历史任务
    HistoricTaskInstanceEntity historicTaskInstanceEntity =
        Context.getCommandContext()
            .getHistoricTaskInstanceEntityManager()
            .findHistoricTaskInstanceById(historyTaskId);

    // 获得历史节点
    HistoricActivityInstanceEntity historicActivityInstanceEntity =
        getHistoricActivityInstanceEntity(historyTaskId);

    Graph graph =
        new ActivitiHistoryGraphBuilder(historicTaskInstanceEntity.getProcessInstanceId()).build();

    Node node = graph.findById(historicActivityInstanceEntity.getId());

    if (!checkCouldWithdraw(node)) {
      logger.info("cannot withdraw {}", historyTaskId);

      return 2;
    }

    // 删除所有活动中的task
    this.deleteActiveTasks(historicTaskInstanceEntity.getProcessInstanceId());

    // 获得期望撤销的节点后面的所有节点历史
    List<String> historyNodeIds = new ArrayList<String>();
    this.collectNodes(node, historyNodeIds);
    this.deleteHistoryActivities(historyNodeIds);
    // 恢复期望撤销的任务和历史
    this.processHistoryTask(historicTaskInstanceEntity, historicActivityInstanceEntity);

    logger.info("activiti is withdraw {}", historicTaskInstanceEntity.getName());

    return 0;
  }
  public void processHistoryTask(
      HistoricTaskInstanceEntity historicTaskInstanceEntity,
      HistoricActivityInstanceEntity historicActivityInstanceEntity) {
    historicTaskInstanceEntity.setEndTime(null);
    historicTaskInstanceEntity.setDurationInMillis(null);
    historicActivityInstanceEntity.setEndTime(null);
    historicActivityInstanceEntity.setDurationInMillis(null);

    TaskEntity task = TaskEntity.create(new Date());
    task.setProcessDefinitionId(historicTaskInstanceEntity.getProcessDefinitionId());
    task.setId(historicTaskInstanceEntity.getId());
    task.setAssigneeWithoutCascade(historicTaskInstanceEntity.getAssignee());
    task.setParentTaskIdWithoutCascade(historicTaskInstanceEntity.getParentTaskId());
    task.setNameWithoutCascade(historicTaskInstanceEntity.getName());
    task.setTaskDefinitionKey(historicTaskInstanceEntity.getTaskDefinitionKey());
    task.setExecutionId(historicTaskInstanceEntity.getExecutionId());
    task.setPriority(historicTaskInstanceEntity.getPriority());
    task.setProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
    task.setDescriptionWithoutCascade(historicTaskInstanceEntity.getDescription());
    task.setTenantId(historicTaskInstanceEntity.getTenantId());

    Context.getCommandContext().getTaskEntityManager().insert(task);

    try {
      HumanTaskConnector humanTaskConnector =
          ApplicationContextHelper.getBean(HumanTaskConnector.class);
      // humantask
      humanTaskConnector.removeHumanTaskByTaskId(historicTaskInstanceEntity.getId());
      this.createHumanTask(task);
    } catch (Exception ex) {
      logger.error(ex.getMessage(), ex);
    }

    ExecutionEntity executionEntity =
        Context.getCommandContext()
            .getExecutionEntityManager()
            .findExecutionById(historicTaskInstanceEntity.getExecutionId());
    executionEntity.setActivity(getActivity(historicActivityInstanceEntity));
  }
Example #5
0
  /**
   * 退回流程.
   *
   * @return true success, false failure
   */
  public Boolean execute(CommandContext commandContext) {
    // 初始化当前的起点信息
    this.initSource();

    // 找到回退的目标节点
    String targetActivityId = this.findTargetActivityId();

    if (targetActivityId == null) {
      logger.info("cannot find targetActivity for : {}", this.taskId);

      return Boolean.FALSE;
    }

    /*
     * // 尝试查找最近的上游userTask String historyTaskId = this.findNearestUserTask();
     * logger.info("nearest history user task is : {}", historyTaskId);
     *
     * if (historyTaskId == null) { logger.info("cannot rollback {}", taskId);
     *
     * return "activity"; }
     */

    // 校验这个节点是否可以回退
    boolean isValid = this.validateTargetActivity(targetActivityId);

    if (!isValid) {
      logger.info("cannot rollback for : {} to {}", this.taskId, targetActivityId);

      return Boolean.FALSE;
    }

    JdbcTemplate jdbcTemplate = ApplicationContextHelper.getBean(JdbcTemplate.class);
    String historyTaskId =
        jdbcTemplate.queryForObject(
            "select id_ from ACT_HI_TASKINST where act_id_=? order by END_TIME_ desc",
            String.class,
            targetActivityId);
    HistoricTaskInstanceEntity historicTaskInstanceEntity =
        Context.getCommandContext()
            .getHistoricTaskInstanceEntityManager()
            .findHistoricTaskInstanceById(historyTaskId);
    HistoricActivityInstanceEntity historicActivityInstanceEntity =
        getHistoricActivityInstanceEntity(historyTaskId);

    // 开始回退
    if (this.isSameBranch(historicTaskInstanceEntity)) {
      // 如果退回的目标节点的executionId与当前task的executionId一样,说明是同一个分支
      // 只删除当前分支的task
      this.deleteActiveTask();
    } else {
      // 否则认为是从分支跳回主干
      // 删除所有活动中的task
      this.deleteActiveTasks(historicTaskInstanceEntity.getProcessInstanceId());

      // 获得期望退回的节点后面的所有节点历史
      List<String> historyNodeIds = new ArrayList<String>();
      Graph graph =
          new ActivitiHistoryGraphBuilder(historicTaskInstanceEntity.getProcessInstanceId())
              .build();

      Node node = graph.findById(historicActivityInstanceEntity.getId());
      this.collectNodes(node, historyNodeIds);
      this.deleteHistoryActivities(historyNodeIds);
    }

    // 恢复期望退回的任务和历史
    this.processHistoryTask(historicTaskInstanceEntity, historicActivityInstanceEntity);

    logger.info("activiti is rollback {}", historicTaskInstanceEntity.getName());

    return Boolean.TRUE;
  }