关于activiti的使用方法及大致流程

Activiti工作流实践
本文介绍如何使用Activiti实现工作流应用,包括配置Spring环境、搭建工作流引擎、实现请假审批流程等步骤,并提供关键代码示例。
  • 首先下载插件:Activiti的插件这个插件主要通过你的流程图将其转化为xml的文件
  • Spring-mvc还是主要配置自动扫描和静态资源访问,视图解析器
  • Spring的文件主要配置自动扫描和数据源,事务管理,工作流的文件全局的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<!-- 增加事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true"></property>
<!-- 流程文件存放位置 -->
<property name="deploymentResources">
<list>
<value>classpath:/activiti/*</value>
</list>
</property>
</bean>

<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration"
ref="processEngineConfiguration"></property>
</bean>

<!-- 开发时所需要用的工作流相关service -->
<!--
runtimeService 获取流程运行时的相关信息
-->
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<!-- taskService 获取任务用 -->
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<!-- identityService 获取用户相关信息 -->
<bean id="identityService" factory-bean="processEngine"
factory-method="getIdentityService" />

</beans>
  • webxml主要配置几个文件:一个是对Spring
  • 对于xml的流程的绘制activiti进行绘制大致的流程:在这个流程的过程中我们需要对相应的模块进行起名,并且配置基本的信息–>${userId}类似于这样
  • 这里特别强调一下分支的这里有两个值pass—->value和nopass—-> value 的值,这里分支的必须在使用的时候,就会将这两个值必须一起给出,单给任何一个都不会起作用
  • 登录功能,和原来一样,给出一个用户表
  • 获取登录的对象以后将获取到的用户的对象放入到session的里面,已被后面使用,
  • 这里未使用的是mybatis 所以要在这里配置一下我们的dao层的对象放入到ioc里面,这样他才能会发挥作用
  • 首先我们要进行插入数据,其实就是一些请假的基本信息,这里的我们先拥有数据在进行和工作流程的processId进行绑定
  • 如果想要获取服务的当前的任务的id我们需要创建一个map的集合进行保存,而且集合的格式必须按照Map的格式进行的
1
Map<String,Object> paramMap = new HashMap<String,Object>();	paramMap.put("userId", loginUser.getId().toString());
  • 开启的工作流程的方法时 :

返回值就是我们需要的工作流程的id:

1
2
3
4
String proId = runtimeService
.startProcessInstanceByKey
("myProcess",paramMap)
.getProcessInstanceId();
  • 再下一个的流程中需要我们的mannager的id所以我们需要在这个流程中插到manangerid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Task task = taskService.createTaskQuery().taskAssignee
(loginUser.getId().toString()).list().get(0);
//签收
taskService.claim(task.getId(),
loginUser.getId().toString());
//在完成时需要传递该员工部门领导的id,完成时会将下个任务直接指派给该领导
//根据该员工查询到他的部门领导
Integer deptId = usersDao.getDeptManagerId
(loginUser.getDeptId());


//完成任务,进入到下一个任务
taskService.complete(task.getId(),paramMap);
//4.更新请假信息,将流程id和该数据绑定(关联)
leaveModel.setProcessId(Integer.parseInt(proId));
leaveDao.updateLeave(leaveModel);
  • 对于jdbcTemplate的基本使用:
    • jdbcTemplate.queryForObject(sql语句,所需要的参数的object的数组,返回值类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String sql = "insert into leaves(days,content,user_id) values(?,?,?)";

KeyHolder keyHolder = new GeneratedKeyHolder();
int r = jdbcTemplate.update(new PreparedStatementCreator() {

@Override
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement ps =
conn.prepareStatement
(sql,Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, leaveModel.getDays());
ps.setString(2, leaveModel.getContent());
ps.setInt(3, leaveModel.getUserId());
return ps;
}
},keyHolder);
- jdbcTemplate.update(sql,new object[]{参数})
1
2
3
4
5
6
7
8
9
10
11
/public boolean updateLeave(LeaveModel leaveModel){
String sql = "update leaves set process_id = ? where id = ?";
int r = jdbcTemplate.update(sql,
new Object[]{
leaveModel.getProcessId(),leaveModel.getId()
});
if(r == 1){
return true;
}
return false;
}
  • 关于在在插入的时候我们就可以获取当前插入时的id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public boolean insertLeave(LeaveModel leaveModel){
String sql = "insert into leaves(days,content,user_id) values(?,?,?)";
//主要通过来获取这个值
KeyHolder keyHolder = new GeneratedKeyHolder();
int r = jdbcTemplate.update(new PreparedStatementCreator() {

@Override
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement ps =
conn.prepareStatement
(sql,Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, leaveModel.getDays());
ps.setString(2, leaveModel.getContent());
ps.setInt(3, leaveModel.getUserId());
return ps;
}
},keyHolder);
//获取id
int id = keyHolder.getKey().intValue();
leaveModel.setId(id);
if(r == 1){
return true;
}
return false;
}
  • 处理任务:主要采用一个处理器,来处理两个个角色发过来的请求一个是技术总监和人事部,而人事部对于这个任务是一个群组任务,所以要进行签收,在进行处理,而技术总监属于个人任务所以直接进行处理complete();

    taskService.complete(id.toString(), paramMap);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /**
    * 处理任务
    */
    @RequestMapping("/doTask")
    public String doTask(@RequestParam(value="taskId") Integer id,
    @RequestParam(value="accept") String accept){

    Map<String, Object> paramMap = new HashMap<String, Object>();
    if(accept.equals("yes")){
    paramMap.put("pass", true);
    paramMap.put("nopass", false);
    //将该任务分配给人事部门, 成为一个公共任务,只要在人事部的员工,都可以看见
    paramMap.put("deptId", "2");
    }else{
    paramMap.put("pass", false);
    paramMap.put("nopass", true);
    //如果不同意,需要将该任务指派给填写申请的那个员工。去进行重新填写
    //要知道这个流程是哪一个员工发起的
    //根据task获取相关流程id
    String proId = taskService.createTaskQuery()
    .taskId(id.toString()).singleResult()
    .getProcessInstanceId();
    //通过proId去查询userId
    paramMap.put("userId",
    leaveDao.getUserId(proId).toString());
    }
    //处理任务
    taskService.complete(id.toString(), paramMap);
    return "redirect:/myTask";
    }

-签收任务:claim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 签收任务
*/
@RequestMapping("/doClaim")
public String doClaim(@RequestParam(value="taskId") Integer id,
HttpSession session){

UsersModel usersModel =
(UsersModel) session.getAttribute("loginUser");

//签收
taskService.claim(id.toString(),
usersModel.getId().toString());

return "redirect:/myTask";
}

  • 总结:我们采用的activiti的视图,通过它来生成xml,而框架的底层已经对于他自己建的表进行了到位的封装,所以我们需要调用他的service的方法我们就可以对数据库进行操作,通过数据在表中流向也就意味着工作到了哪一步的流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值