-
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());
}
}
