All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ars.database.service.Workflows Maven / Gradle / Ivy

The newest version!
package ars.database.service;

import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import java.io.InputStream;
import java.io.IOException;

import org.activiti.engine.task.Task;
import org.activiti.engine.TaskService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.image.ProcessDiagramGenerator;

import ars.util.Beans;
import ars.database.model.Model;
import ars.database.repository.Query;
import ars.database.repository.Repositories;
import ars.database.activiti.ActivityNode;
import ars.database.activiti.ProcessConfiguration;
import ars.invoke.request.Requester;

/**
 * 工作流处理工具类
 *
 * @author wuyongqiang
 */
public final class Workflows {
    private static ProcessEngine engine;

    private Workflows() {

    }

    /**
     * 获取流程引擎对象
     *
     * @return 流程引擎对象
     */
    public static ProcessEngine getEngine() {
        if (engine == null) {
            throw new IllegalStateException("ProcessEngine not initialize");
        }
        return engine;
    }

    /**
     * 设置流程引擎对象
     *
     * @param engine 流程引擎对象
     */
    public static void setEngine(ProcessEngine engine) {
        if (engine == null) {
            throw new IllegalArgumentException("ProcessEngine must not be null");
        }
        if (Workflows.engine != null) {
            throw new IllegalStateException("ProcessEngine already initialized");
        }
        synchronized (Workflows.class) {
            if (Workflows.engine == null) {
                Workflows.engine = engine;
            }
        }
    }

    /**
     * 获取流程配置
     *
     * @return 流程配置对象
     */
    public static ProcessConfiguration getConfiguration() {
        return ((ProcessConfiguration) getEngine().getProcessEngineConfiguration());
    }

    /**
     * 获取流程节点
     *
     * @param model 数据模型
     * @return 流程节点列表
     */
    public static List getNodes(Class model) {
        if (model == null) {
            throw new IllegalArgumentException("Model must not be null");
        }
        return getConfiguration().getNodes(model);
    }

    /**
     * 获取流程实例
     *
     * @param  数据类型
     * @param id  流程标识
     * @return 流程实例
     */
    public static  ProcessInstance getProcess(String id) {
        if (id == null) {
            throw new IllegalArgumentException("Id must not be null");
        }
        return getEngine().getRuntimeService().createProcessInstanceQuery().processInstanceId(id).singleResult();
    }

    /**
     * 获取用户任务实例
     *
     * @param       数据类型
     * @param process  流程标识
     * @param assignee 任务接收者标识
     * @return 任务对象
     */
    public static  Task getTask(String process, String assignee) {
        if (process == null) {
            throw new IllegalArgumentException("Process must not be null");
        }
        if (assignee == null) {
            throw new IllegalArgumentException("Assignee must not be null");
        }
        return getEngine().getTaskService().createTaskQuery().taskCandidateUser(assignee).processInstanceId(process)
            .singleResult();
    }

