在工作流开发过程中经常会使用一些主流的工作流框架,这些框架是否强大灵活,但往往需要引入大量的资源,增加了工程的复杂度。简易工作流控制框架是一个可以独立嵌入到java工程或者与Spring整合的简易工作流程框架,可以适应一些只需要简单审核审批业务场景的开发,开发简单,极少的依赖,不对工程已有业务带来大影响。

项目依赖

aspectjweaver、spring-core、spring-beans、spring-context

使用说明

###一、开发步骤
1、添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.github.zone7</groupId>
<artifactId>zone7-flow</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

</dependencies>

2、spring 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- 流程管理.开始 -->
<bean id="flowPersistance" class="com.github.zone7.admin.bean.FlowPersistanceImpl"></bean>

<bean id="businessEventFactory" class="com.github.zone7.flow.spring.common.BusinessEventFactoryImpl"></bean>

<bean id="taskService" class="com.github.zone7..flow.spring.service.impl.TaskServiceImpl">
<property name="flowPersistance" ref="flowPersistance"></property>
<property name="businessEventFactory" ref="businessEventFactory"></property>
</bean>

<bean id="flowAdvising" class="com.github.zone7.flow.spring.common.FlowAspect">
<property name="taskService" ref="taskService"></property>
</bean>

<aop:config>
<aop:aspect ref="flowAdvising">
<aop:pointcut id="performance" expression="execution(* com.github.zone7.*.*.service.*.*(com.github.zone7.flow.spring.common.FlowAttribute,..)) and @annotation(flow) and args(attr,..)" />
<aop:around pointcut-ref="performance" method="round" />
</aop:aspect>
</aop:config>
<!-- 流程管理.结束 -->

####3、开发持久化类FlowPersistanceImpl
必须是IFlowPersistance接口的实现,可直接使用Demo中的持久化类

####4、开发业务流程事件类
事件类包含流程开始、结束;流程环节的开始、结束等事件。
例如:
@Component(value=”businessEvent”)
public class BusinessEventImpl extends AbstractBusinessEvent {
}
详细内容可参考Demo

####5、配置业务类型表Business
为每一个业务添加一条记录。
Action 配置流程事件类的服务名;
ViewURL字段为经办界面还原的视图,在审核审批过程中,显示需要查看的内容。
Businessid字段需要开发人员记住,建议设置为一个有逻辑意义的字符串。

以上是手动配置,也可以通过系统的图形化界面配置。

####6、配置流程表 Procedure
流程表由流程ID、机构ID、业务ID组成,表示一种业务,不同的机构可以定义不同的流程。
以上是手动配置,也可以通过系统的图形化界面配置。

####7、配置流程环节表 Step

流程环节表示流程中一个环节的定义。包括流程ID、流程环节ID、流程环节名称、上级节点、下级节点、分配方式等。

以上是手动配置,也可以通过系统的图形化界面配置。

####8、配置流程环节权限表 Stepgant

可以给流程环节分配权限,可以按用户ID、角色ID或者机构ID分配权限。
以上是手动配置,也可以通过系统的图形化界面配置。

####9、开发与流程相关的业务代码
与提交审核审批相关的服务代码,需要在函数前使用注解“@Flow”,并且函数的第一个入参数必须是FlowAttribute 。在调用提交审核审批的时候需要将FlowAttrribute参数传进去,FlowAttribute 包含businessid、taskid、userid等属性,以确保系统可以获取到流程相关内容。
例如:

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
33
34
35
36
37
38
39
40
41
42
43
44
//服务层代码 Service
@Override
@Flow
public FlowtestModel commit(FlowAttribute attr1,String id) {
String taskid=attr1.getTaskid();
Flowtest test = flowtestDAO.get(Flowtest.class, id);
if(test==null){
new BusinessException("数据不存在");
}
test.setTaskid(taskid);
flowtestDAO.update(test);
FlowtestModel flowtest=new FlowtestModel();
BeanUtils.copyProperties(test, flowtest);
return flowtest;
}

//控制层代码 Controller
@RequestMapping("/commit")
@ResponseBody
public FlowtestModel commit(FlowtestModel model,
HttpServletRequest req,HttpServletResponse res){
//随机产生一个任务ID
String taskid=UUID.randomUUID().toString().replaceAll("-", "");
FlowAttribute attr=new FlowAttribute();
attr.setTaskid(taskid);

//配置业务类型编码参考Business表
attr.setBusinessid("1");

//设置当前用户的组织机构编号
attr.setGroupid("0");

//设置当前用户的Id
attr.setUserid(getCurrentUser().getUserid());

model = flowtestService.get(model.getId());

Map params= MapBeanUtil.beanToMap(model);
attr.setParams(params);

FlowtestModel f = flowtestService.commit(attr,model.getId());

return f;
}

###二、表结构说明

####1、业务类型表Business

