BOS项目11:流程定义/实例管理,bos用户角色同步activiti用户表组表


内容:

1、提供新的json文件,修改系统菜单(加入工作流的菜单)

2、流程定义管理(查询、部署流程、查看png流程图片)

3、流程实例管理(查询、查看运行状态)

4、将bos系统中的用户数据和角色数据同步到activiti的用户表和组表

 

1.    提供新的json文件,修改系统菜单(加入工作流的菜单)

2.    流程定义管理

第一步:创建一个ProcessDefinitionAction,提供list方法,并注入流程引擎对象

 查询

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Controller  
  2. @Scope("prototype")  
  3. public class ProcessDefinitionAction extends ActionSupport {  
  4.     @Resource  
  5.     private ProcessEngine processEngine;  
  6.   
  7.     /** 
  8.      * 查询最新版本的流程定义列表数据 
  9.      */  
  10.     public String list() {  
  11.         ProcessDefinitionQuery query = processEngine.getRepositoryService()  
  12.                 .createProcessDefinitionQuery();  
  13.         query.latestVersion();  
  14.         List<ProcessDefinition> list = query.list();  
  15.         // 压栈  
  16.         ActionContext.getContext().getValueStack().set("list", list);  
  17.         return "list";  
  18.     }  

第二步:配置struts.xml

第三步:提供processdefinition_list.jsp页面,展示流程定义数据

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <body class="easyui-layout">  
  2.   <div region="center" >  
  3.     <table id="grid" class="easyui-datagrid">    
  4.         <thead>  
  5.             <tr>  
  6.                 <th data-options="field:'id'" width="120">流程编号</th>  
  7.                 <th data-options="field:'name'" width="200">流程名称</th>  
  8.                 <th data-options="field:'key'" width="100">流程key</th>  
  9.                 <th data-options="field:'version'" width="80">版本号</th>  
  10.                 <th data-options="field:'viewpng'" width="200">查看流程图</th>  
  11.             </tr>  
  12.         </thead>  
  13.         <tbody>  
  14.                 <s:iterator value="list" var="processDefinition">  
  15.                     <!-- 在循环过程中 ,将  processDefinition 对象,同时放入 root 和 map 中-->  
  16.                 <tr>  
  17.                     <td>  
  18.                         <s:property value="id"/> <!-- 从root找 -->  
  19.                         <%--  
  20.                         <s:property value="#processDefinition.id"/> <!-- 从map找 -->  
  21.                          --%>  
  22.                            
  23.                     </td>  
  24.                     <td><s:property value="name"/>  
  25.                     </td>  
  26.                     <td><s:property value="key"/></td>  
  27.                     <td><s:property value="version"/></td>  
  28.                     <td>  
  29.                         <a onclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"   
  30.                          class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图  
  31.                         </a>  
  32.                     </td>  
  33.                 </tr>  
  34.                 </s:iterator>  
  35.         </tbody>  
  36.     </table>  
  37.   </div>  

 

2.1   部署流程定义


第一步:提供文件上传的页面

 

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <s:form action="processDefinitionAction_deploy" theme="simple" method="post"  
  2.      enctype="multipart/form-data" id="uploadForm">  
  3.     <table class="table-edit" width="100%" >  
  4.         <tr class="title"><td colspan="2">发布新流程</td></tr>  
  5.         <tr>  
  6.             <td width="200">浏览流程定义zip压缩文件</td>  
  7.             <td>  
  8.                 <input type="file" name="deploy" />  
  9.             </td>  
  10.         </tr>  
  11.         <tr>  
  12.             <td colspan="2">  
  13.                 <a id="btn" href="javascript:$('#uploadForm').submit();"   
  14.                 class="easyui-linkbutton" data-options="iconCls:'icon-save'">发布新流程</a>    
  15.             </td>  
  16.         </tr>  
  17.     </table>  
  18. </s:form>  


第二步:在ProcessDefinitionAction中提供deploy方法,提供File类型的属性deploy

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 接收上传的文件  
  2. private File deploy;// zip文件  
  3. public void setDeploy(File deploy) {  
  4.     this.deploy = deploy;  
  5. }  
  6. /** 
  7.  * 部署流程定义 
  8.  *  
  9.  * @throws Exception 
  10.  */  
  11. public String deploy() throws Exception {  
  12.     DeploymentBuilder deploymentBuilder = processEngine  
  13.             .getRepositoryService().createDeployment();  
  14.     ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(  
  15.             deploy));  
  16.     deploymentBuilder.addZipInputStream(zipInputStream);  
  17.     deploymentBuilder.deploy();  
  18.     return "toList";  
  19. }  