    /**
     * 启动流程
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @param entity    对象实体
     * @return 工作流实例
     */
    public static  ProcessInstance startProcess(Requester requester, Service service, T entity) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        if (entity == null) {
            throw new IllegalArgumentException("Entity must not be null");
        }
        if (entity.getProcess() != null) {
            throw new IllegalStateException("Process already started:" + entity);
        }
        RuntimeService runtimeService = getEngine().getRuntimeService();
        ProcessConfiguration configuration = getConfiguration();
        ProcessInstance process = runtimeService.startProcessInstanceByKey(configuration.getKey(service.getModel()),
            requester.getParameters());
        List nodes = configuration.getNodes(service.getModel());
        entity.setActive(false);
        entity.setProcess(process.getId());
        if (nodes.size() > 1) {
            entity.setStatus(nodes.get(1).getId());
        }
        service.updateObject(requester, entity);
        return process;
    }

    /**
     * 批量启动流程
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     */
    public static  void startProcess(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        String primary = service.getRepository().getPrimary();
        Object[] identifiers = Beans.toArray(Object.class, requester.getParameter(primary));
        if (identifiers.length > 0) {
            List objects = service.getQuery(requester).or(primary, identifiers).list();
            for (int i = 0; i < objects.size(); i++) {
                startProcess(requester, service, objects.get(i));
            }
        }
    }

    /**
     * 完成任务
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @param entity    对象实体
     * @param assignee  任务接收者标识
     * @return 任务对象
     */
    public static  Task completeTask(Requester requester, Service service, T entity, String assignee) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        if (entity == null) {
            throw new IllegalArgumentException("Entity must not be null");
        }
        if (assignee == null) {
            throw new IllegalArgumentException("Assignee must not be null");
        }
        Task task = getTask(entity.getProcess(), assignee);
        if (task == null) {
            throw new IllegalStateException("Task already processed:" + entity);
        }
        TaskService taskService = getEngine().getTaskService();
        taskService.claim(task.getId(), assignee);
        ProcessConfiguration configuration = getConfiguration();
        ActivityNode node = configuration.getNode(service.getModel(), entity.getStatus()); // 当前节点
        if (node == null) {
            throw new IllegalStateException("Activity node does not exist with id:" + entity.getStatus());
        }
        taskService.complete(task.getId(), requester.getParameters());
        synchronized (entity.getProcess().intern()) {
            if (getProcess(entity.getProcess()) == null) { // 流程已完成
                entity.setActive(true);
                List nodes = configuration.getNodes(service.getModel());
                if (!nodes.isEmpty()) {
                    entity.setStatus(nodes.get(nodes.size() - 1).getId());
                }
                service.updateObject(requester, entity);
            } else { // 节点改变
                List activities = getEngine().getRuntimeService().getActiveActivityIds(entity.getProcess());
                if (activities.isEmpty() || !activities.get(0).equals(node.getCode())) {
                    String activity = activities.get(0);
                    ActivityNode next = configuration.getNode(service.getModel(), activity);
                    if (next == null) {
                        throw new IllegalStateException("Activity node does not exist with code:" + activity);
                    }
                    entity.setStatus(next.getId());
                    service.updateObject(requester, entity);
                }
            }
        }
        return task;
    }

    /**
     * 批量完成任务
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     */
    public static  void completeTask(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        String primary = service.getRepository().getPrimary();
        Object[] identifiers = Beans.toArray(Object.class, requester.getParameter(primary));
        if (identifiers.length > 0) {
            List objects = service.getQuery(requester).or(primary, identifiers).list();
            for (int i = 0; i < objects.size(); i++) {
                completeTask(requester, service, objects.get(i), requester.getUser());
            }
        }
    }

    /**
     * 获取用户为完成任务对象集合
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @param assignee  任务接收者标识
     * @return 对象集合
     */
    public static  Query getTaskQuery(Requester requester, Service service, String assignee) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        if (assignee == null) {
            throw new IllegalArgumentException("Assignee must not be null");
        }
        List tasks = getEngine().getTaskService().createTaskQuery().taskCandidateUser(assignee).list();
        if (tasks.isEmpty()) {
            return Repositories.emptyQuery();
        }
        String[] processes = new String[tasks.size()];
        for (int i = 0; i < tasks.size(); i++) {
            processes[i] = tasks.get(i).getProcessInstanceId();
        }
        return service.getQuery(requester).in("process", processes).custom(requester.getParameters());
    }

    /**
     * 获取用户已完成任务对象集合
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @param assignee  任务接收者标识
     * @return 对象集合
     */
    public static  Query getFinishQuery(Requester requester, Service service, String assignee) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        if (assignee == null) {
            throw new IllegalArgumentException("Assignee must not be null");
        }
        HistoryService historyService = getEngine().getHistoryService();
        List historicTaskInstances = historyService.createHistoricTaskInstanceQuery()
            .taskAssignee(assignee).list();
        if (historicTaskInstances.isEmpty()) {
            return Repositories.emptyQuery();
        }
        String[] processes = new String[historicTaskInstances.size()];
        for (int i = 0; i < historicTaskInstances.size(); i++) {
            processes[i] = historicTaskInstances.get(i).getProcessInstanceId();
        }
        return service.getQuery(requester).in("process", processes).custom(requester.getParameters());
    }

    /**
     * 获取当前用户任务量
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @return 任务量
     */
    public static  int getWorkload(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        return getTaskQuery(requester, service, requester.getUser()).count();
    }

    /**
     * 获取当前用户任务列表
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @return 任务列表
     */
    public static  List getTasks(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        return getTaskQuery(requester, service, requester.getUser()).list();
    }

    /**
     * 获取当前用户任务进度(已完成任务量)
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @return 已完成任务量
     */
    public static  int getProgress(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        return getFinishQuery(requester, service, requester.getUser()).count();
    }

    /**
     * 获取当前用户历史任务
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @return 历史任务列表
     */
    public static  List getHistories(Requester requester, Service service) {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        return getFinishQuery(requester, service, requester.getUser()).list();
    }

    /**
     * 获取流程图(如果参数为空则获取部署流程图,如果参数不为空则获取实例流程图)
     *
     * @param        数据类型
     * @param requester 请求对象
     * @param service   业务处理对象
     * @return 流程图数据输入流
     * @throws IOException IO操作异常
     */
    public static  InputStream getDiagram(Requester requester, Service service) throws IOException {
        if (requester == null) {
            throw new IllegalArgumentException("Requester must not be null");
        }
        if (service == null) {
            throw new IllegalArgumentException("Service must not be null");
        }
        T entity = service.getQuery(requester, true).custom(requester.getParameters()).single();
        List nodes = getNodes(service.getModel());
        ProcessEngineConfiguration configuration = getEngine().getProcessEngineConfiguration();
        ProcessDiagramGenerator diagramGenerator = configuration.getProcessDiagramGenerator();
        RepositoryService repositoryService = getEngine().getRepositoryService();
        String identifier = ((ProcessConfiguration) configuration).getIdentifier(service.getModel());
        List activities = entity == null ? Arrays.asList(nodes.get(0).getCode()) : entity.getStatus().equals(
            nodes.get(nodes.size() - 1).getId()) ? Arrays.asList(nodes.get(nodes.size() - 1).getCode())
            : getEngine().getRuntimeService().getActiveActivityIds(entity.getProcess());
        return diagramGenerator.generateDiagram(repositoryService.getBpmnModel(identifier), "png", activities,
            Collections.emptyList(), configuration.getActivityFontName(),
            configuration.getLabelFontName(), configuration.getClassLoader(), 1.0);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy