-
Name: Flowable BPMN 2.0 designer
-
Location: http://flowable.org/designer/update/
業務描述:
1. 公司采購,因為辦公用品價格高低的問題,需要分級審批,各級的審批資金的高低不一樣,高於 500 塊錢需要總經理審批!
1. 申請流程:
1. 申請人起草填寫申請單(申請辦公用品【數據庫自帶價格】、申請理由、使用人),保存后可立即提交申請;
1. 申請人提交審批,發起流程;
1. 部門經理審批;
1. 流程自動處理,采購金額buyCost
大於 500的,自動轉到總經理審批,否則直接轉到人事部審批;
1. 如果總經理審批或者人事部審批通過,則自動轉到財務部歸檔,否則被打回到申請人處理;
1. 財務歸檔處理后,流程轉到采購部處理,采購部可以根據辦公用品是否需要采購進行控制,選擇采購辦公用品或者人事部發放辦公用品,流程轉到此兩者之一。
1. 如果申請單被打回到申請人,申請人可以再次修改后重新提交審批,也可以選擇放棄、到此流程結束。
1. 如果流程走到采購辦公用品,那么,采購部人員可以控制此流程,如果辦公用品采購回來了,那么流程轉到人事部發放辦公用品。
1. 當人事部發放辦公用品 人事部處理完過后,流程轉到領取辦公用品,申請人到人事部去領取辦公用品,流程到此結束。
// 使用代碼創建工作流需要的23張表 @Before public void createTable() { // 工作流引擎的全部配置 ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .setJdbcUrl("jdbc:jtds:sqlserver://localhost:1433/msgBoard2") .setJdbcUsername("sa") .setJdbcPassword("1234") .setJdbcDriver("net.sourceforge.jtds.jdbc.Driver") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // 工作流的核心對象,ProcessEnginee對象 processEngine = processEngineConfiguration.buildProcessEngine(); System.out.println("-----------工作流引擎開啟----------"); } /** * 部署流程定義 */ @Test public void deploymentProcessDefinition() { //創建核心引擎對象 Deployment deployment = processEngine.getRepositoryService() .createDeployment() .name("flowable入門程序2") .addClasspathResource("myProcess-test.bpmn20.xml") .deploy(); System.out.println("##########添加部署##########"); System.out.println("部署ID:" + deployment.getId()); System.out.println("部署名稱:" + deployment.getName()); findProcessDefinition(); } /** * 啟動流程實例 * 使用key值啟動 */ @Test public void startProcessInstance2() { // 流程定義的key String processDefinitionKey = "myProcess-test"; ProcessInstance pi = processEngine.getRuntimeService()// 於正在執行的流程實例和執行對象相關的Service .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應hellworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動 System.out.println("流程實例ID:" + pi.getId());// 流程實例ID 101 System.out.println("流程定義ID:" + pi.getProcessDefinitionId()); // 流程定義ID HelloWorld:1:4 } /** * 啟動流程實例 * 使用id值啟動 */ @Test public void startProcessInstance() { RuntimeService runtimeService = processEngine.getRuntimeService();//表示正在執行的流程實例和執行對象 ProcurementVO procurementVO = new ProcurementVO(); procurementVO.setEmployee("sky"); procurementVO.setReason("測試用例。。。。。。。。"); List<Articles> articlesList = new ArrayList<Articles>(); Articles articles1 = new Articles("文具", 80, 1); Articles articles2 = new Articles("電腦", 500, 1); articlesList.add(articles1); articlesList.add(articles2); procurementVO.setArticlesList(articlesList); double buyCost = 0; for (Articles articles : articlesList) { buyCost += (articles.getAmount() * articles.getPrice()); } Map<String, Object> variables = new HashMap<String, Object>(); variables.put("procurement", procurementVO); variables.put("buyCost", buyCost); String processDefinitionId = "myProcess-test:1:105003"; ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); System.out.println("##########流程開啟##########"); System.out.println("流程實例ID:" + processInstance.getId()); System.out.println("流程定義ID:" + processInstance.getProcessDefinitionId()); findTask(); } /** * 查詢所有的流程定義 */ @Test public void findProcessDefinition() { List<ProcessDefinition> list = processEngine.getRepositoryService()// 與流程定義和部署對象先相關的service .createProcessDefinitionQuery()// 創建一個流程定義的查詢 /** 指定查詢條件,where條件 */ // .deploymentId(deploymentId) //使用部署對象ID查詢 // .processDefinitionId(processDefinitionId)//使用流程定義ID查詢 // .processDefinitionNameLike(processDefinitionNameLike)//使用流程定義的名稱模糊查詢 /* 排序 */ .orderByProcessDefinitionVersion().asc() // .orderByProcessDefinitionVersion().desc() /* 返回的結果集 */ .list();// 返回一個集合列表,封裝流程定義 // .singleResult();//返回惟一結果集 // .count();//返回結果集數量 // .listPage(firstResult, maxResults);//分頁查詢 if (list != null && list.size() > 0) { for (ProcessDefinition pd : list) { System.out.println("流程定義ID:" + pd.getId());// 流程定義的key+版本+隨機生成數 System.out.println("流程定義的名稱:" + pd.getName());// 對應helloworld.bpmn文件中的name屬性值 System.out.println("流程定義的key:" + pd.getKey());// 對應helloworld.bpmn文件中的id屬性值 System.out.println("流程定義的版本:" + pd.getVersion());// 當流程定義的key值相同的相同下,版本升級,默認1 System.out.println("資源名稱bpmn文件:" + pd.getResourceName()); System.out.println("資源名稱png文件:" + pd.getDiagramResourceName()); System.out.println("部署對象ID:" + pd.getDeploymentId()); System.out.println("是否暫停:" + pd.isSuspended()); System.out.println("#########################################################"); } } else { System.out.println("沒有流程正在運行。"); } } /** * 獲取任務 */ @Test public void getTask() { // 與任務相關的service,正在執行的service TaskService taskService = processEngine.getTaskService(); // 任務ID String taskId = "85005"; Task task = taskService.newTask(taskId); System.out.println(task.getId() + " " + task.getAssignee() + " " + task.getName() + " " + task.getProcessInstanceId()); System.out.println("################################"); } /** * 設置流程變量 */ @Test public void setVariables() { // 與任務相關的service,正在執行的service TaskService taskService = processEngine.getTaskService(); // 任務ID String taskId = "107508"; Map<String, Object> variables = new HashMap<String, Object>(); // variables.put("approve", false); variables.put("endOut", true); // taskService.removeVariable(taskId, "buyCost"); taskService.complete(taskId, variables); System.out.println("設置流程變量成功!"); findTask(); } /** * 刪除流程定義(刪除key相同的所有不同版本的流程定義) */ @Test public void delteProcessDefinitionByKey() { // 流程定義的Key String processDefinitionKey = "myProcess-test"; // 先使用流程定義的key查詢流程定義,查詢出所有的版本 List<ProcessDefinition> list = processEngine.getRepositoryService() .createProcessDefinitionQuery() .processDefinitionKey(processDefinitionKey)// 使用流程定義的key查詢 .list(); // 遍歷,獲取每個流程定義的部署ID if (list != null && list.size() > 0) { for (ProcessDefinition pd : list) { // 獲取部署ID String deploymentId = pd.getDeploymentId(); // /* // * 不帶級聯的刪除, 只能刪除沒有啟動的流程,如果流程啟動,就會拋出異常 // */ // processEngine.getRepositoryService().deleteDeployment(deploymentId); /** * 級聯刪除 不管流程是否啟動,都可以刪除 */ System.out.println("刪除部署:" + deploymentId); processEngine.getRepositoryService().deleteDeployment( deploymentId, true); } } } /** * 查詢流程狀態(判斷流程正在執行,還是結束) */ @Test public void isProcessEnd() { String processInstanceId = "25001"; ProcessInstance pi = processEngine.getRuntimeService()//表示正在執行的流程實例和執行對象 .createProcessInstanceQuery()//創建流程實例查詢 .processInstanceId(processInstanceId)//使用流程實例ID查詢 .singleResult(); if (pi == null) { System.out.println("流程已經結束"); } else { System.out.println("流程沒有結束"); } } /** * 查詢任務 * --通過流程實例id */ @Test public void findTask() { // String processInstanceId = "42501"; List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的service .createHistoricTaskInstanceQuery()//創建歷史任務實例查詢 // .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceId().asc() .list(); if (list != null && list.size() > 0) { for (HistoricTaskInstance hti : list) { System.out.println(hti.getId() + " " + hti.getAssignee() + " " + hti.getName() + " " + hti.getProcessInstanceId() + " " + hti.getStartTime() + " " + hti.getEndTime() + " " + hti.getDurationInMillis()); System.out.println("################################"); } } } /** * 查詢當前人的個人任務 */ @Test public void findMyPersonTask() { String assignee = "sky"; List<Task> list = processEngine.getTaskService()// 與正在執行的認為管理相關的Service .createTaskQuery()// 創建任務查詢對象 .taskAssignee(assignee)// 指定個人認為查詢,指定辦理人 .list(); if (list != null && list.size() > 0) { for (Task task : list) { System.out.println("任務ID:" + task.getId()); System.out.println("任務名稱:" + task.getName()); System.out.println("任務的創建時間" + task); System.out.println("任務的辦理人:" + task.getAssignee()); System.out.println("流程實例ID:" + task.getProcessInstanceId()); System.out.println("執行對象ID:" + task.getExecutionId()); System.out.println("流程定義ID:" + task.getProcessDefinitionId()); System.out.println("#################################"); } } } /** * 得到實際的 組任務列表 */ @Test public void findGroupTaskList() { String groupName1 = "procurementOfManager"; String groupName2 = "procurementOfPersonnel"; TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup(groupName1).list(); System.out.println(groupName1 + " have " + tasks.size() + " tasks:"); for (int i = 0; i < tasks.size(); i++) { System.out.println((i + 1) + ") " + tasks.get(i).getName()); } System.out.println("#################################################"); TaskService taskService2 = processEngine.getTaskService(); List<Task> tasks2 = taskService.createTaskQuery().taskCandidateGroup(groupName2).list(); System.out.println(groupName2 + " have " + tasks2.size() + " tasks:"); for (int i = 0; i < tasks2.size(); i++) { System.out.println((i + 1) + ") " + tasks2.get(i).getName()); } }