第三步:配置struts.xml

 

 

2.2   查看流程图片


第一步:修改processdefintion_list.jsp页面中链接按钮的地址

 

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <a onclick="window.showModalDialog('processDefinitionAction_showpng.action?pdId=${id }')"   
  2.  class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图  
  3. </a>  

第二步:在Action中提供showpng方法,获取对应的png图片的输入流

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收流程定义ID  
  2. private String pdId;  
  3. public void setPdId(String pdId) {  
  4.     this.pdId = pdId;  
  5. }  
  6. /** 
  7.  * 查看png图片 
  8.  */  
  9. public String showpng(){  
  10.     //processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);  
  11.     InputStream pngStream = processEngine.getRepositoryService().getProcessDiagram(pdId);  
  12.     ActionContext.getContext().getValueStack().set("pngStream", pngStream);  
  13.     //使用struts2的文件下载功能展示png图片  
  14.     return "showpng";  
  15. }  

第三步:配置struts.xml

 

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 流程定义管理Action -->  
  2. <action name="processDefinitionAction_*" class="processDefinitionAction"  
  3.     method="{1}">  
  4.     <result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp  
  5.     </result>  
  6.     <!-- <result name="toList" type="redirectAction"> <param name="namespace">/</param>   
  7.         <param name="actionName">processDefinitionAction_list</param> </result> -->  
  8.     <result name="toList" type="redirectAction">  
  9.         processDefinitionAction_list  
  10.     </result>  
  11.     <result name="showpng" type="stream">  
  12.         <param name="contentType">image/png</param>  
  13.         <param name="inputName">pngStream</param>  
  14.         <!--   
  15.         <param name="contentDisposition">attachment;filename="document.pdf"</param>  
  16.         <param name="bufferSize">1024</param>  
  17.          -->  
  18.     </result>  
  19. </action>  

 

3.    流程实例管理

3.1   查看正在运行的流程实例


