10 BOS項(xiàng)目第10天
今天繼續(xù)學(xué)習(xí)工作流activity,流程變量
10.1 請(qǐng)假流程存在的問題
- 缺少請(qǐng)假原因和請(qǐng)假天數(shù),后期可能還會(huì)有其它數(shù)據(jù)要補(bǔ)充
-
activiti把這些數(shù)據(jù)稱為流程變量股毫,內(nèi)部提供了一張act_ru_variable 表來存這些數(shù)據(jù)
image.png
10.2 設(shè)置流程變量的方式
-
重新創(chuàng)建一個(gè)Java項(xiàng)目和數(shù)據(jù)庫(kù),這次用報(bào)銷流程講解
image.png
10.2.1 第一種:?jiǎn)?dòng)流程實(shí)例時(shí)設(shè)置流程變量
@Test
public void test1(){
//2.獲取部署構(gòu)建器對(duì)象
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
//3.添加流程資源
deploymentBuilder.addClasspathResource("bxlc.bpmn");
deploymentBuilder.addClasspathResource("bxlc.jpg");
//4.部署
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
}
/**
* 啟動(dòng)流程實(shí)例時(shí)設(shè)置流程變量
*/
@Test
public void test2(){
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("bxyy", "成都出差機(jī)票");
varibles.put("bxje", "980");
processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
}
10.2.2 第二種:辦理任務(wù)時(shí)設(shè)置流程變量
/**
* 審核任務(wù)時(shí)設(shè)置流程變量
*/
@Test
public void test3(){
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("bxyy", "成都出差動(dòng)車票");
varibles.put("bxje", "260.00");
processEngine.getTaskService().complete("1106", varibles);
}
10.2.3 使用RuntimeService的set方法設(shè)置流程變量
/**
* 使用RuntimeService的set方法設(shè)置流程變量
*/
@Test
public void test4(){
String processInstanceId = "1101";
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("審核狀態(tài)", "同意");
processEngine.getRuntimeService().setVariables(processInstanceId, varibles);
}
10.2.4 用TaskService的set方法設(shè)置
/**
* 用TaskService的set方法設(shè)置
*/
@Test
public void test5(){
String taskId = "1202";//任務(wù)id
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("審核狀態(tài)", "不同意");
processEngine.getTaskService().setVariables(taskId, varibles);
}
10.2.5 如果設(shè)置的是自定義的類型苍凛,需要實(shí)現(xiàn)序列化接口
@Test
public void test5(){
String taskId = "1202";//任務(wù)id
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("審核狀態(tài)", "不同意");
varibles.put("user", new User("kdj", "123456"));
processEngine.getTaskService().setVariables(taskId, varibles);
}
10.3 讀取流程變量的方式
10.3.1 方式一:使用RuntimeService的get方法獲取
@Test
public void test6() {
//用getRuntimeService的get方法獲取流程變量
String processInstanceId = "1101";
User user = (User) processEngine.getRuntimeService().getVariable(processInstanceId, "user");
System.out.println(user);
String state = (String) processEngine.getRuntimeService().getVariable(processInstanceId, "審核狀態(tài)");
System.out.println(state);
}
10.3.2 使用TaskService的get方法獲取
@Test
public void test7() {
//用TaskService的get方法獲取流程變量
String taskId = "1202";
User user = (User) processEngine.getTaskService().getVariable(taskId, "user");
System.out.println(user);
String state = (String) processEngine.getTaskService().getVariable(taskId, "審核狀態(tài)");
System.out.println(state);
}
10.4 動(dòng)態(tài)設(shè)置任務(wù)的候選人
- 第一步:在啟動(dòng)流程實(shí)現(xiàn)時(shí),需要添加一個(gè)表達(dá)式里的變量值
@Test
public void test2() {
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("bxyy", "成都出差機(jī)票");
varibles.put("bxje", "2800");
varibles.put("employeeName", "lisi");
processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
}
-
在任務(wù)的Assignee寫表達(dá)式
image.png
10.5 組任務(wù)操作
10.5.1 候選人組任務(wù)(了解)
-
第一步:給任務(wù)添加多個(gè)用戶
image.png 第二步:重新部署流程和啟動(dòng)流程實(shí)現(xiàn)
@Test
public void test1() {
//2.獲取部署構(gòu)建器對(duì)象
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
//3.添加流程資源
deploymentBuilder.addClasspathResource("bxlc.bpmn");
deploymentBuilder.addClasspathResource("bxlc.jpg");
//4.部署
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
}
/**
* 啟動(dòng)流程實(shí)例時(shí)設(shè)置流程變量
*/
@Test
public void test2() {
HashMap<String, Object> varibles = new HashMap<>();
varibles.put("bxyy", "成都出差機(jī)票");
varibles.put("bxje", "2800");
varibles.put("employeeName", "lisi");
processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
}
- 第三步:辦理第一個(gè)流程任務(wù)
@Test
public void test3() {
//李四提交申請(qǐng)
processEngine.getTaskService().complete("107");
}
- 第四步:根據(jù)用戶id查詢?nèi)蝿?wù)
@Test
public void test4() {
//查找財(cái)務(wù)人員要審核任務(wù)
TaskQuery tq = processEngine.getTaskService().createTaskQuery();
//設(shè)置候選人名稱
tq.taskCandidateUser("kdj01");
//打印任務(wù)id,打印名稱
for (Task task : tq.list()) {
System.out.println(task.getId() + ":" + task.getName());
}
}
- 第五步:拾取任務(wù)
@Test
public void test4() {
//查找財(cái)務(wù)人員要審核任務(wù)
TaskQuery tq = processEngine.getTaskService().createTaskQuery();
//設(shè)置候選人名稱
String user = "kdj01";
tq.taskCandidateUser(user);
//打印任務(wù)id,打印名稱
for (Task task : tq.list()) {
System.out.println(task.getId() + ":" + task.getName());
//拾取任務(wù)
processEngine.getTaskService().claim(task.getId(), user);
}
}
10.5.2 候選組組任務(wù)(重點(diǎn))
-
第一步:設(shè)置一個(gè)財(cái)務(wù)分組id
image.png 第二步:重新部署流程并啟動(dòng)流程實(shí)例然后complete提交申請(qǐng)
-
第三步:添加組
image.png -
第四步:添加用戶
image.png -
第五步:建立用戶和組的關(guān)系
image.png -
第六步:根據(jù)用戶id或者組查詢?nèi)蝿?wù)
- 注意:查詢?nèi)蝿?wù)時(shí),要先啟動(dòng)流程實(shí)現(xiàn)并輸?shù)谝粋€(gè)任務(wù)
@Test
public void testProcessInstance(){
//啟動(dòng)流程實(shí)例:
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("bxyy", "南京出差機(jī)機(jī)票");
variables.put("bxje", "890");
variables.put("employeeName", "小李");
pe.getRuntimeService().startProcessInstanceByKey("bxlc", variables);
}
@Test
public void testComplete(){
//處理第一個(gè)任務(wù)
pe.getTaskService().complete("2307");
}
@Test
public void test5(){
//查詢組任務(wù)
TaskQuery tq = pe.getTaskService().createTaskQuery();
String userId = "1";
//tq.taskCandidateUser(userId);
tq.taskCandidateGroup("財(cái)務(wù)組");
List<Task> tasks = tq.list();
for(Task t:tasks){
System.out.println(t.getId());
}
}
- 第七步:拾起任務(wù)
pe.getTaskService().claim("2402", "1");
10.6 排他網(wǎng)關(guān)
10.6.1 排他網(wǎng)關(guān)流程圖
image.png
10.6.2 測(cè)試網(wǎng)關(guān)
- 在開啟流程實(shí)例時(shí)鸠蚪,必需設(shè)置流量變量qjts
public class GateWayTest {
//1.獲取流程引擎
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
@Test
public void test1(){
//2.獲取部署構(gòu)建器對(duì)象
DeploymentBuilder db = pe.getRepositoryService().createDeployment();
//3.添加流程資源
db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.bpmn");
db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.png");
//4.部署
Deployment deployment = db.deploy();
System.out.println(deployment.getId());
}
@Test
public void test2(){
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("qjyy", "感冒..");
variables.put("qjts",5);
pe.getRuntimeService().startProcessInstanceByKey("qjlc", variables);
}
@Test
public void test3(){
String taskId = "606";
pe.getTaskService().complete(taskId);
}
}
10.7 activiti與spring整合
10.7.1 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置數(shù)據(jù)源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///activiti_day1"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 流程引擎配置對(duì)象 -->
<bean id="processEngineConfiguration"
class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 使用工廠創(chuàng)建流程引擎對(duì)象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>
10.7.2 單元測(cè)試
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class Main5 {
@Test
public void test1() {
//1.創(chuàng)建spring工廠
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.獲取bean
ProcessEngine pe = (ProcessEngine) ac.getBean("processEngine");
List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().list();
//有流程定義打印,代表配置成功
for(ProcessDefinition pd : list){
System.out.println(pd.getKey());
}
}
}
10.8 Bos項(xiàng)目集成activiti
10.8.1 第一步:在Bos數(shù)據(jù)庫(kù)添加activiti所需要的表
- 之前三個(gè)sql文件,已經(jīng)導(dǎo)入了
10.8.2 第二步:將activiti與spring的整合轉(zhuǎn)移到Bos項(xiàng)目中
導(dǎo)入jar包到項(xiàng)目:使用spring3.2以上版本妖谴,不需要添加spring-asm.jar
spring中配置processengin
<!-- 流程引擎配置對(duì)象 -->
<bean id="processEngineConfiguration"
class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 使用工廠創(chuàng)建流程引擎對(duì)象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
- 再配置activiti的各種service
<!-- 注冊(cè)Service -->
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
- 測(cè)試下是否能獲取到流程定義
@Autowired
private RepositoryService rs;
public String login(){
logger.info(getModel());
System.out.println(rs); //如果有值,證明activiti的配置木有問題
10.9 流程定義管理模型
10.9.1 修改系統(tǒng)管理的菜單數(shù)據(jù)
- 在admin.json 添加兩行數(shù)據(jù)
- 注意:系統(tǒng)管理的數(shù)據(jù)是從json中獲取,不是從數(shù)據(jù)庫(kù)
{ "id":"1004", "pId":"100", "name":"流程定義管理", "page":"processDefinitionAction_list.action"},
{ "id":"1005", "pId":"100", "name":"查看正在運(yùn)行的流程實(shí)例", "page":"processInstanceAction_list.action"}
10.9.2 查看流程定義
- 創(chuàng)建ProcessDefinitionAction,完成流程定義列表展現(xiàn)
10.9.3 部署流程定義
//發(fā)布一個(gè)流程
public String deploy() throws FileNotFoundException {
//1.獲取部署的對(duì)象
DeploymentBuilder builder = rs.createDeployment();
//2.builder 添加壓縮包的輸入流
builder.addZipInputStream(new ZipInputStream(new FileInputStream(zipFile)));
builder.deploy();
//部署完后回到list頁(yè)面
return "list";
}
10.9.4 查看流程定義圖
- 第一步:修改jsp頁(yè)面
<td>
<a onclick="showPng('${id}')" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程圖</a>
</td>
<script>
function showPng(id) {
//alert(id);
//顯示流程圖
window.open("${pageContext.request.contextPath}/processDefinitionAction_viewpng.action?id=" + id);
}
</script>
- 第二步:Action
public String viewpng(){
//返回一張圖片給客戶端
//1.根據(jù)流程id獲取圖片
InputStream imgIS = rs.getProcessDiagram(id);
//2.把imgIS放在值棧
ActionContext.getContext().getValueStack().set("imgIS", imgIS);
return "viewpng";
}
- 第三步:Struts
<action name="processDefinitionAction_*" class="com.kdj.bos.web.action.ProcessDefinitionAction" method="{1}">
<result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp</result>
<!--告訴客戶端返回流文件-->
<result name="viewpng" type="stream">
<param name="contentType">image/png</param>
<param name="inputName">imgIS</param>
</result>
</action>
10.9.5 刪除流程定義
-
效果
image.png 第一步:添加刪除的js代碼
function del(id) {
$.messager.confirm("提示","是否要?jiǎng)h除?", function (r) {
if (r){
var url = "${pageContext.request.contextPath}/processDefinitionAction_del.action";
$.post(url, {id:id}, function (data) {
if (data == "success") {
$.messager.alert("提示", "刪除成功", "info", function () {
location.href = "${pageContext.request.contextPath}/processDefinitionAction_list.action"
});
} else{
$.messager.alert("提示", "刪除失敗", "error");
}
});
}
});
}
- 第二步:Action代碼
public void del() throws IOException {
//1.先根據(jù)流程定義的id查找部署id
ProcessDefinitionQuery query = rs.createProcessDefinitionQuery();
query.processDefinitionId(id);
ProcessDefinition pd = query.singleResult();
String deploymentId = pd.getDeploymentId();
rs.deleteDeployment(deploymentId);
ServletActionContext.getResponse().getWriter().write("success");
}