1. 程式人生 > >工作流activti使用簡單樣例

工作流activti使用簡單樣例

package test;

import org.activiti.engine.*;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.task.Task;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by yan on 17-3-23.
 */
public class ActivtiSmilpeServer {
    public static ProcessEngine processEngine =
            ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
    /**
     * 許可權操作service
     */
    public static IdentityService identityService = processEngine.getIdentityService();
    /**
     * 執行service
     */
    private static RuntimeService runtimeService = processEngine.getRuntimeService();
    /**
     * 任務執行service
     */
    private static TaskService taskService = processEngine.getTaskService();

    /**
     * 許可權操作
     */
    public void identity() {
        //這裡為做測試,設定了一些預設使用者,在實際使用時可以根據對接的系統進行初始話的設計,或者不設定直接交給對接的系統處理
        Group group = new GroupEntity();
        group.setId("1");
        group.setName("稽核組");
        group.setType("1");
        identityService.saveGroup(group);
        User user1 = new UserEntity();
        user1.setId("1");
        user1.setFirstName("步驚雲");
        identityService.saveUser(user1);
        User user2 = new UserEntity();
        user2.setId("2");
        user2.setFirstName("聶風");
        identityService.saveUser(user2);
        //關聯使用者與組
        identityService.createMembership("1", "1");
        identityService.createMembership("2", "1");
    }

    /**
     * 部署流程,每次部署在ACT_RE_PROCDEF表中會多一條記錄,該記錄版本為最新
     *
     * @param path bpmn檔案地址 如:simple.bpmn
     */
    public void deploy(String path) {
        processEngine.getRepositoryService().createDeployment().addClasspathResource(path).deploy();
    }

    /**
     * 根據id釋出流程
     *
     * @param id     表ACT_RE_PROCDEF的id
     * @param userId 使用者id
     */
    public void startById(String id, String userId) {
        Map variables = new HashMap();
        //為圖中的#{userId},賦值,指定釋出新聞的物件
        variables.put("userId", userId);
        processEngine.getRuntimeService().startProcessInstanceById(id, variables);

    }

    /**
     * 根基key釋出流程,會發布對應key最新的版本,key值為 bpmn檔案的id
     *
     * @param key    表ACT_RE_PROCDEF的key
     * @param userId 使用者id
     */
    public void startByKey(String key, String userId) {
        Map variables = new HashMap();
        //為圖中的#{userId},賦值,指定釋出新聞的物件
        variables.put("userId", userId);
        runtimeService.startProcessInstanceByKey(key, variables);
    }

    /**
     * 使用者釋出新聞
     *
     * @param userId 使用者id
     * @param taskId 任務id
     */
    public void userTask(String userId, String taskId) {
        //得到任務物件
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task.getAssignee().equals(userId)) {//判斷是否該任務的執行人
            /**
             * 1.完成任務
             * 2.這時如我在圖上的設定會觸發listener的notify事件,為下一個流程的候選組賦值
             * 3.除了listener事件,也可以通過startById與startByKey中相同的手段為候選組或者候選人賦值,如果多個可以#{aaa},#{bbb}
             */
            taskService.complete(taskId);
        }

    }

    /**
     * 候選組稽核流程
     *
     * @param userId 使用者id
     * @param taskId 任務id
     */
    public void groupTask(String userId,String taskId) {
        //候選組的人員認領任務,只有候選組裡的人可以認領
        taskService.claim(taskId,userId);
        //設定條件,走符合設定條件的路線,這裡的排它閘道器可以不要,有排它閘道器的好處是可以在排它網管上設定預設值
        Map variables = new HashMap();
        //為圖中的${type==1}的type,賦值
        variables.put("type", 1);
        //完成任務
        taskService.complete(taskId);
    }

}