第一步:创建ProcessInstanceAction,提供list方法,查询流程实例列表数据

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Controller  
  2. @Scope("prototype")  
  3. public class ProcessInstanceAction extends ActionSupport {  
  4.     @Autowired  
  5.     private ProcessEngine processEngine;  
  6.   
  7.     /** 
  8.      * 查询正在运行的流程实例数据 
  9.      */  
  10.     public String list() {  
  11.         // 流程实例查询对象,查询表act_ru_execution  
  12.         ProcessInstanceQuery query = processEngine.getRuntimeService()  
  13.                 .createProcessInstanceQuery();  
  14.         query.orderByProcessDefinitionKey().desc();  
  15.         List<ProcessInstance> list = query.list();  
  16.         ActionContext.getContext().getValueStack().set("list", list);  
  17.         return "list";  
  18.     }  

 

第二步:配置struts.xml 

第三步:提供processinstance_list.jsp页面,展示列表数据

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <body class="easyui-layout">  
  2.    <div region="center">  
  3.       <table id="grid" class="easyui-datagrid">  
  4.         <thead>  
  5.             <tr>  
  6.                 <th data-options="field:'id'" width="60">实例编号</th>  
  7.                 <th data-options="field:'name'" width="150">流程定义编号</th>  
  8.                 <th data-options="field:'activity'" width="150">运行到哪个任务</th>  
  9.                 <th data-options="field:'viewRuntime'" width="500">业务数据</th>  
  10.                 <th data-options="field:'viewpng'" width="200">查看流程图</th>  
  11.             </tr>  
  12.         </thead>  
  13.         <tbody>  
  14.             <s:iterator value="list">  
  15.                 <tr>  
  16.                     <td>${id }</td>  
  17.                     <td>${processDefinitionId }</td>  
  18.                     <td>${activityId }</td>  
  19.                     <td>  
  20.                         <div id="div${id }"></div>  
  21.                         <script type="text/javascript">  
  22.                             //根据流程实例id查询流程变量  
  23.                             $.post("${pageContext.request.contextPath}/processInstanceAction_findData.action",{"id":'${id}'},function(data){  
  24.                                 $("#div${id}").html(data);  
  25.                             });  
  26.                         </script>  
  27.                     </td>  
  28.                     <td>  
  29.                         <script type="text/javascript">  
  30.                             function showPng(id){  
  31.                                 window.showModalDialog("processInstanceAction_showPng.action?id="+id);  
  32.                             }  
  33.                         </script>  
  34.                         <a data-options="iconCls:'icon-search'" class="easyui-linkbutton"   
  35.                         onclick="showPng('${id}');" href="#">查看流程图</a>  
  36.                     </td>  
  37.                 </tr>  
  38.             </s:iterator>  
  39.         </tbody>  
  40.       </table>  
  41.    </div>  
  42. </body>  

 

第四步:在Action中提供findData方法,根据流程实例ID查询对应的流程变量

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 接收流程实例ID  
  2. private String id;  
  3. public void setId(String id) {  
  4.     this.id = id;  
  5. }  
  6. /** 
  7.  * 根据流程实例ID查询流程变量 
  8.  *  
  9.  * @throws IOException 
  10.  */  
  11. public String findData() throws IOException {  
  12.     Map<String, Object> variables = processEngine.getRuntimeService()  
  13.             .getVariables(id);  
  14.     ServletActionContext.getResponse().setContentType(  
  15.             "text/html;charset=UTF-8");  
  16.     ServletActionContext.getResponse().getWriter().print(variables);  
  17.     return NONE;  
  18. }  

3.2   查询流程实例运行状态(图片显示)


第一步:在流程实例列表页面,修改链接按钮的地址

 效果


 

第二步:在Action中提供showPng方法,查询部署ID,图片名称,任务坐标

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 流程任务获取图片数据 
  3.  *  
  4.  * @return 
  5.  */  
  6. public String showPng() {  
  7.     // 通过流程实例获取流程定义id  
  8.     ProcessInstance processInstance = processEngine.getRuntimeService()  
  9.             .createProcessInstanceQuery().processInstanceId(id)  
  10.             .singleResult();  
  11.     String processDefinitionId = processInstance.getProcessDefinitionId();  
  12.     // 通过流程定义id获取流程定义对象,然后获取部署id和图片名称  
  13.     ProcessDefinition processDefinition = processEngine  
  14.             .getRepositoryService().createProcessDefinitionQuery()  
  15.             .processDefinitionId(processDefinitionId).singleResult();  
  16.     String deploymentId = processDefinition.getDeploymentId();  
  17.     String imageName = processDefinition.getDiagramResourceName();  
  18.     // 通过流程定义id获取详细(包含坐标)的流程定义对象  
  19.     ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processEngine  
  20.             .getRepositoryService().getProcessDefinition(  
  21.                     processDefinitionId);  
  22.     String activityId = processInstance.getActivityId();  
  23.     //通过活动id获取活动(当前任务)对象  
  24.     ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);  
  25.     //获取图片参数  
  26.     int x = activityImpl.getX();  
  27.     int y = activityImpl.getY();  
  28.     int height = activityImpl.getHeight();  
  29.     int width = activityImpl.getWidth();  
  30.     //把所有参数都放到值栈  
  31.     Map<String,Object> map=new HashMap<String, Object>();  
  32.     map.put("deploymentId", deploymentId);  
  33.     map.put("imageName", imageName);  
  34.     map.put("x", x);  
  35.     map.put("y", y);  
  36.     map.put("height", height);  
  37.     map.put("width", width);  
  38.     ActionContext.getContext().getValueStack().push(map);  
  39.     return "image";  
  40. }  

提取工具类:ActivitiUtils

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class ActivitiUtils {  
  2.     public static Map<String, Object> findDataByInstanceId(  
  3.             ProcessEngine processEngine, String id) {  
  4.         // 查询部署ID、png图片名称、当前流程任务的坐标  
  5.         ProcessInstanceQuery query = processEngine.getRuntimeService()  
  6.                 .createProcessInstanceQuery();  
  7.         // 根据流程实例ID查询流程实例对象  
  8.         query.processInstanceId(id);  
  9.         ProcessInstance processInstance = query.singleResult();  
  10.   
  11.         // 根据流程实例对象查询流程定义ID  
  12.         String processDefinitionId = processInstance.getProcessDefinitionId();  
  13.         // 根据流程定义ID查询流程定义对象  
  14.         ProcessDefinitionQuery query2 = processEngine.getRepositoryService()  
  15.                 .createProcessDefinitionQuery();  
  16.         query2.processDefinitionId(processDefinitionId);  
  17.         ProcessDefinition processDefinition = query2.singleResult();  
  18.   
  19.         // 获得当前流程实例执行到那个任务了  
  20.         String activityId = processInstance.getActivityId();// usertask2  
  21.   
  22.         // 根据流程定义ID查询流程定义对象(包含有坐标信息)  
  23.         ProcessDefinitionEntity processDefinition2 = (ProcessDefinitionEntity) processEngine  
  24.                 .getRepositoryService().getProcessDefinition(  
  25.                         processDefinitionId);  
  26.         ActivityImpl activityImpl = processDefinition2.findActivity(activityId);  
  27.         int x = activityImpl.getX();  
  28.         int y = activityImpl.getY();  
  29.         int width = activityImpl.getWidth();  
  30.         int height = activityImpl.getHeight();  
  31.           
  32.         Map<String, Object> map = new HashMap<String, Object>();  
  33.         map.put("deploymentId", processDefinition.getDeploymentId());  
  34.         map.put("imageName", processDefinition.getDiagramResourceName());  
  35.         map.put("x", x);  
  36.         map.put("y", y);  
  37.         map.put("width", width);  
  38.         map.put("height", height);  
  39.         return map;  
  40.     }  
  41. }  

