宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)

一、回顾第一天核心内容 
1、 JBPM是什么? 为我的项目带来什么? 
工作流, 就是将业务流程实现自动化,非人工方式,控制任务的执行 -------- 所有业务流程 执行信息 都可以存放到数据库 中 
JBPM 是目前非常流行 一个开源工作流框架 
当项目业务流程非常多,而且非常复杂,使用工作流对项目进行管理,减少业务操作出错,所有业务参照

2、 jbpm工作流使用 
第一个方面: 进行工作流 业务流程设计 安装GPD插件 
第二个方面: 使用jbpm api 完成工作流框架操作  ProcessEngine 、 RepositoryService 、 ExecutionService 、 TaskService 
jar包导入  (今天会将jbpm 集成到 bos 宅急送项目中)

3、 业务流程定义管理 
1)  发布业务流程 classpath文件发布、zip压缩文件发布 
Configuration ----- ProcessEngine ---- RepositoryService (流程定义相关服务) ----- createDeployment() 
--- 添加资源 ddResourceFromClasspath/addResourcesFromZipInputStream  ---- deploy() 发布方法
* 操作 deployment 、 lob 、deployprop  三张表

2) 查询 
RepositoryService.createProcessDefinitionQuery()  查询流程定义
3) 删除  
RepositoryService.deleteDeploymentCascade(java.lang.String deploymentId) 

4)启动流程时,默认启动最新版本流程 startProcessDefinitionByKey ; 如何获取最新版本流程信息  orderDesc(流程id) --- 取第一个

4、 业务流程执行管理
1)  启动流程实例 ExecutionService.startProcessDefinitionByKey 
*** 默认向 jbpm4_execution(实例执行信息) jbpm4_hist_procinst (实例执行历史记录) 插入记录 
*** 根据task操作 jbpm4_task(任务表)、jbpm4_hist_task(历史任务表)、jbpm4_hist_actinst(活动记录表)

2)  查询我的任务 (定义任务时,为任务制定 Assignee) 
*** 查询 必须先创建对应Query对象,再完成查询
第一种
TaskService.createTaskQuery().assignee(java.lang.String userId).list()   ---- 可以分页、排序
第二种
TaskService.findPersonalTasks(java.lang.String userId) 

3) 办理任务
TaskService.completeTask(java.lang.String taskId) 

4) 向后流转一部 (主要用于多个Transition、State节点)
ExecutionService.signalExecutionById(java.lang.String executionId)  执行某个流程实例 向后一步 

5、 实例运行过程中变量
通过 ExecutionService 、 TaskService 设置流程实例变量  ---- 只要同一个流程实例都可以获取变量 
复杂对象保存 (在hibernate配置po类 / 实现Serializable接口)

====================================================================================
二、 流程定义语言 (预定义活动节点)
1、<process name="helloworld" xmlns="http://jbpm.org/4.4/jpdl" key="holiday"> 流程定义节点 
name : 流程定义名称
key : 流程关键字(键值) ,如果不写默认key值就是name值 ,在程序通过key值去启动一个流程实例 
version : 必须在数据库中存入指定版本号 (如果版本之前已经存在,报错),不指定,数据库完成自增 
xmlns : 引入schema约束,编写文件提示效果 http://jbpm.org/4.4/jpdl 无提示效果 
****  将jbpm解压目录/src/jpdl-4.4.xsd 配置一下有提示 

2、 流转 Transition  节点 
活动都可以添加transition 流转 , 添加一个或者多个 (start 只能一个, end没有)
指定流转节点
第一种方式 : 完成任务时 getTaskService().completeTask(task.getId(), transition);
第二种方式 : 通过ExecutionService.signalExecutionById(java.lang.String executionId,transition )  主要用于 state节点

*** 配置jpdl 提示 , 选择namespace : http://jbpm.org/4.4/jpdl 

3、 流转控制节点(活动节点 Activity) ------ 绘图和UML中活动图 
1) start 开始节点 
2) end  结束节点 (end 正常结束 end-cancel 取消流程 end-error 流程异常终止 )

3) state 状态节点  (自动完成一些任务节点, 比如 发送确认邮件 ) ---- 该节点会停留
***  通过ExecutionService.signalExecutionById(java.lang.String executionId,transition )  

4)decision 判断节点
*** 用于分支情况 
指定handler 必须实现接口 DecisionHandler 
*** 根据流程中变量,判断走向哪个Transition  

5)fork/join 分支、合并节点 
*** fork用来表示分支,并行一定要执行任务 ,使用fork后,一定要用join 将分支合并 
*** decistion 代表在满足特点条件,分支任选其一 

获得所有获得name : pi.findActiveActivityNames();
ActivityCoordinates c = processEngine.getRepositoryService()
.getActivityCoordinates(processDefinitionId, activityName);
获得获得节点坐标【x 横坐标 y 纵坐标 width 宽度 height 高度】
System.out.println("x=" + c.getX() 
+ ",y=" + c.getY() 
+ ",width=" + c.getWidth() 
+ ",height=" + c.getHeight());

6)task 任务节点 
**** 存在负责人,由指定负责人进行任务办理 

