工作流本次是用在了物流管理系统中。使用Spring+struts+hibernate+shiro+activiti5开发.
主要说下activiti5。activiti5共有23张表,分别解释如下:
ACT_RE_:RE表示repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等)。
ACT_RU_:RU表示runtime。这些运行时的表,包括流程实例、任务、变量、异步任务等运行中的数据。Activiti只在流程实例执行过程总保存这些数据,在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
ACT_ID_:ID表示identity。这些表包含身份信息,比如用户、组等等。
ACT_HI_:HI表示history。这些表包括历史数据,比如历史流程实例、变量、任务等等。
ACT_GE_*:通用数据,用于不同场景下,如存放资源文件。
资源库流程规则表
- act_re_deployment 部署信息表
- act_re_model 流程设计模型部署表
- act_re_procdef 流程定义数据表
运行时数据库表
- act_ru_execution运行时流程执行实例表
- act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息
- act_ru_task运行时任务节点表
- act_ru_variable运行时流程变量数据表
历史数据库表
- act_hi_actinst 历史节点表
- act_hi_attachment历史附件表
- act_hi_comment历史意见表
- act_hi_identitylink历史流程人员表
- act_hi_detail历史详情表,提供历史变量的查询
- act_hi_procinst历史流程实例表
- act_hi_taskinst历史任务实例表
- act_hi_varinst历史变量表
组织机构表
- act_id_group用户组信息表
- act_id_info用户扩展信息表
- act_id_membership用户与用户组对应信息表
- act_id_user用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
通用数据表
- act_ge_bytearray二进制数据表
- act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
Activiti框架提供的Service对象。
1.RepositoryService 操作静态的资源(流程定义、bpmn、png).
2.RuntimeService 操作流程实例(启动流程实例、查询流程实例、结束流程实例)。
3.TaskService 操作任务(查询任务,办理任务)
4.HisrtoryService 操作历史数据。
下面讲述工作流程的启动过程:
1.部署流程定义
// 注入Service
@Autowired
private RepositoryService repositoryService;
/**
* 部署流程定义
* @throws FileNotFoundException
*/
public String deploy() throws FileNotFoundException {
DeploymentBuilder deploymentBuilder = repositoryService
.createDeployment();
deploymentBuilder.addZipInputStream(new ZipInputStream(
new FileInputStream(zipFile)));
deploymentBuilder.deploy();
return "toList";
}
/**
* 查询最新版本流程定义列表数据
*/
public String list() {
ProcessDefinitionQuery query = repositoryService
.createProcessDefinitionQuery();
query.latestVersion();// 查询最新版本
query.orderByProcessDefinitionName().desc();// 排序
List<ProcessDefinition> list = query.list();// 执行查询
// 压栈
ActionContext.getContext().getValueStack().set("list", list);
return "list";
}
/**可以在前台查看流程图
* 展示png图片
*/
public String showpng(){
//获取png图片对应的输入流
InputStream pngStream = repositoryService.getProcessDiagram(id);
ActionContext.getContext().getValueStack().set("pngStream", pngStream);
return "showpng";
}
/**前台删除流程图。
* 删除流程定义
*/
public String delete(){
String deltag = "0";
//根据流程定义id查询部署id
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
query.processDefinitionId(id);//根据id过滤
ProcessDefinition processDefinition = query.singleResult();
String deploymentId = processDefinition.getDeploymentId();
try{
repositoryService.deleteDeployment(deploymentId);
}catch (Exception e) {
//当前要删除的流程定义正在使用
deltag = "1";
ActionContext.getContext().getValueStack().set("deltag", deltag);
ProcessDefinitionQuery query2 = repositoryService
.createProcessDefinitionQuery();
query2.latestVersion();// 查询最新版本
query2.orderByProcessDefinitionName().desc();// 排序
List<ProcessDefinition> list = query2.list();// 执行查询
// 压栈
ActionContext.getContext().getValueStack().set("list", list);
return "list";
}
return "toList";
}
2.部署流程定义后,进行工作单快速录入:
工作单是需要快递的商品,增加完工作单后,工作单会在启动配送流程中展示出来:
点击启动按钮,代码实现如下:
/**
* 启动物流配送流程
* @return
*/
public String start(){
//启动流程实例,设置流程变量,修改工作单中start为1
String id = model.getId();//工作单id
WorkordermanageService.start(id);
return "toList";
}
//启动流程实例,设置流程变量,修改工作单中start为1
public void start(String id) {
//
Workordermanage workordermange = workordermanageDao.findById(id);
workordermange.setStart("1");//已启动
String processDefinitionKey = "transfer";
String businessKey = id;//业务主键---等于业务表(工作单)主键值
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("业务数据", workordermange);
runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
}
此时流程实例已经启动,查看正在运行的流程实例:
点击查看流程图:
查看我的组任务:
代码如下:
@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private IWorkordermanageService workordermanageService;
/**
* 查询组任务
* @return
*/
public String findGroupTask(){
TaskQuery query = taskService.createTaskQuery();
String candidateUser = BOSContext.getLoginUser().getId();
//组任务过滤
query.taskCandidateUser(candidateUser);
List<Task> list = query.list();
ActionContext.getContext().getValueStack().set("list", list);
return "groupTaskList";
}
/**查看业务数据
* 根据任务id查询对应的流程变量数据
* @return
* @throws IOException
*/
public String showData() throws IOException{
Map<String,Object> variables = taskService.getVariables(taskId);
ServletActionContext.getResponse().setContentType("text/html;charset = utf-8");
ServletActionContext.getResponse().getWriter().print(variables.toString());
return NONE;
}
点击拾取:
点击拾取:
public String takeTask(){
String userId = BOSContext.getLoginUser().getId();
taskService.claim(taskId, userId);
return "togrouptasklist";
}
办理任务:
提交:
/**
* 办理流程审核工作单信息
*/
public String checkWorkOrderManage(){
//跳转到一个审核工作单界面,展示当前对应的工作单信息
//根据任务id查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//根据任务对象查询流程实例ID
String processInstanceId = task.getProcessInstanceId();
//根据流程实例id查询流程实例对象
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
String workOrderManageId = processInstance.getBusinessKey();
Workordermanage workordermanage = workordermanageService.findById(workOrderManageId);
if(check ==null){
//跳转到审核界面
ActionContext.getContext().getValueStack().set("map", workordermanage);
return "check";
}else{
//办理审核工作单任务
workordermanageService.checkWorkOdrManage(taskId,check,workOrderManageId);
return "topersonaltasklist";
}
}
public void checkWorkOdrManage(String taskId, Integer check, String workOrderManageId) {
//如果审核不通过,修改工作单start为0
Workordermanage workordermanage = workordermanageDao.findById(workOrderManageId);
//根据任务id查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//根据任务对象查询流程实例ID
String processInstanceId = task.getProcessInstanceId();
// 办理审核工作单任务
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("check", check);
taskService.complete(taskId,variables);
if(check ==0){
//审核不通过
workordermanage.setStart("0");
//删除历史流程实例数据
historyService.deleteHistoricProcessInstance(processInstanceId);
}
}
/**
* 办理出库任务
*/
public String outStore(){
taskService.complete(taskId);
return "topersonaltasklist";
}
/**
* 办理配送任务
*/
public String transferGoods(){
taskService.complete(taskId);
return "topersonaltasklist";
}
/**
* 办理签收任务
*/
public String receive(){
taskService.complete(taskId);
return "topersonaltasklist";
}