第三步:配置struts.xml

第四步:提供image.jsp页面,展示图片和div

 

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2. <!-- 1.获取到规则流程图 -->  
  3. <img style="position: absolute;top: 0px;left: 0px;"  
  4.      src="processInstanceAction_viewImage?deploymentId=${deploymentId }&imageName=${imageName}">  
  5.   
  6. <!-- 2.根据当前活动的坐标,动态绘制DIV -->  
  7. <div style="position: absolute;border:1px solid red;  
  8.     top:${y-1}px;left:${x-1}px;width:${width}px;height:${height}px;">  
  9. </div>  
  10. </body>  

第五步:在Action中提供viewImage方法,查询png图片的输入流

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收图片src传递过来的参数  
  2. String deploymentId;  
  3. String imageName;  
  4.   
  5. public void setDeploymentId(String deploymentId) {  
  6.     this.deploymentId = deploymentId;  
  7. }  
  8.   
  9. public void setImageName(String imageName) {  
  10.     this.imageName = imageName;  
  11. }  
  12.   
  13. /** 
  14.  * 查询png图片的输入流,展示图片 
  15.  */  
  16. public String viewImage() {  
  17.     InputStream pngStream = processEngine.getRepositoryService()  
  18.             .getResourceAsStream(deploymentId, imageName);  
  19.     ActionContext.getContext().getValueStack().set("pngStream", pngStream);  
  20.     return "viewImage";  
  21. }  

 

第六步:配置struts.xml,使用文件下载

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 流程实例管理Action -->  
  2. <action name="processInstanceAction_*" class="processInstanceAction" method="{1}">  
  3.     <result name="list">/WEB-INF/pages/workflow/processinstance_list.jsp</result>  
  4.     <result name="showPng">//WEB-INF/pages/workflow/image.jsp</result>  
  5.     <result name="viewImage" type="stream">  
  6.         <param name="contentType">image/png</param>  
  7.         <param name="inputName">pngStream</param>  
  8.     </result>  
  9. </action>  

 

 

4.    将bos系统中的用户和组同步到activiti中


    同步用户

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //添加用户,同步到activiti的act_id_user  act_id_mebership  
  2. public void save(User user, String[] roleIds) {  
  3.     String password = user.getPassword();  
  4.     //使用md5加密  
  5.     password = MD5Utils.md5(password);  
  6.     user.setPassword(password);  
  7.     userDao.save(user);//持久对象  
  8.     //添加activiti UserEntity  
  9.     org.activiti.engine.identity.User actUser = new UserEntity();  
  10.     actUser.setId(user.getId());  
  11.     processEngine.getIdentityService().saveUser(actUser);//操作act_id_user  
  12.     for (String id : roleIds) {  
  13.         Role role = roleDao.findById(id);  
  14.         //用户关联角色   
  15.         user.getRoles().add(role);  
  16.         //将ac用户加入到ac组中 role.getName()使用角色名字做为组ID方便阅读  
  17.         processEngine.getIdentityService().createMembership(actUser.getId(), role.getName());  
  18.     }  
  19. }  

    同步组

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //保存角色,同步到activiti的act_id_group  
  2. public void save(Role model, String funcitonIds) {  
  3.     roleDao.save(model);//持久对象  
  4.     //创建ac组并添加  
  5.     Group group = new GroupEntity();  
  6.     group.setId(model.getName());  
  7.     group.setName(model.getName());  
  8.     processEngine.getIdentityService().saveGroup(group );  
  9.     String[] ids = funcitonIds.split(",");  
  10.     for (String id : ids) {  
  11.         Function function = new Function();  
  12.         function.setId(id);  
  13.         model.getFunctions().add(function);//角色关联权限  
  14.     }  
  15. }  

猜你喜欢

转载自blog.csdn.net/sdjadycsdn/article/details/79935073