1. 程式人生 > 其它 >Springboot專案中使用activiti7.0版本

Springboot專案中使用activiti7.0版本

1.0、為什麼使用工作流框架

日常的開發中,我們會遇見一些比較噁心的審批流程。又或者是面對不同的業務場景,流程使用的場景不固定。又或者審批的流程不確定,比如一些政府單位,響應國家政策新增一個什麼崗位,我們的流程審批必須經過此崗位。
這裡就體現出將工作流和實際的業務進行業務分離的必要性,所以引入BPM框架是很有必要必要的。

1.1、介紹activiti

官網地址,直接去官網看吧,可能有點卡(國外的網站可能有點卡)

2.0、Sringboot專案中整合activiti

2.1、pom中加入依賴

<dependency>
			<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency>
2.2、yml中加入配置
spring:
  activiti:
    database-schema-update: true
    db-history-used: true
    check-process-definitions: false
    history-level: audit

這裡加入的目的是為了,在專案啟動的時候,activiti框架會自動檢查此專案的後臺資料庫,建立工作流框架的後臺表

2.3、資料庫表

在這裡插入圖片描述
如上圖所示,act開頭的表都是activiti所需要的後臺表

2.4、介面實現

這裡簡單介紹一下,activiti7.0的官方資料比較少,畢竟是新版本,可以借鑑一下6.X、5.X的版本看看。

2.4.1 部署流程
/**
	     * 部署流程定義 	 類路徑下(classPath)
	     */
	    @Test
	    public void deploy() {
	        // 獲取部署物件
	        Deployment deployment = repositoryService.createDeployment().name("員工請假流程222"
).addClasspathResource("processes/MyProcess.bpmn").addClasspathResource("processes/MyProcess.png").deploy(); System.out.println("流程部署ID:" + deployment.getId()); System.out.println("流程部署Name:" + deployment.getName()); } /** * 部署流程定義 zip */ public void deployByZip(MultipartFile file) { InputStream in = null; try { in = file.getInputStream(); } catch (IOException e) { e.printStackTrace(); } ZipInputStream zipInputStream = new ZipInputStream(in); repositoryService.createDeployment() .addZipInputStream(zipInputStream) .deploy(); } @Test public void deployByZip() { InputStream in = this.getClass().getClassLoader().getResourceAsStream("MyProcess.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment deploy = repositoryService.createDeployment().name("zip格式部署流程定義").addZipInputStream(zipInputStream).deploy(); System.out.println("部署id為:" + deploy.getId() + ",部署名稱為:" + deploy.getName()); }
2.4.2 啟動流程例項
/**
     * 啟動流程例項並設定流程變數
     */
    @Test
    public void startProcessTest() {
        String userId = "wangwu";
        //設定認證使用者的id
        identityService.setAuthenticatedUserId(userId);
        Map<String, Object> variables = new HashMap<>();
        variables.put("applyUser", "luxuebing");
        variables.put("PM", "PM");
        variables.put("President", "President");
        variables.put("VP", "VP");
        variables.put("days", 5);
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("myProcess", "66666", variables);
        System.out.println("流程例項id:>>>" + instance.getId());
    }
2.4.3 查詢
 /**
     * 查詢我要辦理的任務
     */
	@Test
	public void getMyTask() {
		String assignee = "President";
		List<Task> list = taskService.createTaskQuery().taskAssignee(assignee).list();
		for (Task task : list) {
			System.out.println(task.toString() + "當前任務的辦理人為:>>>" + taskService.getVariable(task.getId(), "President"));
		}
	}

    /**
     * 辦理任務並且加上批註
     */
	@Test
	public void completeTask() {
		String taskId = "10005";
		Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
		String processInstanceId = task.getProcessInstanceId();
		String message = "總裁同意";
		//給當前任務新增批註資訊
		taskService.addComment(taskId, processInstanceId, message);
		Map<String, Object> variables = new HashMap<>();
		variables.put("msg", "agree");
		taskService.complete(taskId, variables);
	}

    /**
     * 根據當前任務id檢視當前流程圖所處的活動節點資訊
     */
	@Test
	public void findCoordinate() {
		//String taskId = "13";
		Task result = taskService.createTaskQuery().taskAssignee("President").singleResult();
		//通過任務id獲取任務物件
		Task task = taskService.createTaskQuery().taskId(result.getId()).singleResult();
		//通過任務id獲取流程定義id
		String processDefinitionId = task.getProcessDefinitionId();
		//通過流程定義id獲取流程定義的實體物件(對應的是.bpmn檔案中的資料)
		ProcessDefinitionEntity entity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
		//通過任務id獲取流程例項id
		String processInstanceId = task.getProcessInstanceId();
		//通過流程例項id獲取當前活動對應的流程例項物件
		ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
		//獲取當前的活動id
		String activityId = instance.getActivityId();
		//獲取當前活動物件
		ActivityImpl activity = entity.findActivity(activityId);
		System.out.println("x座標為:" + activity.getX() + "-----y座標為:" + activity.getY() + "-----高度為:" + activity.getHeight() + "-----寬度為:" + activity.getWidth());
	}

    /**
     * 根據流程例項id檢視當前流程例項是否結束
     */
	@Test
	public void findProcessState() {
		ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId("5008").singleResult();
		if(Objects.isNull(instance)) {
			System.out.println("當前的流程例項已經結束。。。。");
		}
		HistoricProcessInstance singleResult = historyService.createHistoricProcessInstanceQuery().processInstanceId("5008").singleResult();
		System.out.println("歷史流程例項id為:" + singleResult.getId() + "----開始時間為:" + singleResult.getStartTime() + "-----------結束時間為:" + singleResult.getEndTime());
	}

    /**
     * 根據使用者id查詢該使用者發起的流程
     *
     * @return
     */
    @Test
    public void getHistoricProcessInstance() {
        String userId = "lisi";
        List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().startedBy(userId).list();
        for (HistoricProcessInstance historicProcessInstance : list) {
            System.out.println(historicProcessInstance.toString());
        }
    }

    /**
     * 查詢指定使用者發起的流程(流程歷史  使用者發起)
     * historyService.createHistoricProcessInstanceQuery()
     * .finished()//finished--> 完成的流程;  unfinish ---> 還在執行中的流程
     * .startedBy(name).orderByProcessInstanceStartTime().desc()
     * .listPage(firstResult, maxResults);
     */
    @Test
    public void findStartByMe() {
        List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().finished().startedBy("范冰冰").list();
        System.out.println(list);
    }
    /**
     * 查詢指定使用者參與的流程資訊 (流程歷史  使用者參與 )
     * List hpis = historyService
     *	.createHistoricProcessInstanceQuery().involvedUser(name)
     *	.orderByProcessInstanceStartTime().desc().listPage(firstResult, maxResults);
     */

    /**
     * 查詢指定流程的任務流轉路徑 (流程歷史 任務 流轉 路經)
     * historyService.createHistoricTaskInstanceQuery()
     *	.processInstanceId(processInstanceId)
     *	.orderByHistoricTaskInstanceEndTime().asc().list();
     *
     */

    /**
     * 查詢我審批過的流程例項
     */
    @Test
    public void finishedByUser() {
        String assignee = "范冰冰";
        List<HistoricProcessInstance> list2 = new ArrayList<>();
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().taskAssignee(assignee).list();
        for (HistoricTaskInstance historicTaskInstance : list) {
            String processInstanceId = historicTaskInstance.getProcessInstanceId();
            list2.add(historyService.createHistoricProcessInstanceQuery()
                    .processInstanceId(processInstanceId)
                    .singleResult());
        }
        for (HistoricProcessInstance historicProcessInstance : list2) {
            System.out.println(historicProcessInstance);
        }
    }


    /**
     * 檢視當前流程圖的所在節點(單線流程,一個執行物件的時候)
     */
    public void getCurrentView() {
        ActivityImpl activity = null;
        String processDefinitionId = "";//流程定義id
        String processInstanceId = "";//流程例項id
        ExecutionEntity entity = (ExecutionEntity) runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();
        String activityId = entity.getActivityId();
        ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
        List<ActivityImpl> activities = definitionEntity.getActivities();
        for (ActivityImpl activityImpl : activities) {
            if (activityId.equals(activityImpl.getId())) {
                activity = activityImpl;
                break;
            }
        }
        System.out.println(activity);
    }
    /*@Test
    public void startTest() {
        String id = "4";
        LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
		//獲取請假單實體的類名
//		String key = leaveBill.getClass().getSimpleName();
        //更新請假單狀態從0變成1 表示稽核中
        leaveBill.setState(LeaveBillConstant.AUDIT_ING);
        leaveBillDao.updateLeaveBill(leaveBill);
        Map<String, Object> variables = Maps.newHashMap();
        //從session中取出當前登入人,設定為提交申請任務的辦理人
        identityService.setAuthenticatedUserId("范冰冰");

        variables.put("applyUser", "范冰冰");
        //設定請假天數
        Integer days = leaveBill.getDays();
        variables.put("days", days);
        //將啟動的流程例項關聯業務
        String businessKey = id;
        runtimeService.startProcessInstanceByKey("myProcess", businessKey, variables);
    }*/

    /**
     * 查詢我的待辦任務列表
     */
    @Test
    public void taskTest() {
        List<Task> list = taskService.createTaskQuery().taskAssignee("范冰冰").list();
        String json = FastJsonUtils.serializeToJSON(list);
        System.out.println(json);
    }

    /**
     * 根據請假單id獲取歷史審批意見
     */
    @Test
    public void findCommentListByLeaveId() {
        String id = "3";
        HistoricProcessInstance hpi = historyService
                .createHistoricProcessInstanceQuery()
                .processInstanceBusinessKey(id)
                .singleResult();
        String processInstanceId = hpi.getId();
        List<Comment> comments = taskService.getProcessInstanceComments(processInstanceId);
        System.out.println(comments);
    }
    ````

3.0、結束

程式碼模組每一個專案的設計思路不一樣,大家選擇性借鑑,如果大家是需要用到工作流框架,還是需要大家花點時間多研究一下,如何設計流程模板、如何部署路程模板、以及一些工作流中的流程變數如何設定以及獲取等等。

一個人走的快,一群人走的遠。