三种分配任务方式 (个人任务)
第一种 :绘制图时,指定<task name="办理" assignee="张三">  缺点:负责人固定,不利于维护
将负责人指定为一个变量 格式 #{变量名 } <task name="办理" assignee="#{userId}">
第二种 :在<task> 中编写 <assignment-handler class="" > 由指定class负责指定负责人  , 该类必须实现 AssignmentHandler
assignable.setAssignee("负责人");
*** 加入逻辑,比如有流程变量,通过变量来指定,没有流程变量 ,设置默认负责人 
第三种 :在任务完成前,都可以更换负责人  taskService.assignTask(任务id, 负责个人)

三种分配任务方式 (组任务) ------ 存在一个任务,任务由指定一组人来完成,组内每个人都有完成任务的能力 
第一种 : assignment type : candidate-users  expression: 小王,小李,小张
JBPM4_PARTICIPATION 表存放组任务用户信息 
查询个人组任务 java.util.List<Task> findGroupTasks(java.lang.String userId) 
**** 只要是组内用户都可以查询到组任务 
**** 拾取任务 : 组内的一个用户,将组任务 变为 个人任务 TaskService.takeTask(taskid, user);
**** 拾取任务后的操作 : 1) 小李拾取任务后完成 taskService.completeTask  2) 小李没时间做 ,改变任务负责人 taskService.assignTask 3) 小李没时间做, 找不到负责人 ,将任务归还任务组  
第二种 : 在<task> 中编写 <assignment-handler class="" > 由handler 指定负责人  
Assignable.addCandicateUser(组任务用户)
第三种 : 对已经存在任务,添加组用户
processEngine.getTaskService().addTaskParticipatingUser(taskId,userId, Participation.CANDIDATE);

====================================================================================
三、 自定义活动节点
绘制流程图,为图添加custom 节点 (自定义活动节点)
jbpm 提供 Activity 接口 代表一个活动 , 预定义活动 实现 ActivityBehaviour 接口 , 如果自定义活动节点实现 ExternalActivityBehaviour

@Override
public void execute(ActivityExecution activityexecution) throws Exception {
// 该活动 被执行了 
}

@Override
public void signal(ActivityExecution activityexecution, String s,
Map<String, ?> map) throws Exception {
// 代表流程 在当前节点停留,离开前执行的操作 
}
**** 自定义活动,默认不会在节点停留 ------ 不停留,就不会signal 
execute方法中操作
1,ActivityExecution.waitForSignal(),在当前节点等待。
2,ActivityExecution.takeDefaultTransition(),使用默认的Transition离开,当前节点中定义的第一个为默认的。
3,ActivityExecution.take(String transitionName),使用指定的Transition离开
4,ActivityExecution.end(),结束流程实例

四、 流程执行过程中事件对象  (了解)
jbpm 允许为 活动中每个节点指定 事件 

1、 定义监听器  实现 EventListener 接口 

2、 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型
a) <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。
b) <on>元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开
c) 在Start节点中只有end事件,在End节点中只有start事件。
d) 在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)
e) 在<task>元素中还可以配置assign事件,是在分配任务时触发的。

====================================================================================
五、 将jbpm 集成到项目中
1、 将整合后jar 包 复制 bos/WebRoot/WEB-INF/lib  (86个jar包)
2、 配置文件整合 
jbpm : jbpm.cfg.xml  jbpm.hibernate.cfg.xml  log4j.properties 

将 jbpm.cfg.xml  jbpm.hibernate.cfg.xml  两个文件整合到bos 
*** jbpm.hibernate.cfg.xml 本质是hibernate 配置文件  (hibernate配置放到 dao.xml)
<property name="mappingResources">
<list>
<value>jbpm.repository.hbm.xml</value>
<value>jbpm.execution.hbm.xml</value>
<value>jbpm.history.hbm.xml</value>
<value>jbpm.task.hbm.xml</value>
<value>jbpm.identity.hbm.xml</value>
</list>
</property>

***  jbpm.cfg.xml 需要和Spring 整合 
jbpm-4.4/doc/devguide/html_single/index.html
1) 将 jbpm.cfg.xml 复制 bos/config 
将 <import resource="jbpm.tx.hibernate.cfg.xml" /> 改为 <import resource="jbpm.tx.spring.cfg.xml" />
2) 配置jbpm 的 ProcessEngine 
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
 <property name="jbpmCfg" value="jbpm.cfg.xml"></property>
</bean>
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />

3) 想直接得到jbpm服务对象
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" />

====================================================================================
介绍 权限管理模型 
1、 最简易的权限管理模型 (javaweb)
适用于: 用户种类不多,系统功能不是特别复杂 
在用户表中添加角色字段,用字段区分用户属于哪类角色  

好处: 使用起来方便,编码量不大
缺点: 管理粒度比较粗 ,维护不方便 ,不够灵活  --- 不可复用 

============ 角色和资源路径关系,固定在程序,通过配置文件 xml/txt

2、 标准权限管理模块
功能表 、权限表、角色表、用户表 

好处: 系统菜单可以动态定制 、维护比较方便、控制粒度精细  ---- 可复用 
缺点: 开发复杂 

3、 复杂权限系统 
Oracle  权限控制  : 系统权限、对象权限 

create table 建表 ---- 属于系统权限 
select 表user 、delete 表customer   ------ 属于对象权限 

参考 php框架 cake  权限模型 
user add / view / list / delete 
new  add / view / list / delete 

表结构 
user编号  模块 功能点
1         news  add  --------- 1号用户可以添加新闻 
4         user  list  -------- 4号用户可以查询所有用户 
宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)_第1张图片

 宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)_第2张图片

宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)_第3张图片

宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)_第4张图片


你可能感兴趣的:(宅急送项目)