框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)
Posted 飛白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)相关的知识,希望对你有一定的参考价值。
BOS项目笔记第11天
内容:
1、提供新的json文件,修改系统菜单(加入工作流的菜单)
2、流程定义管理(查询、部署流程、查看png流程图片)
3、流程实例管理(查询、查看运行状态)
4、将bos系统中的用户数据和角色数据同步到activiti的用户表和组表
1. 提供新的json文件,修改系统菜单(加入工作流的菜单)
2. 流程定义管理
第一步:创建一个ProcessDefinitionAction,提供list方法,并注入流程引擎对象
查询
@Controller
@Scope("prototype")
public class ProcessDefinitionAction extends ActionSupport {
@Resource
private ProcessEngine processEngine;
/**
* 查询最新版本的流程定义列表数据
*/
public String list() {
ProcessDefinitionQuery query = processEngine.getRepositoryService()
.createProcessDefinitionQuery();
query.latestVersion();
List<ProcessDefinition> list = query.list();
// 压栈
ActionContext.getContext().getValueStack().set("list", list);
return "list";
}
第二步:配置struts.xml
第三步:提供processdefinition_list.jsp页面,展示流程定义数据
<body class="easyui-layout">
<div region="center" >
<table id="grid" class="easyui-datagrid">
<thead>
<tr>
<th data-options="field:'id'" width="120">流程编号</th>
<th data-options="field:'name'" width="200">流程名称</th>
<th data-options="field:'key'" width="100">流程key</th>
<th data-options="field:'version'" width="80">版本号</th>
<th data-options="field:'viewpng'" width="200">查看流程图</th>
</tr>
</thead>
<tbody>
<s:iterator value="list" var="processDefinition">
<!-- 在循环过程中 ,将 processDefinition 对象,同时放入 root 和 map 中-->
<tr>
<td>
<s:property value="id"/> <!-- 从root找 -->
<%--
<s:property value="#processDefinition.id"/> <!-- 从map找 -->
--%>
</td>
<td><s:property value="name"/>
</td>
<td><s:property value="key"/></td>
<td><s:property value="version"/></td>
<td>
<a οnclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"
class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图
</a>
</td>
</tr>
</s:iterator>
</tbody>
</table>
</div>
2.1 部署流程定义
第一步:提供文件上传的页面
<s:form action="processDefinitionAction_deploy" theme="simple" method="post"
enctype="multipart/form-data" id="uploadForm">
<table class="table-edit" width="100%" >
<tr class="title"><td colspan="2">发布新流程</td></tr>
<tr>
<td width="200">浏览流程定义zip压缩文件</td>
<td>
<input type="file" name="deploy" />
</td>
</tr>
<tr>
<td colspan="2">
<a id="btn" href="javascript:$('#uploadForm').submit();"
class="easyui-linkbutton" data-options="iconCls:'icon-save'">发布新流程</a>
</td>
</tr>
</table>
</s:form>
第二步:在ProcessDefinitionAction中提供deploy方法,提供File类型的属性deploy
// 接收上传的文件
private File deploy;// zip文件
public void setDeploy(File deploy) {
this.deploy = deploy;
}
/**
* 部署流程定义
*
* @throws Exception
*/
public String deploy() throws Exception {
DeploymentBuilder deploymentBuilder = processEngine
.getRepositoryService().createDeployment();
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(
deploy));
deploymentBuilder.addZipInputStream(zipInputStream);
deploymentBuilder.deploy();
return "toList";
}
第三步:配置struts.xml
2.2 查看流程图片
第一步:修改processdefintion_list.jsp页面中链接按钮的地址
<a οnclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"
class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图
</a>
第二步:在Action中提供showpng方法,获取对应的png图片的输入流
//接收流程定义ID
private String pdId;
public void setPdId(String pdId) {
this.pdId = pdId;
}
/**
* 查看png图片
*/
public String showpng(){
//processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
InputStream pngStream = processEngine.getRepositoryService().getProcessDiagram(pdId);
ActionContext.getContext().getValueStack().set("pngStream", pngStream);
//使用struts2的文件下载功能展示png图片
return "showpng";
}
第三步:配置struts.xml
<!-- 流程定义管理Action -->
<action name="processDefinitionAction_*" class="processDefinitionAction"
method="{1}">
<result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp
</result>
<!-- <result name="toList" type="redirectAction"> <param name="namespace">/</param>
<param name="actionName">processDefinitionAction_list</param> </result> -->
<result name="toList" type="redirectAction">
processDefinitionAction_list
</result>
<result name="showpng" type="stream">
<param name="contentType">image/png</param>
<param name="inputName">pngStream</param>
<!--
<param name="contentDisposition">attachment;filename="document.pdf"</param>
<param name="bufferSize">1024</param>
-->
</result>
</action>
3. 流程实例管理
3.1 查看正在运行的流程实例
第一步:创建ProcessInstanceAction,提供list方法,查询流程实例列表数据
@Controller
@Scope("prototype")
public class ProcessInstanceAction extends ActionSupport {
@Autowired
private ProcessEngine processEngine;
/**
* 查询正在运行的流程实例数据
*/
public String list() {
// 流程实例查询对象,查询表act_ru_execution
ProcessInstanceQuery query = processEngine.getRuntimeService()
.createProcessInstanceQuery();
query.orderByProcessDefinitionKey().desc();
List<ProcessInstance> list = query.list();
ActionContext.getContext().getValueStack().set("list", list);
return "list";
}
第二步:配置struts.xml
第三步:提供processinstance_list.jsp页面,展示列表数据
<body class="easyui-layout">
<div region="center">
<table id="grid" class="easyui-datagrid">
<thead>
<tr>
<th data-options="field:'id'" width="60">实例编号</th>
<th data-options="field:'name'" width="150">流程定义编号</th>
<th data-options="field:'activity'" width="150">运行到哪个任务</th>
<th data-options="field:'viewRuntime'" width="500">业务数据</th>
<th data-options="field:'viewpng'" width="200">查看流程图</th>
</tr>
</thead>
<tbody>
<s:iterator value="list">
<tr>
<td>${id }</td>
<td>${processDefinitionId }</td>
<td>${activityId }</td>
<td>
<div id="div${id }"></div>
<script type="text/javascript">
//根据流程实例id查询流程变量
$.post("${pageContext.request.contextPath}/processInstanceAction_findData.action",{"id":'${id}'},function(data){
$("#div${id}").html(data);
});
</script>
</td>
<td>
<script type="text/javascript">
function showPng(id){
window.showModalDialog("processInstanceAction_showPng.action?id="+id);
}
</script>
<a data-options="iconCls:'icon-search'" class="easyui-linkbutton"
οnclick="showPng('${id}');" href="#">查看流程图</a>
</td>
</tr>
</s:iterator>
</tbody>
</table>
</div>
</body>
第四步:在Action中提供findData方法,根据流程实例ID查询对应的流程变量
// 接收流程实例ID
private String id;
public void setId(String id) {
this.id = id;
}
/**
* 根据流程实例ID查询流程变量
*
* @throws IOException
*/
public String findData() throws IOException {
Map<String, Object> variables = processEngine.getRuntimeService()
.getVariables(id);
ServletActionContext.getResponse().setContentType(
"text/html;charset=UTF-8");
ServletActionContext.getResponse().getWriter().print(variables);
return NONE;
}
3.2 查询流程实例运行状态(图片显示)
第一步:在流程实例列表页面,修改链接按钮的地址
效果
第二步:在Action中提供showPng方法,查询部署ID,图片名称,任务坐标
/**
* 流程任务获取图片数据
*
* @return
*/
public String showPng() {
// 通过流程实例获取流程定义id
ProcessInstance processInstance = processEngine.getRuntimeService()
.createProcessInstanceQuery().processInstanceId(id)
.singleResult();
String processDefinitionId = processInstance.getProcessDefinitionId();
// 通过流程定义id获取流程定义对象,然后获取部署id和图片名称
ProcessDefinition processDefinition = processEngine
.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
String deploymentId = processDefinition.getDeploymentId();
String imageName = processDefinition.getDiagramResourceName();
// 通过流程定义id获取详细(包含坐标)的流程定义对象
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processEngine
.getRepositoryService().getProcessDefinition(
processDefinitionId);
String activityId = processInstance.getActivityId();
//通过活动id获取活动(当前任务)对象
ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);
//获取图片参数
int x = activityImpl.getX();
int y = activityImpl.getY();
int height = activityImpl.getHeight();
int width = activityImpl.getWidth();
//把所有参数都放到值栈
Map<String,Object> map=new HashMap<String, Object>();
map.put("deploymentId", deploymentId);
map.put("imageName", imageName);
map.put("x", x);
map.put("y", y);
map.put("height", height);
map.put("width", width);
ActionContext.getContext().getValueStack().push(map);
return "image";
}
提取工具类:ActivitiUtils
public class ActivitiUtils {
public static Map<String, Object> findDataByInstanceId(
ProcessEngine processEngine, String id) {
// 查询部署ID、png图片名称、当前流程任务的坐标
ProcessInstanceQuery query = processEngine.getRuntimeService()
.createProcessInstanceQuery();
// 根据流程实例ID查询流程实例对象
query.processInstanceId(id);
ProcessInstance processInstance = query.singleResult();
// 根据流程实例对象查询流程定义ID
String processDefinitionId = processInstance.getProcessDefinitionId();
// 根据流程定义ID查询流程定义对象
ProcessDefinitionQuery query2 = processEngine.getRepositoryService()
.createProcessDefinitionQuery();
query2.processDefinitionId(processDefinitionId);
ProcessDefinition processDefinition = query2.singleResult();
// 获得当前流程实例执行到那个任务了
String activityId = processInstance.getActivityId();// usertask2
// 根据流程定义ID查询流程定义对象(包含有坐标信息)
ProcessDefinitionEntity processDefinition2 = (ProcessDefinitionEntity) processEngine
.getRepositoryService().getProcessDefinition(
processDefinitionId);
ActivityImpl activityImpl = processDefinition2.findActivity(activityId);
int x = activityImpl.getX();
int y = activityImpl.getY();
int width = activityImpl.getWidth();
int height = activityImpl.getHeight();
Map<String, Object> map = new HashMap<String, Object>();
map.put("deploymentId", processDefinition.getDeploymentId());
map.put("imageName", processDefinition.getDiagramResourceName());
map.put("x", x);
map.put("y", y);
map.put("width", width);
map.put("height", height);
return map;
}
}
第三步:配置struts.xml
第四步:提供image.jsp页面,展示图片和div
<body>
<!-- 1.获取到规则流程图 -->
<img style="position: absolute;top: 0px;left: 0px;"
src="processInstanceAction_viewImage?deploymentId=${deploymentId }&imageName=${imageName}">
<!-- 2.根据当前活动的坐标,动态绘制DIV -->
<div style="position: absolute;border:1px solid red;
top:${y-1}px;left:${x-1}px;width:${width}px;height:${height}px;">
</div>
</body>
第五步:在Action中提供viewImage方法,查询png图片的输入流
//接收图片src传递过来的参数
String deploymentId;
String imageName;
public void setDeploymentId(String deploymentId) {
this.deploymentId = deploymentId;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
/**
* 查询png图片的输入流,展示图片
*/
public String viewImage() {
InputStream pngStream = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, imageName);
ActionContext.getContext().getValueStack().set("pngStream", pngStream);
return "viewImage";
}
第六步:配置struts.xml,使用文件下载
<!-- 流程实例管理Action -->
<action name="processInstanceAction_*" class="processInstanceAction" method="{1}">
<result name="list">/WEB-INF/pages/workflow/processinstance_list.jsp</result>
<result name="showPng">//WEB-INF/pages/workflow/image.jsp</result>
<result name="viewImage" type="stream">
<param name="contentType">image/png</param>
<param name="inputName">pngStream</param>
</result>
</action>
4. 将bos系统中的用户和组同步到activiti中
以上是关于框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)的主要内容,如果未能解决你的问题,请参考以下文章
框架 day55 BOS项目练习(工作流,activiti入门)
框架 day49 BOS项目练习3(修复window控件BUG,添加/修改/作废取派员,datagrid使用,分页查询(DetachedCriteria离线),formatter函数)
BOS项目 第10天(activiti工作流第二天,流程变量组任务排他网关spring整合activiti项目中实现流程定义管理)
BOS项目 第11天(activiti工作流第三天,流程实例管理项目中的用户和角色同步到activiti的用户和组表设计物流配送流程启动物流配送流程组任务操作(查询拾取)个人任务操作(查询