1
2
3
4
5
6
7
8
9
10
11
名称	类型	可否为空	默认值	描述
BUSINESSID VARCHAR2(32) 否 主键
业务类型ID
BUSINESSNAME VARCHAR2(100) 否 业务名称
ACTIVE VARCHAR2(1) 否 default '1' 是否可用
ACTION VARCHAR2(500) 是 事件服务名称
VIEWURL VARCHAR2(500) 是 审核审核
查看明细页面
BUSINESSURL VARCHAR2(500) 是 经办页面
ALLOWCROSS VARCHAR2(1) 是 是否交叉授权
预留

####2、业务流程表 Procedure

1
2
3
4
5
6
7
8
名称	类型	可否为空	默认值	描述
PROCEDUREID VARCHAR2(32) 否 主键
业务流程ID
PROCEDURENAME VARCHAR2(50) 否 业务流程名称
ACTIVE VARCHAR2(1) 否 default '1' 是否可用
BUSINESSID VARCHAR2(32) 是 业务类型ID
GROUPID VARCHAR2(32) 是 机构ID
PROCEDUREDESC VARCHAR2(100) 是 描述

####3、业务流程环节表Step

1
2
3
4
5
6
7
8
9
10
11
12
名称	类型	可否为空	默认值	描述
STEPID VARCHAR2(32) 否 主键
业务环节ID
PROCEDUREID VARCHAR2(32) 否 流程ID
PREVIOUSSTEPID VARCHAR2(32) 是 上级流程ID
NEXTSTEPID VARCHAR2(32) 是 下级流程ID
STEPNAME VARCHAR2(100) 否 流程环节名称
FLOWTYPE VARCHAR2(3) 是 流程环节类型
REFUSERULE VARCHAR2(3) 是 拒绝规则
ACTION VARCHAR2(500) 是 事件类
ASSIGNRULE VARCHAR2(3) 是 分发规则
URL VARCHAR2(500) 是 预留

####4、业务流程环节权限stepgrant

1
2
3
4
5
6
7
8
9
10
名称	类型	可否为空	默认值	描述
FLOWGRANTID VARCHAR2(32) 否 主键
STEPID VARCHAR2(32) 否 流程环节ID
USERID VARCHAR2(32) 是 用户ID
GROUPID VARCHAR2(32) 是 机构ID
ROLEID VARCHAR2(32) 是 角色ID
ALLOWGRANT VARCHAR2(1) 是 0 是否允许授权
STARTTIME DATE 是 起始时间
ENDTIME DATE 是 截止时间
DESCRIPTIOIN VARCHAR2(500) 是 描述

####5、业务流程任务stepTASK

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
    名称	类型	可否为空	默认值	描述
TASKID VARCHAR2(32) 否 主键
BUSINESSID VARCHAR2(32) 是 业务ID
BUSINESSNAME VARCHAR2(100) 是 业务名称
STEPID VARCHAR2(32) 是 环节ID
STEPNAME VARCHAR2(100) 是 角色ID
USERID VARCHAR2(32) 是 用户ID
NEXTSTEPID VARCHAR2(32) 是 下级流程ID
NEXTSTEPNAME VARCHAR2(100) 是 下级流程名称
NEXTUSERID VARCHAR2(32) 是 下级流程指派用户ID
TASKSTATE VARCHAR2(3) 是 任务状态
1任务未领取,
2任务已领取,
3 任务完成
CONTENT VARCHAR2(100) 是 内容描述
RESULT VARCHAR2(3) 是 审核结果
CREATETIME timestamp 是 创建时间
UPDATETIME timestamp 是 更新时间
TASKLEVEL NUMBER 是 任务级别
```

####6、任务数据明细steptaskinfo
```text
名称 类型 可否为空 默认值 描述
taskinfoid VARCHAR2(32) 否 主键
taskid VARCHAR2(32) 是 任务ID
name VARCHAR2(50) 是 字段名称
value VARCHAR2(500) 是 字段值

####7、任务日志表stepTASKLOG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
名称	类型	可否为空	默认值	描述
TASKLOGID VARCHAR2(32) 否 主键
TASKID VARCHAR2(32) 否 任务ID
BUSINESSID VARCHAR2(32) 是 业务ID
BUSINESSNAME VARCHAR2(100) 是 业务名称
STEPID VARCHAR2(32) 是 环节ID
STEPNAME VARCHAR2(100) 是 角色ID
USERID VARCHAR2(32) 是 用户ID
TASKSTATE VARCHAR2(3) 是 任务状态
1任务未领取,
2任务已领取,
3 任务完成
CONTENT VARCHAR2(100) 是 内容描述
RESULT VARCHAR2(3) 是 审核结果
CREATETIME timestamp 是 创建时间
UPDATETIME timestamp 是 更新时间
TASKLEVEL NUMBER 是 任务级别
ISCANCEL VARCHAR2(1)
是 是否已经撤销