框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)
来源:互联网 发布:php常用网页代码 编辑:程序博客网 时间:2024/05/22 07:00
BOS项目笔记第11天
内容:
1、提供新的json文件,修改系统菜单(加入工作流的菜单)
2、流程定义管理(查询、部署流程、查看png流程图片)
3、流程实例管理(查询、查看运行状态)
4、将bos系统中的用户数据和角色数据同步到activiti的用户表和组表
1. 提供新的json文件,修改系统菜单(加入工作流的菜单)
2. 流程定义管理
第一步:创建一个ProcessDefinitionAction,提供list方法,并注入流程引擎对象
查询
@Controller@Scope("prototype")public class ProcessDefinitionAction extends ActionSupport {@Resourceprivate 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 onclick="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 onclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图 </a>
第二步:在Action中提供showpng方法,获取对应的png图片的输入流
//接收流程定义IDprivate 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 {@Autowiredprivate ProcessEngine processEngine;/** * 查询正在运行的流程实例数据 */public String list() {// 流程实例查询对象,查询表act_ru_executionProcessInstanceQuery 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" onclick="showPng('${id}');" href="#">查看流程图</a> </td> </tr> </s:iterator> </tbody> </table> </div></body>
第四步:在Action中提供findData方法,根据流程实例ID查询对应的流程变量
// 接收流程实例IDprivate 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() {// 通过流程实例获取流程定义idProcessInstance 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();// 根据流程实例对象查询流程定义IDString 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中
同步用户
//添加用户,同步到activiti的act_id_user act_id_mebershippublic void save(User user, String[] roleIds) {String password = user.getPassword();//使用md5加密password = MD5Utils.md5(password);user.setPassword(password);userDao.save(user);//持久对象//添加activiti UserEntityorg.activiti.engine.identity.User actUser = new UserEntity();actUser.setId(user.getId());processEngine.getIdentityService().saveUser(actUser);//操作act_id_userfor (String id : roleIds) {Role role = roleDao.findById(id);//用户关联角色 user.getRoles().add(role);//将ac用户加入到ac组中 role.getName()使用角色名字做为组ID方便阅读processEngine.getIdentityService().createMembership(actUser.getId(), role.getName());}}
同步组
//保存角色,同步到activiti的act_id_grouppublic void save(Role model, String funcitonIds) {roleDao.save(model);//持久对象//创建ac组并添加Group group = new GroupEntity();group.setId(model.getName());group.setName(model.getName());processEngine.getIdentityService().saveGroup(group );String[] ids = funcitonIds.split(",");for (String id : ids) {Function function = new Function();function.setId(id);model.getFunctions().add(function);//角色关联权限}}
- 框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)
- BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)
- 框架 day54 BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- 框架 day58 BOS项目练习(基于activiti物流配送流程,启动,查询,办理,项目知识点复习)
- 框架 day56 BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)
- 框架 day55 BOS项目练习(工作流,activiti入门)
- BOS项目练习(工作流,activiti入门)
- BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- BOS项目练习(基于activiti物流配送流程,启动,查询,办理,项目知识点复习)
- BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)
- 框架 day53 BOS项目练习(权限概述,权限数据模型,shiro入门{bos中应用})
- activiti用户角色权限与自身系统用户角色同步
- BOS项目
- web项目用户角色管理
- 框架 day47 BOS项目练习1(项目概述,环境,页面[easyUI,Ztree],数据库PowerDesigner)
- Struts2-03-拦截器(BOS物流项目用户登录拦截)
- BOS工作流流程分析
- bos webservice开发流程
- Linux内核代码风格
- 总结
- 看开源代码如何解析ELF文件
- Linux环境下段错误的产生原因及调试方法小结
- tomcat9 http2.0 mac 配置方法
- 框架 day57 BOS项目练习(流程定义/实例管理,bos用户角色同步activiti用户表组表)
- linux服务器开发需要掌握多少门语言
- web 应用程序开发原理
- link,unlink,rename函数之解析
- web 应用程序开发原理二
- 【Debug】WTL 'uicc.exe' 不是内部或外部命令,也不是可运行的程序
- 盖游戏板
- Ubuntu14.04 64位系统下安装python3.4对应的opencv3.0报错recompile with -fPIC 的解决办法
- Linux C 学习 单向链表