Package com.thinkgem.jeesite.modules.sys.service.workflow

Source Code of com.thinkgem.jeesite.modules.sys.service.workflow.WorkflowTraceService

package com.thinkgem.jeesite.modules.sys.service.workflow;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.thinkgem.jeesite.common.service.BaseService;
import com.thinkgem.jeesite.common.workflow.WorkflowUtils;

/**
* 工作流跟踪相关Service
* @author HenryYan
*/
@Service
public class WorkflowTraceService extends BaseService {

  @Autowired
  protected RuntimeService runtimeService;

  @Autowired
  protected TaskService taskService;

  @Autowired
  protected RepositoryService repositoryService;

  @Autowired
  protected IdentityService identityService;

  /**
   * 流程跟踪图
   * @param processInstanceId    流程实例ID
   * @return  封装了各种节点信息
   */
  public List<Map<String, Object>> traceProcess(String processInstanceId) throws Exception {
    Execution execution = runtimeService.createExecutionQuery().executionId(processInstanceId).singleResult();//执行实例
    Object property = PropertyUtils.getProperty(execution, "activityId");
    String activityId = "";
    if (property != null) {
      activityId = property.toString();
    }
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId)
        .singleResult();
    ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
        .getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
    List<ActivityImpl> activitiList = processDefinition.getActivities();//获得当前任务的所有节点

    List<Map<String, Object>> activityInfos = new ArrayList<Map<String, Object>>();
    for (ActivityImpl activity : activitiList) {

      boolean currentActiviti = false;
      String id = activity.getId();

      // 当前节点
      if (id.equals(activityId)) {
        currentActiviti = true;
      }

      Map<String, Object> activityImageInfo = packageSingleActivitiInfo(activity, processInstance, currentActiviti);

      activityInfos.add(activityImageInfo);
    }

    return activityInfos;
  }

  /**
   * 封装输出信息,包括:当前节点的X、Y坐标、变量信息、任务类型、任务描述
   * @param activity
   * @param processInstance
   * @param currentActiviti
   * @return
   */
  private Map<String, Object> packageSingleActivitiInfo(ActivityImpl activity, ProcessInstance processInstance,
      boolean currentActiviti) throws Exception {
    Map<String, Object> vars = new HashMap<String, Object>();
    Map<String, Object> activityInfo = new HashMap<String, Object>();
    activityInfo.put("currentActiviti", currentActiviti);
    setPosition(activity, activityInfo);
    setWidthAndHeight(activity, activityInfo);

    Map<String, Object> properties = activity.getProperties();
    vars.put("任务类型", WorkflowUtils.parseToZhType(properties.get("type").toString()));

    ActivityBehavior activityBehavior = activity.getActivityBehavior();
    logger.debug("activityBehavior={}", activityBehavior);
    if (activityBehavior instanceof UserTaskActivityBehavior) {

      Task currentTask = null;

      /*
       * 当前节点的task
       */
      if (currentActiviti) {
        currentTask = getCurrentTaskInfo(processInstance);
      }

      /*
       * 当前任务的分配角色
       */
      UserTaskActivityBehavior userTaskActivityBehavior = (UserTaskActivityBehavior) activityBehavior;
      TaskDefinition taskDefinition = userTaskActivityBehavior.getTaskDefinition();
      Set<Expression> candidateGroupIdExpressions = taskDefinition.getCandidateGroupIdExpressions();
      if (!candidateGroupIdExpressions.isEmpty()) {

        // 任务的处理角色
        setTaskGroup(vars, candidateGroupIdExpressions);

        // 当前处理人
        if (currentTask != null) {
          setCurrentTaskAssignee(vars, currentTask);
        }
      }
    }

    vars.put("节点说明", properties.get("documentation"));

    String description = activity.getProcessDefinition().getDescription();
    vars.put("描述", description);

    logger.debug("trace variables: {}", vars);
    activityInfo.put("vars", vars);
    return activityInfo;
  }

  private void setTaskGroup(Map<String, Object> vars, Set<Expression> candidateGroupIdExpressions) {
    String roles = "";
    for (Expression expression : candidateGroupIdExpressions) {
      String expressionText = expression.getExpressionText();
      if (expressionText.startsWith("$")) {
        expressionText = expressionText.replace("${insuranceType}", "life");
      }
      String roleName = identityService.createGroupQuery().groupId(expressionText).singleResult().getName();
      roles += roleName;
    }
    vars.put("任务所属角色", roles);
  }

  /**
   * 设置当前处理人信息
   * @param vars
   * @param currentTask
   */
  private void setCurrentTaskAssignee(Map<String, Object> vars, Task currentTask) {
    String assignee = currentTask.getAssignee();
    if (assignee != null) {
      User assigneeUser = identityService.createUserQuery().userId(assignee).singleResult();
      String userInfo = assigneeUser.getFirstName() + " " + assigneeUser.getLastName();
      vars.put("当前处理人", userInfo);
    }
  }

  /**
   * 获取当前节点信息
   * @param processInstance
   * @return
   */
  private Task getCurrentTaskInfo(ProcessInstance processInstance) {
    Task currentTask = null;
    try {
      String activitiId = (String) PropertyUtils.getProperty(processInstance, "activityId");
      logger.debug("current activity id: {}", activitiId);

      currentTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskDefinitionKey(activitiId)
          .singleResult();
      logger.debug("current task for processInstance: {}", ToStringBuilder.reflectionToString(currentTask));

    } catch (Exception e) {
      logger.error("can not get property activityId from processInstance: {}", processInstance);
    }
    return currentTask;
  }

  /**
   * 设置宽度、高度属性
   * @param activity
   * @param activityInfo
   */
  private void setWidthAndHeight(ActivityImpl activity, Map<String, Object> activityInfo) {
    activityInfo.put("width", activity.getWidth());
    activityInfo.put("height", activity.getHeight());
  }

  /**
   * 设置坐标位置
   * @param activity
   * @param activityInfo
   */
  private void setPosition(ActivityImpl activity, Map<String, Object> activityInfo) {
    activityInfo.put("x", activity.getX());
    activityInfo.put("y", activity.getY());
  }
}
TOP

Related Classes of com.thinkgem.jeesite.modules.sys.service.workflow.WorkflowTraceService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.